diff --git a/.deadcode-out b/.deadcode-out index e366abee94..f6a194b17f 100644 --- a/.deadcode-out +++ b/.deadcode-out @@ -1,7 +1,7 @@ -forgejo.org/cmd +code.gitea.io/gitea/cmd NoMainListener -forgejo.org/cmd/forgejo +code.gitea.io/gitea/cmd/forgejo ContextSetNoInit ContextSetNoExit ContextSetStderr @@ -9,152 +9,204 @@ forgejo.org/cmd/forgejo ContextSetStdout ContextSetStdin -forgejo.org/models +code.gitea.io/gitea/models + IsErrUpdateTaskNotExist + ErrUpdateTaskNotExist.Error + ErrUpdateTaskNotExist.Unwrap IsErrSHANotFound IsErrMergeDivergingFastForwardOnly + GetYamlFixturesAccess -forgejo.org/models/auth +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 WebAuthnCredentials -forgejo.org/models/db +code.gitea.io/gitea/models/db TruncateBeans InTransaction DumpTables -forgejo.org/models/dbfs +code.gitea.io/gitea/models/dbfs file.renameTo Create Rename -forgejo.org/models/forgefed +code.gitea.io/gitea/models/forgefed GetFederationHost -forgejo.org/models/forgejo/semver +code.gitea.io/gitea/models/forgejo/semver GetVersion SetVersionString SetVersion -forgejo.org/models/git +code.gitea.io/gitea/models/git RemoveDeletedBranchByID -forgejo.org/models/issues +code.gitea.io/gitea/models/issues IsErrUnknownDependencyType + ErrNewIssueInsert.Error IsErrIssueWasClosed + ChangeMilestoneStatus -forgejo.org/models/organization +code.gitea.io/gitea/models/organization + GetTeamNamesByID + UpdateTeamUnits SearchMembersOptions.ToConds + UsersInTeamsCount -forgejo.org/models/perm/access +code.gitea.io/gitea/models/perm/access GetRepoWriters -forgejo.org/models/repo +code.gitea.io/gitea/models/project + UpdateColumnSorting + ChangeProjectStatus + +code.gitea.io/gitea/models/repo + DeleteAttachmentsByIssue + FindReposMapByIDs + IsErrTopicNotExist + ErrTopicNotExist.Error + ErrTopicNotExist.Unwrap + GetTopicByName WatchRepoMode -forgejo.org/models/user +code.gitea.io/gitea/models/user + ErrUserInactive.Error + ErrUserInactive.Unwrap IsErrExternalLoginUserAlreadyExist IsErrExternalLoginUserNotExist NewFederatedUser IsErrUserSettingIsNotExist GetUserAllSettings DeleteUserSetting + GetUserEmailsByNames + GetUserNamesByIDs -forgejo.org/modules/activitypub +code.gitea.io/gitea/modules/activitypub NewContext Context.APClientFactory -forgejo.org/modules/assetfs +code.gitea.io/gitea/modules/assetfs Bindata -forgejo.org/modules/auth/password/hash +code.gitea.io/gitea/modules/auth/password/hash DummyHasher.HashWithSaltBytes NewDummyHasher -forgejo.org/modules/auth/password/pwn +code.gitea.io/gitea/modules/auth/password/pwn WithHTTP -forgejo.org/modules/base +code.gitea.io/gitea/modules/base SetupGiteaRoot -forgejo.org/modules/cache +code.gitea.io/gitea/modules/cache GetInt WithNoCacheContext RemoveContextData -forgejo.org/modules/emoji +code.gitea.io/gitea/modules/charset + BreakWriter.Write + +code.gitea.io/gitea/modules/emoji ReplaceCodes -forgejo.org/modules/eventsource +code.gitea.io/gitea/modules/eventsource Event.String -forgejo.org/modules/forgefed - NewForgeUndoLike - ForgeUndoLike.UnmarshalJSON - ForgeUndoLike.Validate +code.gitea.io/gitea/modules/forgefed GetItemByType JSONUnmarshalerFn NotEmpty ToRepository OnRepository -forgejo.org/modules/git +code.gitea.io/gitea/modules/git AllowLFSFiltersArgs AddChanges AddChangesWithArgs CommitChanges CommitChangesWithArgs + IsErrExecTimeout + ErrExecTimeout.Error + ErrUnsupportedVersion.Error SetUpdateHook openRepositoryWithDefaultContext + IsTagExist ToEntryMode + LimitedReaderCloser.Read + LimitedReaderCloser.Close -forgejo.org/modules/gitrepo +code.gitea.io/gitea/modules/gitgraph + Parser.Reset + +code.gitea.io/gitea/modules/gitrepo GetBranchCommitID GetWikiDefaultBranch -forgejo.org/modules/graceful +code.gitea.io/gitea/modules/graceful Manager.TerminateContext Manager.Err Manager.Value Manager.Deadline -forgejo.org/modules/hcaptcha +code.gitea.io/gitea/modules/hcaptcha WithHTTP -forgejo.org/modules/hostmatcher +code.gitea.io/gitea/modules/hostmatcher HostMatchList.AppendPattern -forgejo.org/modules/json +code.gitea.io/gitea/modules/json StdJSON.Marshal StdJSON.Unmarshal StdJSON.NewEncoder StdJSON.NewDecoder StdJSON.Indent -forgejo.org/modules/log - NewEventWriterBuffer - -forgejo.org/modules/markup +code.gitea.io/gitea/modules/markup GetRendererByType RenderString IsMarkupFile -forgejo.org/modules/markup/console +code.gitea.io/gitea/modules/markup/console Render RenderString -forgejo.org/modules/markup/markdown +code.gitea.io/gitea/modules/markup/markdown + IsDetails + IsSummary + IsTaskCheckBoxListItem + IsIcon RenderRawString -forgejo.org/modules/markup/mdstripper +code.gitea.io/gitea/modules/markup/markdown/math + WithInlineDollarParser + WithBlockDollarParser + +code.gitea.io/gitea/modules/markup/mdstripper stripRenderer.AddOptions StripMarkdown -forgejo.org/modules/markup/orgmode +code.gitea.io/gitea/modules/markup/orgmode RenderString -forgejo.org/modules/process +code.gitea.io/gitea/modules/private + ActionsRunnerRegister + +code.gitea.io/gitea/modules/process Manager.ExecTimeout -forgejo.org/modules/queue +code.gitea.io/gitea/modules/queue newBaseChannelSimple newBaseChannelUnique newBaseRedisSimple @@ -163,71 +215,89 @@ forgejo.org/modules/queue testStateRecorder.Reset newWorkerPoolQueueForTest -forgejo.org/modules/queue/lqinternal +code.gitea.io/gitea/modules/queue/lqinternal QueueItemIDBytes QueueItemKeyBytes ListLevelQueueKeys -forgejo.org/modules/setting +code.gitea.io/gitea/modules/setting NewConfigProviderFromData GitConfigType.GetOption InitLoggersForTest -forgejo.org/modules/sync +code.gitea.io/gitea/modules/storage + ErrInvalidConfiguration.Error + IsErrInvalidConfiguration + +code.gitea.io/gitea/modules/structs + ParseCreateHook + ParsePushHook + +code.gitea.io/gitea/modules/sync StatusTable.Start StatusTable.IsRunning -forgejo.org/modules/timeutil +code.gitea.io/gitea/modules/timeutil GetExecutableModTime MockSet MockUnset -forgejo.org/modules/translation +code.gitea.io/gitea/modules/translation MockLocale.Language MockLocale.TrString MockLocale.Tr MockLocale.TrN - MockLocale.TrPluralString MockLocale.TrSize - MockLocale.HasKey MockLocale.PrettyNumber -forgejo.org/modules/util - OptionalArg - -forgejo.org/modules/util/filebuffer +code.gitea.io/gitea/modules/util/filebuffer CreateFromReader -forgejo.org/modules/validation +code.gitea.io/gitea/modules/validation IsErrNotValid -forgejo.org/modules/web +code.gitea.io/gitea/modules/web RouteMock RouteMockReset -forgejo.org/modules/zstd +code.gitea.io/gitea/modules/web/middleware + DeleteLocaleCookie + +code.gitea.io/gitea/modules/zstd NewWriter Writer.Write Writer.Close -forgejo.org/routers/web +code.gitea.io/gitea/routers/web NotFound -forgejo.org/routers/web/org +code.gitea.io/gitea/routers/web/org MustEnableProjects -forgejo.org/services/context +code.gitea.io/gitea/services/context GetPrivateContext -forgejo.org/services/repository +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 IsErrForkAlreadyExist -forgejo.org/services/repository/files +code.gitea.io/gitea/services/repository/archiver + ArchiveRepository + +code.gitea.io/gitea/services/repository/files ContentType.String + GetFileResponseFromCommit + TemporaryUploadRepository.GetLastCommit + TemporaryUploadRepository.GetLastCommitByRef -forgejo.org/services/repository/gitgraph - Parser.Reset - -forgejo.org/services/webhook +code.gitea.io/gitea/services/webhook NewNotifier diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f3d30963c7..da649017ae 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,12 +1,12 @@ { "name": "Gitea DevContainer", - "image": "mcr.microsoft.com/devcontainers/go:1.24-bullseye", + "image": "mcr.microsoft.com/devcontainers/go:1.23-bullseye", "features": { // installs nodejs into container "ghcr.io/devcontainers/features/node:1": { "version": "20" }, - "ghcr.io/devcontainers/features/git-lfs:1.2.3": {}, + "ghcr.io/devcontainers/features/git-lfs:1.2.1": {}, "ghcr.io/devcontainers-contrib/features/poetry:2": {}, "ghcr.io/devcontainers/features/python:1": { "version": "3.12" diff --git a/.dockerignore b/.dockerignore index 5e7a893014..a1611a1ca5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -34,7 +34,6 @@ _testmain.go *coverage.out coverage.all -coverage/ cpu.out /modules/migration/bindata.go diff --git a/.editorconfig b/.editorconfig index a547e8a585..8e2234e64b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,8 +26,3 @@ 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.example b/.envrc similarity index 100% rename from .envrc.example rename to .envrc diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 0000000000..db85b143dd --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1,803 @@ +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 f2ea8d945a..0e3caf9280 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 (See https://forgejo.org/.well-known/security.txt)." + about: "Please email (GPG: `A4676E79`) instead of opening a public issue." - 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 d10564359e..4ef67d34e0 100644 --- a/.forgejo/testdata/build-release/Dockerfile +++ b/.forgejo/testdata/build-release/Dockerfile @@ -1,4 +1,4 @@ -FROM data.forgejo.org/oci/alpine:3.21 +FROM code.forgejo.org/oci/alpine:3.20 ARG RELEASE_VERSION=unkown LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.version="${RELEASE_VERSION}" diff --git a/.forgejo/testdata/build-release/go.mod b/.forgejo/testdata/build-release/go.mod index 585dcc4f3d..1c442048b6 100644 --- a/.forgejo/testdata/build-release/go.mod +++ b/.forgejo/testdata/build-release/go.mod @@ -1,3 +1,3 @@ -module forgejo.org +module code.gitea.io/gitea -go 1.23.3 +go 1.23.2 diff --git a/.forgejo/workflows-composite/apt-install-from/action.yaml b/.forgejo/workflows-composite/apt-install-from/action.yaml deleted file mode 100644 index ab55883a11..0000000000 --- a/.forgejo/workflows-composite/apt-install-from/action.yaml +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 68a99ffaf9..0000000000 --- a/.forgejo/workflows-composite/build-backend/action.yaml +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index f2818a7635..0000000000 --- a/.forgejo/workflows-composite/setup-cache-go/action.yaml +++ /dev/null @@ -1,61 +0,0 @@ -# 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 deleted file mode 100644 index f19569a137..0000000000 --- a/.forgejo/workflows-composite/setup-env/action.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# 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 31c5c0cc3a..fca01a1acb 100644 --- a/.forgejo/workflows/backport.yml +++ b/.forgejo/workflows/backport.yml @@ -22,8 +22,6 @@ # `backport/v1.21` label on a merged pull request that can be backported # without conflict. # -name: issue-labels - on: pull_request_target: types: @@ -40,14 +38,14 @@ jobs: ) runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - name: event info run: | cat <<'EOF' ${{ toJSON(github) }} EOF - - uses: https://data.forgejo.org/actions/git-backporting@v4.8.4 + - uses: https://code.forgejo.org/actions/git-backporting@v4.8.0 with: target-branch-pattern: "^backport/(?(v.*))$" strategy: ort diff --git a/.forgejo/workflows/build-release-integration.yml b/.forgejo/workflows/build-release-integration.yml index 1af6d567dd..d10f40f7c7 100644 --- a/.forgejo/workflows/build-release-integration.yml +++ b/.forgejo/workflows/build-release-integration.yml @@ -23,12 +23,12 @@ on: jobs: release-simulation: if: vars.ROLE == 'forgejo-coding' - runs-on: lxc-bookworm + runs-on: self-hosted steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: actions/checkout@v4 - id: forgejo - uses: https://data.forgejo.org/actions/setup-forgejo@v2.0.4 + uses: https://code.forgejo.org/actions/setup-forgejo@v1 with: user: root password: admin1234 diff --git a/.forgejo/workflows/build-release.yml b/.forgejo/workflows/build-release.yml index a34f3533fd..bc74de8248 100644 --- a/.forgejo/workflows/build-release.yml +++ b/.forgejo/workflows/build-release.yml @@ -14,12 +14,6 @@ # 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]+.*' @@ -29,11 +23,11 @@ on: jobs: release: - runs-on: lxc-bookworm + runs-on: self-hosted # root is used for testing, allow it if: vars.ROLE == 'forgejo-integration' || github.repository_owner == 'root' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -43,11 +37,11 @@ jobs: repository="${{ github.repository }}" echo "value=${repository##*/}" >> "$GITHUB_OUTPUT" - - uses: https://data.forgejo.org/actions/setup-node@v4 + - uses: https://code.forgejo.org/actions/setup-node@v4 with: - node-version: 22 + node-version: 20 - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: go-version-file: "go.mod" @@ -93,7 +87,7 @@ jobs: - name: cache node_modules id: node - uses: https://data.forgejo.org/actions/cache@v4 + uses: https://code.forgejo.org/actions/cache@v4 with: path: | node_modules @@ -164,7 +158,7 @@ jobs: - name: build container & release if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 + uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -183,7 +177,7 @@ jobs: - name: build rootless container if: ${{ secrets.TOKEN != '' }} - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/build@v5.3.4 + uses: https://code.forgejo.org/forgejo/forgejo-build-publish/build@v5.1.1 with: forgejo: "${{ env.GITHUB_SERVER_URL }}" owner: "${{ env.GITHUB_REPOSITORY_OWNER }}" @@ -201,7 +195,7 @@ jobs: - name: end-to-end tests if: ${{ secrets.TOKEN != '' && vars.ROLE == 'forgejo-integration' && vars.SKIP_END_TO_END != 'true' }} - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 + uses: https://code.forgejo.org/actions/cascading-pr@v2 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/cascade-setup-end-to-end.yml b/.forgejo/workflows/cascade-setup-end-to-end.yml index 7c8c56de13..f6f94980d1 100644 --- a/.forgejo/workflows/cascade-setup-end-to-end.yml +++ b/.forgejo/workflows/cascade-setup-end-to-end.yml @@ -12,10 +12,8 @@ # 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 do) +# run-end-to-end-test on a pull request (any pull request will doe # -name: issue-labels - on: push: branches: @@ -25,23 +23,42 @@ on: - labeled jobs: + info: + if: vars.ROLE == 'forgejo-coding' + 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: > vars.ROLE == 'forgejo-coding' && ( github.event_name == 'push' || ( - github.event.action == 'label_updated' && github.event.label.name == 'run-end-to-end-tests' + github.event.action == 'label_updated' && contains(github.event.pull_request.labels.*.name, 'run-end-to-end-tests') ) ) runs-on: docker container: - image: data.forgejo.org/oci/node:22-bookworm + image: code.forgejo.org/oci/node:20-bookworm steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: '0' show-progress: 'false' - - uses: https://data.forgejo.org/actions/cascading-pr@v2.2.0 + - uses: actions/cascading-pr@v2 with: origin-url: ${{ env.GITHUB_SERVER_URL }} origin-repo: ${{ github.repository }} diff --git a/.forgejo/workflows/e2e.yml b/.forgejo/workflows/e2e.yml new file mode 100644 index 0000000000..5e6348f54c --- /dev/null +++ b/.forgejo/workflows/e2e.yml @@ -0,0 +1,37 @@ +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: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' + 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 d490e3b2f2..049679a1eb 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: 'data.forgejo.org/oci/node:22-bookworm' + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - name: apt install curl jq diff --git a/.forgejo/workflows/merge-requirements.yml b/.forgejo/workflows/merge-requirements.yml deleted file mode 100644 index b052f18c06..0000000000 --- a/.forgejo/workflows/merge-requirements.yml +++ /dev/null @@ -1,45 +0,0 @@ -# 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 index 9a51c515d0..56bd7ba28d 100644 --- a/.forgejo/workflows/milestone.yml +++ b/.forgejo/workflows/milestone.yml @@ -13,9 +13,9 @@ jobs: if: vars.ROLE == 'forgejo-coding' && github.event.pull_request.merged runs-on: docker container: - image: 'data.forgejo.org/oci/ci:1' + image: 'code.forgejo.org/oci/ci:1' steps: - - uses: https://data.forgejo.org/forgejo/set-milestone@v1.0.0 + - uses: https://code.forgejo.org/forgejo/set-milestone@v1.0.0 with: forgejo: https://codeberg.org repository: forgejo/forgejo diff --git a/.forgejo/workflows/mirror.yml b/.forgejo/workflows/mirror.yml index d45a2f6f77..fd222115ac 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: 'data.forgejo.org/oci/node:22-bookworm' + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - name: git push {v*/,}forgejo run: | diff --git a/.forgejo/workflows/publish-release.yml b/.forgejo/workflows/publish-release.yml index 27d3b9383e..137af41e93 100644 --- a/.forgejo/workflows/publish-release.yml +++ b/.forgejo/workflows/publish-release.yml @@ -2,8 +2,6 @@ # # 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 @@ -16,7 +14,7 @@ # vars.DOER: forgejo-experimental-ci # secrets.TOKEN: # -# http://invisible.forgejo.org/forgejo/forgejo +# http://private.forgejo.org/forgejo/forgejo # # Copies & sign a release from codeberg.org/forgejo-integration to codeberg.org/forgejo # @@ -38,20 +36,20 @@ on: jobs: publish: - runs-on: lxc-bookworm + runs-on: self-hosted if: vars.DOER != '' && vars.FORGEJO != '' && vars.TO_OWNER != '' && vars.FROM_OWNER != '' && secrets.TOKEN != '' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: actions/checkout@v4 - name: copy & sign - uses: https://data.forgejo.org/forgejo/forgejo-build-publish/publish@v5.3.4 + uses: https://code.forgejo.org/forgejo/forgejo-build-publish/publish@v5 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-published/{VERSION}.md" + release-notes: "See https://codeberg.org/forgejo/forgejo/src/branch/forgejo/RELEASE-NOTES.md#{ANCHOR}" ref-name: ${{ github.ref_name }} sha: ${{ github.sha }} from-token: ${{ secrets.TOKEN }} @@ -63,14 +61,14 @@ jobs: - name: get trigger mirror issue id: mirror - uses: https://data.forgejo.org/infrastructure/issue-action/get@v1.3.0 + uses: https://code.forgejo.org/infrastructure/issue-action/get@v1.1.0 with: forgejo: https://code.forgejo.org repository: forgejo/forgejo labels: mirror-trigger - name: trigger the mirror - uses: https://data.forgejo.org/infrastructure/issue-action/set@v1.3.0 + uses: https://code.forgejo.org/infrastructure/issue-action/set@v1.1.0 with: forgejo: https://code.forgejo.org repository: forgejo/forgejo @@ -80,9 +78,9 @@ jobs: label: trigger - name: upgrade v*.next.forgejo.org - uses: https://data.forgejo.org/infrastructure/next-digest@v1.1.0 + uses: https://code.forgejo.org/infrastructure/next-digest@v1.1.0 with: - url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@invisible.forgejo.org/infrastructure/next-digest + url: https://placeholder:${{ secrets.TOKEN_NEXT_DIGEST }}@code.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 db33d30afb..c0bfa1ecf3 100644 --- a/.forgejo/workflows/release-notes-assistant-milestones.yml +++ b/.forgejo/workflows/release-notes-assistant-milestones.yml @@ -9,11 +9,11 @@ jobs: if: vars.ROLE == 'forgejo-coding' runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/checkout@v4 - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://code.forgejo.org/actions/setup-go@v4 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 92edd912ec..7c5ea51c17 100644 --- a/.forgejo/workflows/release-notes-assistant.yml +++ b/.forgejo/workflows/release-notes-assistant.yml @@ -1,5 +1,3 @@ -name: issue-labels - on: pull_request_target: types: @@ -12,9 +10,9 @@ jobs: if: ( vars.ROLE == 'forgejo-coding' ) && contains(github.event.pull_request.labels.*.name, 'worth a release-note') runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/checkout@v4 - name: event run: | @@ -25,7 +23,7 @@ jobs: ${{ toJSON(github.event) }} EOF - - uses: https://data.forgejo.org/actions/setup-go@v5 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: go-version-file: "go.mod" cache: false diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index dbba9a82bb..dc69e1701b 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -18,9 +18,6 @@ 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: @@ -28,11 +25,11 @@ jobs: runs-on: docker container: - image: data.forgejo.org/renovate/renovate:39.212.0 + image: code.forgejo.org/forgejo-contrib/renovate:38.93.2 steps: - name: Load renovate repo cache - uses: https://data.forgejo.org/actions/cache/restore@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + uses: https://code.forgejo.org/actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .tmp/cache/renovate/repository @@ -65,7 +62,7 @@ jobs: - name: Save renovate repo cache if: always() && env.RENOVATE_DRY_RUN != 'full' - uses: https://data.forgejo.org/actions/cache/save@3624ceb22c1c5a301c8db4169662070a689d9ea8 # v4.1.1 + uses: https://code.forgejo.org/actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | .tmp/cache/renovate/repository diff --git a/.forgejo/workflows/testing.yml b/.forgejo/workflows/testing.yml index 713dfebf63..6236e456fc 100644 --- a/.forgejo/workflows/testing.yml +++ b/.forgejo/workflows/testing.yml @@ -6,169 +6,158 @@ on: branches: - 'forgejo*' - 'v*/forgejo*' - workflow_dispatch: jobs: backend-checks: runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - name: event info run: | cat <<'EOF' ${{ toJSON(github) }} EOF - - 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 + - uses: https://code.forgejo.org/actions/checkout@v4 + - 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 }} frontend-checks: runs-on: docker container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 + - uses: https://code.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: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' services: elasticsearch: - image: data.forgejo.org/oci/bitnami/elasticsearch:7 - options: --tmpfs /bitnami/elasticsearch/data + image: docker.io/bitnami/elasticsearch:7 env: discovery.type: single-node ES_JAVA_OPTS: "-Xms512m -Xmx512m" minio: - image: data.forgejo.org/oci/bitnami/minio:2024.8.17 + image: docker.io/bitnami/minio:2024.8.17 options: >- - --hostname gitea.minio --tmpfs /bitnami/minio/data:noatime + --hostname gitea.minio env: MINIO_DOMAIN: minio MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 steps: - - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: ./.forgejo/workflows-composite/setup-env - - name: install git >= 2.42 - uses: ./.forgejo/workflows-composite/apt-install-from + - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: - packages: git + go-version-file: "go.mod" + - run: | + git config --add safe.directory '*' + adduser --quiet --comment forgejo --disabled-password forgejo + chown -R forgejo:forgejo . + - 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 - name: test release-notes-assistant.sh run: | apt-get -q install -qq -y jq ./release-notes-assistant.sh test_main - - uses: ./.forgejo/workflows-composite/build-backend + - 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 - run: | su forgejo -c 'make test-backend test-check' - timeout-minutes: 120 + timeout-minutes: 50 env: RACE_ENABLED: 'true' TAGS: bindata TEST_ELASTICSEARCH_URL: http://elasticsearch:9200 - test-e2e: - if: vars.ROLE == 'forgejo-coding' || vars.ROLE == 'forgejo-testing' + test-remote-cacher: runs-on: docker needs: [backend-checks, frontend-checks] container: - 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) }} + image: 'code.forgejo.org/oci/node:20-bookworm' strategy: matrix: cacher: - - 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 + # 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 services: cacher: image: ${{ matrix.cacher.image }} options: ${{ matrix.cacher.options }} steps: - - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: ./.forgejo/workflows-composite/setup-env - - name: install git >= 2.42 - uses: ./.forgejo/workflows-composite/apt-install-from + - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: - packages: git - - uses: ./.forgejo/workflows-composite/build-backend + go-version-file: "go.mod" + - run: | + git config --add safe.directory '*' + adduser --quiet --comment forgejo --disabled-password forgejo + chown -R forgejo:forgejo . + - 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 + 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 - run: | su forgejo -c 'make test-remote-cacher test-check' - timeout-minutes: 120 + timeout-minutes: 50 env: RACE_ENABLED: 'true' TAGS: bindata @@ -177,27 +166,57 @@ jobs: runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' services: mysql: - image: 'data.forgejo.org/oci/bitnami/mysql:8.4' + image: 'docker.io/bitnami/mysql:8.4' env: ALLOW_EMPTY_PASSWORD: yes MYSQL_DATABASE: testgitea # # See also https://codeberg.org/forgejo/forgejo/issues/976 # - MYSQL_EXTRA_FLAGS: --innodb-adaptive-flushing=OFF --innodb-buffer-pool-size=4G --innodb-log-buffer-size=128M --innodb-flush-log-at-trx-commit=0 --innodb-flush-log-at-timeout=30 --innodb-flush-method=nosync --innodb-fsync-threshold=1000000000 --disable-log-bin - options: --tmpfs /bitnami/mysql/data:noatime + 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 steps: - - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: ./.forgejo/workflows-composite/setup-env - - name: install dependencies & git >= 2.42 - uses: ./.forgejo/workflows-composite/apt-install-from + - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: - packages: git git-annex-standalone git-lfs - - uses: ./.forgejo/workflows-composite/build-backend + go-version-file: "go.mod" + - 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 + cd / + wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + tar xzvf git-annex-standalone-amd64.tar.gz + ln -s \ + /git-annex.linux/git-annex \ + /git-annex.linux/git-annex-shell \ + /git-annex.linux/git-annex-webapp \ + /git-annex.linux/git-remote-annex \ + bin + cd - + - 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 + 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 - run: | su forgejo -c 'make test-mysql-migration test-mysql' env: @@ -206,33 +225,60 @@ jobs: runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' services: minio: - image: data.forgejo.org/oci/bitnami/minio:2024.8.17 + image: docker.io/bitnami/minio:2024.8.17 env: MINIO_ROOT_USER: 123456 MINIO_ROOT_PASSWORD: 12345678 - options: --tmpfs /bitnami/minio/data ldap: - image: data.forgejo.org/oci/test-openldap:latest + image: docker.io/gitea/test-openldap:latest pgsql: - image: data.forgejo.org/oci/bitnami/postgresql:16 + image: 'code.forgejo.org/oci/postgres:15' env: - POSTGRESQL_DATABASE: test - POSTGRESQL_PASSWORD: postgres - POSTGRESQL_FSYNC: off - POSTGRESQL_EXTRA_FLAGS: -c full_page_writes=off - options: --tmpfs /bitnami/postgresql + POSTGRES_DB: test + POSTGRES_PASSWORD: postgres steps: - - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: ./.forgejo/workflows-composite/setup-env - - name: install dependencies & git >= 2.42 - uses: ./.forgejo/workflows-composite/apt-install-from + - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: - packages: git git-annex-standalone git-lfs - - uses: ./.forgejo/workflows-composite/build-backend + go-version-file: "go.mod" + - 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 + cd / + wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + tar xzvf git-annex-standalone-amd64.tar.gz + ln -s \ + /git-annex.linux/git-annex \ + /git-annex.linux/git-annex-shell \ + /git-annex.linux/git-annex-webapp \ + /git-annex.linux/git-remote-annex \ + bin + cd - + - 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 + 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 - run: | su forgejo -c 'make test-pgsql-migration test-pgsql' env: @@ -243,16 +289,47 @@ jobs: runs-on: docker needs: [backend-checks, frontend-checks] container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - - uses: https://data.forgejo.org/actions/checkout@v4 - - uses: ./.forgejo/workflows-composite/setup-env - - name: install dependencies & git >= 2.42 - uses: ./.forgejo/workflows-composite/apt-install-from + - uses: https://code.forgejo.org/actions/checkout@v4 + - uses: https://code.forgejo.org/actions/setup-go@v4 with: - packages: git git-annex-standalone git-lfs - - uses: ./.forgejo/workflows-composite/build-backend + go-version-file: "go.mod" + - 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 + cd / + wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + tar xzvf git-annex-standalone-amd64.tar.gz + ln -s \ + /git-annex.linux/git-annex \ + /git-annex.linux/git-annex-shell \ + /git-annex.linux/git-annex-webapp \ + /git-annex.linux/git-remote-annex \ + bin + cd - + - 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 + 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 - run: | su forgejo -c 'make test-sqlite-migration test-sqlite' env: @@ -266,11 +343,14 @@ jobs: - test-sqlite - test-pgsql - test-mysql + - test-remote-cacher + - test-unit container: - image: 'data.forgejo.org/oci/node:22-bookworm' - options: --tmpfs /tmp:exec,noatime + image: 'code.forgejo.org/oci/node:20-bookworm' steps: - - 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' + - uses: https://code.forgejo.org/actions/checkout@v4 + - 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 diff --git a/.gitignore b/.gitignore index 744e24a09a..7f40d0ba55 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,6 @@ _testmain.go *coverage.out coverage.all -coverage/ cpu.out /modules/migration/bindata.go @@ -57,7 +56,6 @@ cpu.out /gitea-vet /debug /integrations.test -/forgejo /bin /dist @@ -74,7 +72,6 @@ cpu.out /tests/e2e/reports /tests/e2e/test-artifacts /tests/e2e/test-snapshots -/tests/e2e/.auth /tests/*.ini /tests/**/*.git/**/*.sample /node_modules @@ -118,9 +115,6 @@ prime/ *_source.tar.bz2 .DS_Store -# Direnv configuration -/.envrc - # nix-direnv generated files .direnv/ diff --git a/.golangci.yml b/.golangci.yml index 136c0e624a..4a20269b0e 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,8 +77,6 @@ linters-settings: - name: unreachable-code - name: var-declaration - name: var-naming - - name: redefines-builtin-id - disabled: true gofumpt: extra-rules: true depguard: @@ -93,7 +91,7 @@ linters-settings: desc: use os or io instead - pkg: golang.org/x/exp desc: it's experimental and unreliable - - pkg: forgejo.org/modules/git/internal + - pkg: code.gitea.io/gitea/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 b3e5a8e665..15c73f9b39 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: | - ## Release notes + ## Draft release notes comment: |
Where does that come from? diff --git a/CODEOWNERS b/CODEOWNERS index ff2a4b9fdd..d46efc052b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -16,9 +16,6 @@ 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 @@ -33,9 +30,8 @@ models/.* @gusted # for code that lives in here. routers/.* @gusted -# Let locale changes be checked by the translation team. -options/locale/.* @0ko -options/locale_next/.* @0ko +# Let new strings be checked by the translation team. +options/locale/locale_en-US.ini @0ko # Personal interest .*/webhook.* @oliverpool diff --git a/Dockerfile b/Dockerfile index 70c649679d..fbb447cc25 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx +FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx -FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.21 AS build-env +FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 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/forgejo.org -WORKDIR ${GOPATH}/src/forgejo.org +COPY . ${GOPATH}/src/code.gitea.io/gitea +WORKDIR ${GOPATH}/src/code.gitea.io/gitea 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/forgejo.org/gitea \ - /go/src/forgejo.org/environment-to-ini -RUN chmod 644 /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete + /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 -FROM data.forgejo.org/oci/alpine:3.21 +FROM code.forgejo.org/oci/alpine:3.20 ARG RELEASE_VERSION LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ @@ -99,11 +99,11 @@ ENV GITEA_CUSTOM=/data/gitea VOLUME ["/data"] ENTRYPOINT ["/usr/bin/entrypoint"] -CMD ["/usr/bin/s6-svscan", "/etc/s6"] +CMD ["/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/forgejo.org/gitea /app/gitea/gitea +COPY --from=build-env /go/src/code.gitea.io/gitea/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 +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 diff --git a/Dockerfile.rootless b/Dockerfile.rootless index a6819c6cd2..0edd33a85d 100644 --- a/Dockerfile.rootless +++ b/Dockerfile.rootless @@ -1,6 +1,6 @@ -FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/xx AS xx +FROM --platform=$BUILDPLATFORM docker.io/tonistiigi/xx AS xx -FROM --platform=$BUILDPLATFORM data.forgejo.org/oci/golang:1.24-alpine3.21 AS build-env +FROM --platform=$BUILDPLATFORM code.forgejo.org/oci/golang:1.23-alpine3.20 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/forgejo.org -WORKDIR ${GOPATH}/src/forgejo.org +COPY . ${GOPATH}/src/code.gitea.io/gitea +WORKDIR ${GOPATH}/src/code.gitea.io/gitea RUN make clean RUN make frontend @@ -45,12 +45,11 @@ 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/forgejo.org/gitea \ - /go/src/forgejo.org/environment-to-ini -RUN chmod 644 /go/src/forgejo.org/contrib/autocompletion/bash_autocomplete + /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 -FROM data.forgejo.org/oci/alpine:3.21 -ARG RELEASE_VERSION +FROM code.forgejo.org/oci/alpine:3.20 LABEL maintainer="contact@forgejo.org" \ org.opencontainers.image.authors="Forgejo" \ org.opencontainers.image.url="https://forgejo.org" \ @@ -72,7 +71,6 @@ RUN apk --no-cache add \ git \ curl \ gnupg \ - openssh-client \ git-annex \ && rm -rf /var/cache/apk/* @@ -92,10 +90,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/forgejo.org/gitea /app/gitea/gitea +COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/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 +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 #git:git USER 1000:1000 diff --git a/Makefile b/Makefile index b1272b640f..5cf50bbc20 100644 --- a/Makefile +++ b/Makefile @@ -16,51 +16,50 @@ else DIST := dist DIST_DIRS := $(DIST)/binaries $(DIST)/release -IMPORT := forgejo.org +IMPORT := code.gitea.io/gitea -GO ?= $(shell go env GOROOT)/bin/go +GO ?= 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.2.1 # renovate: datasource=go +EDITORCONFIG_CHECKER_PACKAGE ?= github.com/editorconfig-checker/editorconfig-checker/v3/cmd/editorconfig-checker@v3.0.3 # 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.64.7 # renovate: datasource=go +GOLANGCI_LINT_PACKAGE ?= github.com/golangci/golangci-lint/cmd/golangci-lint@v1.61.0 # 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.31.0 # renovate: datasource=go +DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.25.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.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: ... +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 ifeq ($(HAS_GO), yes) CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766 CGO_CFLAGS ?= $(shell $(GO) env CGO_CFLAGS) $(CGO_EXTRA_CFLAGS) endif -GOFLAGS := -v -EXECUTABLE ?= gitea +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 ifeq ($(shell sed --version 2>/dev/null | grep -q GNU && echo gnu),gnu) SED_INPLACE := sed -i @@ -115,20 +114,15 @@ 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 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 ./...)) + 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 ./...)) endif REMOTE_CACHER_MODULES ?= cache nosql session queue -GO_TEST_REMOTE_CACHER_PACKAGES ?= $(addprefix forgejo.org/modules/,$(REMOTE_CACHER_MODULES)) +GO_TEST_REMOTE_CACHER_PACKAGES ?= $(addprefix code.gitea.io/gitea/modules/,$(REMOTE_CACHER_MODULES)) FOMANTIC_WORK_DIR := web_src/fomantic @@ -160,8 +154,9 @@ 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 *.ts *.vue *.md *.yml *.yaml) +SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(wildcard *.go *.js *.md *.yml *.yaml *.toml) 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) @@ -169,7 +164,7 @@ GO_SOURCES += $(GENERATED_GO_DEST) GO_SOURCES_NO_BINDATA := $(GO_SOURCES) ifeq ($(HAS_GO), yes) - MIGRATION_PACKAGES := $(shell $(GO) list forgejo.org/models/migrations/... forgejo.org/models/forgejo_migrations/...) + MIGRATION_PACKAGES := $(shell $(GO) list code.gitea.io/gitea/models/migrations/... code.gitea.io/gitea/models/forgejo_migrations/...) endif ifeq ($(filter $(TAGS_SPLIT),bindata),bindata) @@ -413,30 +408,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-locale lint-locale-usage lint-disposable-emails +lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate .PHONY: lint-backend-fix -lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig lint-disposable-emails-fix +lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig .PHONY: lint-codespell -lint-codespell: deps-py - @poetry run codespell +lint-codespell: + codespell .PHONY: lint-codespell-fix -lint-codespell-fix: deps-py - @poetry run codespell -w +lint-codespell-fix: + codespell -w .PHONY: lint-codespell-fix-i -lint-codespell-fix-i: deps-py - @poetry run codespell -w -i 3 -C 2 +lint-codespell-fix-i: + codespell -w -i 3 -C 2 .PHONY: lint-js lint-js: node_modules - npx eslint --color --max-warnings=0 + npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES) .PHONY: lint-js-fix lint-js-fix: node_modules - npx eslint --color --max-warnings=0 --fix + npx eslint --color --max-warnings=0 --ext js,vue $(ESLINT_FILES) --fix .PHONY: lint-css lint-css: node_modules @@ -456,14 +451,6 @@ 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 @@ -476,7 +463,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 forgejo.org +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 .PHONY: lint-go lint-go: @@ -490,6 +477,13 @@ 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..." @@ -504,14 +498,6 @@ 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 @@ -519,7 +505,7 @@ lint-templates: .venv node_modules .PHONY: lint-yaml lint-yaml: .venv - @poetry run yamllint -s . + @poetry run yamllint . .PHONY: security-check security-check: @@ -548,12 +534,12 @@ test: test-frontend test-backend .PHONY: test-backend test-backend: @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES) + @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_PACKAGES) .PHONY: test-remote-cacher test-remote-cacher: @echo "Running go test with $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_REMOTE_CACHER_PACKAGES) + @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' $(GO_TEST_REMOTE_CACHER_PACKAGES) .PHONY: test-frontend test-frontend: node_modules @@ -578,7 +564,7 @@ test-check: .PHONY: test\#% test\#%: @echo "Running go test with -tags '$(TEST_TAGS)'..." - @$(GOTEST) $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_TEST_PACKAGES) + @$(GO) test $(GOTESTFLAGS) -tags='$(TEST_TAGS)' -run $(subst .,/,$*) $(GO_TEST_PACKAGES) .PHONY: coverage coverage: @@ -589,7 +575,7 @@ coverage: .PHONY: unit-test-coverage unit-test-coverage: @echo "Running unit-test-coverage $(GOTESTFLAGS) -tags '$(TEST_TAGS)'..." - @$(GOTEST) $(GOTESTFLAGS) -timeout=20m -tags='$(TEST_TAGS)' -cover -coverprofile coverage.out $(GO_TEST_PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 + @$(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 .PHONY: tidy tidy: @@ -610,7 +596,7 @@ tidy-check: tidy go-licenses: $(GO_LICENSE_FILE) $(GO_LICENSE_FILE): go.mod go.sum - -$(GO) run $(GO_LICENSES_PACKAGE) save . --force --ignore forgejo.org --save_path=$(GO_LICENSE_TMP_DIR) 2>/dev/null + -$(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 build/generate-go-licenses.go $(GO_LICENSE_TMP_DIR) $(GO_LICENSE_FILE) @rm -rf $(GO_LICENSE_TMP_DIR) @@ -622,11 +608,11 @@ generate-ini-sqlite: .PHONY: test-sqlite test-sqlite: integrations.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.sqlite.test .PHONY: test-sqlite\#% test-sqlite\#%: integrations.sqlite.test generate-ini-sqlite - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./integrations.sqlite.test -test.run $(subst .,/,$*) .PHONY: test-sqlite-migration test-sqlite-migration: migrations.sqlite.test migrations.individual.sqlite.test @@ -643,11 +629,11 @@ generate-ini-mysql: .PHONY: test-mysql test-mysql: integrations.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test .PHONY: test-mysql\#% test-mysql\#%: integrations.mysql.test generate-ini-mysql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./integrations.mysql.test -test.run $(subst .,/,$*) .PHONY: test-mysql-migration test-mysql-migration: migrations.mysql.test migrations.individual.mysql.test @@ -661,16 +647,15 @@ 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 $(GOTESTCOMPILEDRUNPREFIX) ./integrations.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test .PHONY: test-pgsql\#% test-pgsql\#%: integrations.pgsql.test generate-ini-pgsql - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GOTESTCOMPILEDRUNPREFIX) ./integrations.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run $(subst .,/,$*) + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./integrations.pgsql.test -test.run $(subst .,/,$*) .PHONY: test-pgsql-migration test-pgsql-migration: migrations.pgsql.test migrations.individual.pgsql.test @@ -689,34 +674,35 @@ 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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini ./e2e.sqlite.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.sqlite.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini PLAYWRIGHT_PROJECT=firefox ./e2e.sqlite.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini ./e2e.mysql.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -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 $(GOTESTCOMPILEDRUNPREFIX) ./e2e.pgsql.test $(GOTESTCOMPILEDRUNSUFFIX) -test.run TestE2e/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini ./e2e.pgsql.test -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 @@ -740,73 +726,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) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.mysql.test + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.mysql.test integrations.pgsql.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.pgsql.test + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.pgsql.test integrations.sqlite.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)' + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -o integrations.sqlite.test -tags '$(TEST_TAGS)' integrations.cover.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.test + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.test integrations.cover.sqlite.test: git-check $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration -coverpkg $(shell echo $(GO_TEST_PACKAGES) | tr ' ' ',') -o integrations.cover.sqlite.test -tags '$(TEST_TAGS)' + $(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)' .PHONY: migrations.mysql.test migrations.mysql.test: $(GO_SOURCES) generate-ini-mysql - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/integration/migration-test -o migrations.mysql.test - GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GOTESTCOMPILEDRUNPREFIX) ./migrations.mysql.test $(GOTESTCOMPILEDRUNSUFFIX) + $(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 .PHONY: migrations.pgsql.test migrations.pgsql.test: $(GO_SOURCES) generate-ini-pgsql - $(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) + $(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 .PHONY: migrations.sqlite.test migrations.sqlite.test: $(GO_SOURCES) generate-ini-sqlite - $(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) + $(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 .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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/mysql.ini $(GO) test $(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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1;\ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/pgsql.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' $$pkg || exit 1; \ + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(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 $(GOTEST) $(GOTESTFLAGS) -tags '$(TEST_TAGS)' forgejo.org/models/migrations/$* + GITEA_ROOT="$(CURDIR)" GITEA_CONF=tests/sqlite.ini $(GO) test $(GOTESTFLAGS) -tags '$(TEST_TAGS)' code.gitea.io/gitea/models/migrations/$* e2e.mysql.test: $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.mysql.test + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.mysql.test e2e.pgsql.test: $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.pgsql.test + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.pgsql.test e2e.sqlite.test: $(GO_SOURCES) - $(GOTEST) $(GOTESTFLAGS) -c forgejo.org/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)' + $(GO) test $(GOTESTFLAGS) -c code.gitea.io/gitea/tests/e2e -o e2e.sqlite.test -tags '$(TEST_TAGS)' .PHONY: check check: test @@ -817,7 +803,7 @@ check: test .PHONY: install $(TAGS_PREREQ) install: $(wildcard *.go) - CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '$(LDFLAGS)' + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' .PHONY: build build: frontend backend @@ -845,13 +831,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 '$(LDFLAGS)' -o $@ + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(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 '-linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE) + CGO_CFLAGS="$(CGO_CFLAGS)" $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags 'netgo osusergo $(TAGS)' -ldflags '-s -w -linkmode external -extldflags "-static" $(LDFLAGS)' -o $(EXECUTABLE) .PHONY: release release: frontend generate release-linux release-copy release-compress vendor release-sources release-check @@ -862,6 +848,10 @@ 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) . @@ -906,7 +896,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 convenience, because the default of the Dockerfile is `direct` which can be +# for convience, 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); \ @@ -1013,7 +1003,7 @@ generate-gitignore: .PHONY: generate-gomock generate-gomock: - $(GO) run $(GOMOCK_PACKAGE) -package mock -destination ./modules/queue/mock/redisuniversalclient.go forgejo.org/modules/nosql RedisClient + $(GO) run $(GOMOCK_PACKAGE) -package mock -destination ./modules/queue/mock/redisuniversalclient.go code.gitea.io/gitea/modules/nosql RedisClient .PHONY: generate-images generate-images: | node_modules diff --git a/README.md b/README.md index 0c4becacc4..2edc449177 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +

Welcome to Forgejo

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 32f7b8c264..f86e10c21a 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -4,31 +4,19 @@ A minor or major Forgejo release is published every [three months](https://forge A [patch or minor release](https://semver.org/spec/v2.0.0.html) (e.g. upgrading from v7.0.0 to v7.0.1 or v7.1.0) does not require manual intervention. But [major releases](https://semver.org/spec/v2.0.0.html#spec-item-8) where the first version number changes (e.g. upgrading from v1.21 to v7.0) contain breaking changes and the release notes explain how to deal with them. -The release notes of each release [are available in the release-notes-published directory of this repository](release-notes-published), starting with [Forgejo 7.0.7](release-notes-published/7.0.7.md) and [Forgejo 8.0.1](release-notes-published/8.0.1.md). - -## 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). +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). ## 8.0.3 -See the [Forgejo 8.0.3 release notes](release-notes-published/8.0.3.md). +The Forgejo v8.0.3 release notes are [available in the v8.0.3 milestone](https://codeberg.org/forgejo/forgejo/milestone/8231). ## 8.0.2 -See the [Forgejo 8.0.2 release notes](release-notes-published/8.0.2.md). +The Forgejo v8.0.2 release notes are [available in the v8.0.2 milestone](https://codeberg.org/forgejo/forgejo/milestone/7728). ## 8.0.1 -See the [Forgejo 8.0.1 release notes](release-notes-published/8.0.1.md). +The Forgejo v8.0.1 release notes are [available in the v8.0.1 milestone](https://codeberg.org/forgejo/forgejo/milestone/7682). ## 8.0.0 @@ -167,25 +155,17 @@ 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 -See the [Forgejo 7.0.9 release notes](release-notes-published/7.0.9.md). +The Forgejo v7.0.9 release notes are [available in the v7.0.9 milestone](https://codeberg.org/forgejo/forgejo/milestone/8232). ## 7.0.8 -See the [Forgejo 7.0.8 release notes](release-notes-published/7.0.8.md). +The Forgejo v7.0.8 release notes are [available in the v7.0.8 milestone](https://codeberg.org/forgejo/forgejo/milestone/7729). ## 7.0.7 -See the [Forgejo 7.0.7 release notes](release-notes-published/7.0.7.md). +The Forgejo v7.0.7 release notes are [available in the v7.0.7 milestone](https://codeberg.org/forgejo/forgejo/milestone/7683). ## 7.0.6 @@ -1590,7 +1570,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 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 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) @@ -1609,7 +1589,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 authenticated](https://codeberg.org/forgejo/forgejo/commit/d89003cc1) + * [Fix API leaking the user email when the caller is not authentified](https://codeberg.org/forgejo/forgejo/commit/d89003cc1) ## 1.20.2-0 @@ -1667,7 +1647,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 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 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: @@ -1761,7 +1741,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 list of issues](https://codeberg.org/forgejo/forgejo/commit/1144b1d129de530b2c07dfdfaf55de383cd82212) + - [Support searching for an issue with its number in the 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) @@ -1798,7 +1778,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 repo](https://codeberg.org/forgejo/forgejo/commit/1dd83dbb917d55bd253001646d6743f247a4d98b) + - [Add `files` and `verification` parameters to improve performances when listing the commits of a 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 bb0031b93d..bcacdc0200 100644 --- a/assets/favicon.svg +++ b/assets/favicon.svg @@ -1,33 +1,27 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/assets/go-licenses.json b/assets/go-licenses.json index e222089dc5..89fa08074c 100644 --- a/assets/go-licenses.json +++ b/assets/go-licenses.json @@ -19,21 +19,11 @@ "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", @@ -85,9 +75,14 @@ "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": "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": "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/sshsig", @@ -110,8 +105,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/v2", - "path": "github.com/RoaringBitmap/roaring/v2/LICENSE", + "name": "github.com/RoaringBitmap/roaring", + "path": "github.com/RoaringBitmap/roaring/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" }, { @@ -297,7 +292,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-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" + "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" }, { "name": "github.com/davecgh/go-spew/spew", @@ -494,6 +489,11 @@ "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) 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" + "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" }, { "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/v2", - "path": "github.com/jhillyerd/enmime/v2/LICENSE", + "name": "github.com/jhillyerd/enmime", + "path": "github.com/jhillyerd/enmime/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-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" + "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" }, { - "name": "github.com/mholt/acmez/v3", - "path": "github.com/mholt/acmez/v3/LICENSE", + "name": "github.com/mholt/acmez/v2", + "path": "github.com/mholt/acmez/v2/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,11 +734,6 @@ "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", @@ -764,11 +759,6 @@ "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", @@ -817,7 +807,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 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" + "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/pkg/errors", @@ -834,11 +824,6 @@ "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", @@ -949,6 +934,11 @@ "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", @@ -979,11 +969,6 @@ "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", @@ -1004,11 +989,6 @@ "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", @@ -1052,7 +1032,17 @@ { "name": "golang.org/x/time/rate", "path": "golang.org/x/time/rate/LICENSE", - "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" + "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" }, { "name": "google.golang.org/protobuf", diff --git a/assets/logo.svg b/assets/logo.svg index bb0031b93d..bcacdc0200 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,33 +1,27 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/build.go b/build.go index d410e171c7..234579b514 100644 --- a/build.go +++ b/build.go @@ -11,4 +11,13 @@ 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 3125f19014..3df83ea6d9 100644 --- a/build/backport-locales.go +++ b/build/backport-locales.go @@ -12,8 +12,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/container" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/setting" ) func main() { diff --git a/build/code-batch-process.go b/build/code-batch-process.go index 516736b65c..cc2ab68026 100644 --- a/build/code-batch-process.go +++ b/build/code-batch-process.go @@ -15,7 +15,7 @@ import ( "strconv" "strings" - "forgejo.org/build/codeformat" + "code.gitea.io/gitea/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 acedd13234..c9fc2a27b4 100644 --- a/build/codeformat/formatimports.go +++ b/build/codeformat/formatimports.go @@ -13,8 +13,8 @@ import ( ) var importPackageGroupOrders = map[string]int{ - "": 1, // internal - "forgejo.org/": 2, + "": 1, // internal + "code.gitea.io/gitea/": 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 03c780911f..1abc9f8ab7 100644 --- a/build/codeformat/formatimports_test.go +++ b/build/codeformat/formatimports_test.go @@ -58,8 +58,8 @@ import ( "code.gitea.io/other/package" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "xorm.io/the/package" @@ -82,8 +82,8 @@ import ( _ "image/jpeg" // for processing jpeg images _ "image/png" // for processing png images - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 deleted file mode 100644 index f87df088c5..0000000000 --- a/build/generate-disposable-email.go +++ /dev/null @@ -1,203 +0,0 @@ -// 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 0ad49a6541..5a88e456ee 100644 --- a/build/generate-emoji.go +++ b/build/generate-emoji.go @@ -20,7 +20,7 @@ import ( "strings" "unicode/utf8" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) const ( @@ -53,6 +53,8 @@ func (e Emoji) MarshalJSON() ([]byte, error) { } func main() { + var err error + flag.Parse() // generate data @@ -81,6 +83,8 @@ 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 7acfd6cbe4..1e09c83a6a 100644 --- a/build/generate-gitignores.go +++ b/build/generate-gitignores.go @@ -15,7 +15,7 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) func main() { diff --git a/build/generate-go-licenses.go b/build/generate-go-licenses.go index 3f4d62a2cc..22ef817ebc 100644 --- a/build/generate-go-licenses.go +++ b/build/generate-go-licenses.go @@ -16,7 +16,7 @@ import ( "sort" "strings" - "forgejo.org/modules/container" + "code.gitea.io/gitea/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 "forgejo.org". Workaround by + // root package as "." and sometimes as "code.gitea.io/gitea". Workaround by // removing both of them for the sake of stable output. - if pkgName == "." || pkgName == "forgejo.org" { + if pkgName == "." || pkgName == "code.gitea.io/gitea" { continue } diff --git a/build/generate-licenses.go b/build/generate-licenses.go index e925d8af02..9a111bc811 100644 --- a/build/generate-licenses.go +++ b/build/generate-licenses.go @@ -15,7 +15,7 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) func main() { diff --git a/build/gocovmerge.go b/build/gocovmerge.go new file mode 100644 index 0000000000..c6f74ed85c --- /dev/null +++ b/build/gocovmerge.go @@ -0,0 +1,118 @@ +// 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 deleted file mode 100644 index 31154ba7cb..0000000000 --- a/build/lint-locale-usage/lint-locale-usage.go +++ /dev/null @@ -1,331 +0,0 @@ -// 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 deleted file mode 100644 index 3b3b746053..0000000000 --- a/build/lint-locale-usage/lint-locale-usage_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// 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 deleted file mode 100644 index 94ce941e62..0000000000 --- a/build/lint-locale/lint-locale.go +++ /dev/null @@ -1,191 +0,0 @@ -// 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 deleted file mode 100644 index 791f5278bc..0000000000 --- a/build/lint-locale/lint-locale_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// 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 Forgejo 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 Gitea 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 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.

+

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.

For Security Purposes

-

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.

+

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.

For Legal Disclosure

-

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.

+

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.

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 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 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 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 Forgejo Instance.
  4. +
  5. We use your User Personal Information, specifically your username, to identify you on Your Gitea 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 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.
  10. -
  11. We use Usage Information and Device Information to better understand how our Users use Your Forgejo 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 Forgejo 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 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.
  16. +
  17. We use Usage Information and Device Information to better understand how our Users use Your Gitea 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 Gitea 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 Forgejo Instance Secures Your Information?

+

How Your Gitea Instance Secures Your 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.

+

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.

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 Forgejo Instance’s business operations;
  • +
  • is appropriate to the nature, size, and complexity of Your Gitea 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 Forgejo Instance does business.
  • +
  • complies with applicable information security-related laws and regulations in the geographic regions where Your Gitea 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 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.

+

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.

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 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.

+

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.

Tracking and Analytics

-

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.

+

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.

-

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.

+

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.

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 Forgejo Instance information. Other third parties, such as data brokers, have been known to scrape Your Forgejo 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 Gitea Instance information. Other third parties, such as data brokers, have been known to scrape Your Gitea 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 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.

+

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.

-

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.

+

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.

-

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

+

In similar fashion, projects on Your Gitea 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 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.

+

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.

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 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 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 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.

+

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.

Data Portability

-

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.

+

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.

Data Retention and Deletion of Data

-

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

+

In general, Your Gitea 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 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 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 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 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.
  • +
  • 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.
  • 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 Forgejo 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 Gitea 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 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).

    +

    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).

    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 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.

    +

    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.

    Contact

    -

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

    +

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

    COPYING

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

    Terms of Service

    -

    Last updated: December 19, 2024

    +

    Last updated: January 29, 2020

    -

    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.

    +

    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.

    Definitions

      -
    1. 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.
    2. +
    3. 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.
    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 Forgejo Instance", "We", and "Us" refers to Your Forgejo Instance, as well as our affiliates, directors, subsidiaries, contractors, licensors, officers, agents, and employees.
    8. +
    9. "Your Gitea Instance", "We", and "Us" refers to Your Gitea 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 Forgejo Instance.
    12. +
    13. The "Service" refers to applications/software, products, and services provided by Your Gitea 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 Forgejo Instance's website at your-forgejo-instance, including its subdomains and other websites owned by Your Forgejo Instance.
    17. +
    18. The "Website" refers to Your Gitea Instance's website at your-gitea-instance, including its subdomains and other websites owned by Your Gitea 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 Forgejo 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 Gitea 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 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.

    +

    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.

    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 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.

    +

    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.

  • 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 Forgejo 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 Gitea 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 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.

    +

    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.

  • @@ -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 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.

    +

    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.

  • @@ -106,27 +106,27 @@
    1. Some Accounts may have private repositories, which allow the User to control access to Content.
    2. -
    3. 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.
    4. +
    5. 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.
    6. -

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

      +

      Your Gitea 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 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.
      • +
      • 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.
    7. -
    8. 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.
    9. +
    10. 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.

    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-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.

    +

    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.

    Intellectual Properties and COPYING

    -

    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.

    +

    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.

    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 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.

    +

    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.

    -

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

    +

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

    -

    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.

    +

    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.

    -

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

    +

    All use of the Your Gitea Instance API is subject to these Terms of Service and the Your Gitea 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 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.

    +

    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.

    Upon Cancellation

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

    We May Terminate

    -

    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.

    +

    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.

    Survival

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

    Legal Notices to Us Must Be in Writing

    -

    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.

    +

    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.

    No Phone Support

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

    Disclaimer of Warranties

    -

    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 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 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 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.

    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 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.

    +

    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.

    -

    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.

    +

    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.

    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 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).

    +

    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).

    Non-Assignability

    -

    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.

    +

    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.

    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 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.

    +

    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.

    Amendments and Complete Agreement

    -

    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.

    +

    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.

    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 b76cf7df80..d9a9d1a192 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -328,10 +328,6 @@ 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 ;; @@ -353,25 +349,16 @@ RUN_USER = ; git ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; 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 +;; Database to use. Either "mysql", "postgres", "mssql" or "sqlite3". ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; 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. @@ -390,6 +377,26 @@ DB_TYPE = sqlite3 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;; 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 @@ -901,9 +908,6 @@ 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 ;; @@ -921,24 +925,6 @@ 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 -;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1941,7 +1927,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 = .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 +;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 ;; ;; Max size of each file. Defaults to 2048MB ;MAX_SIZE = 2048 @@ -1979,7 +1965,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 @@ -2310,7 +2296,7 @@ LEVEL = Info ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Delete all old activities from database +;; Delete all old actions from database ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;[cron.delete_old_actions] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2407,8 +2393,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,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 +;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,മലയാളം ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2668,16 +2654,6 @@ 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] @@ -2723,7 +2699,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 08587fc4f4..d9dbb3ebe0 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 /usr/bin/s6-svscan /etc/s6 + exec /bin/s6-svscan /etc/s6 fi diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 17f461a8f4..0000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,1174 +0,0 @@ -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 90672733d5..9eadad2b94 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1733392399, - "narHash": "sha256-kEsTJTUQfQFIJOcLYFt/RvNxIK653ZkTBIs4DG+cBns=", + "lastModified": 1720542800, + "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d0797a04b81caeae77bcff10a9dde78bc17f5661", + "rev": "feb2849fdeb70028c70d73b848214b00d324a497", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 9f858541df..e2f273e341 100644 --- a/flake.nix +++ b/flake.nix @@ -3,15 +3,14 @@ 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 @@ -30,10 +29,9 @@ poetry # backend + go_1_22 gofumpt sqlite - go - gopls ]; }; } diff --git a/go.mod b/go.mod index cbeed64369..ec02c220f0 100644 --- a/go.mod +++ b/go.mod @@ -1,113 +1,116 @@ -module forgejo.org +module code.gitea.io/gitea -go 1.24 - -toolchain go1.24.3 +go 1.23.2 require ( - code.forgejo.org/f3/gof3/v3 v3.10.6 + code.forgejo.org/f3/gof3/v3 v3.7.0 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/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.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.gitea.io/actions-proto-go v0.4.0 - code.gitea.io/sdk/gitea v0.20.0 + code.gitea.io/gitea-vet v0.2.3 + code.gitea.io/sdk/gitea v0.17.1 codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 connectrpc.com/connect v1.17.0 - github.com/42wim/httpsig v1.2.2 + gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed + gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4 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.1.6 - github.com/PuerkitoBio/goquery v1.10.2 + github.com/ProtonMail/go-crypto v1.0.0 + github.com/PuerkitoBio/goquery v1.10.0 github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2 - github.com/alecthomas/chroma/v2 v2.15.0 + github.com/alecthomas/chroma/v2 v2.14.0 github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb - github.com/blevesearch/bleve/v2 v2.5.2 - github.com/buildkite/terminal-to-html/v3 v3.16.8 - github.com/caddyserver/certmagic v0.22.2 + 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/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.3 + github.com/editorconfig/editorconfig-core-go/v2 v2.6.2 github.com/emersion/go-imap v1.2.1 github.com/felixge/fgprof v0.9.5 - github.com/fsnotify/fsnotify v1.8.0 - github.com/gliderlabs/ssh v0.3.8 + github.com/fsnotify/fsnotify v1.7.0 + github.com/gliderlabs/ssh v0.3.7 github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9 github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 - github.com/go-chi/chi/v5 v5.2.0 + github.com/go-chi/chi/v5 v5.1.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.9.2 - github.com/go-git/go-git/v5 v5.13.2 + 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-ldap/ldap/v3 v3.4.6 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/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/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.2 - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 + github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/go-github/v64 v64.0.0 - github.com/google/pprof v0.0.0-20241017200806-017d972448fc + github.com/google/pprof v0.0.0-20240528025155-186aa0362fba github.com/google/uuid v1.6.0 github.com/gorilla/feeds v1.2.0 - github.com/gorilla/sessions v1.4.0 - github.com/hashicorp/go-version v1.7.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/hashicorp/golang-lru/v2 v2.0.7 github.com/huandu/xstrings v1.5.0 github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 - github.com/jhillyerd/enmime/v2 v2.1.0 + github.com/jhillyerd/enmime v1.3.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.11 - github.com/klauspost/cpuid/v2 v2.2.10 + github.com/klauspost/compress v1.17.9 + github.com/klauspost/cpuid/v2 v2.2.8 github.com/lib/pq v1.10.9 github.com/markbates/goth v1.80.0 github.com/mattn/go-isatty v0.0.20 - github.com/mattn/go-sqlite3 v1.14.28 - github.com/meilisearch/meilisearch-go v0.31.0 + github.com/mattn/go-sqlite3 v1.14.22 + github.com/meilisearch/meilisearch-go v0.28.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.88 - github.com/msteinert/pam/v2 v2.1.0 + github.com/minio/minio-go/v7 v7.0.77 + github.com/msteinert/pam v1.2.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.1 + github.com/opencontainers/image-spec v1.1.0 github.com/pquerna/otp v1.4.0 - github.com/prometheus/client_golang v1.21.1 - github.com/redis/go-redis/v9 v9.7.3 + 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/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.2-0.20230802210424-5b0b94c5c0d3 + github.com/sergi/go-diff v1.3.1 github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.0 github.com/ulikunitz/xz v0.5.12 - github.com/urfave/cli/v2 v2.27.6 + github.com/urfave/cli/v2 v2.27.4 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.8 + github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc - 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 + go.uber.org/mock v0.4.0 + golang.org/x/crypto v0.31.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.28.0 + golang.org/x/text v0.21.0 + golang.org/x/tools v0.25.0 + google.golang.org/grpc v1.66.2 + google.golang.org/protobuf v1.34.2 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 @@ -117,141 +120,181 @@ require ( ) require ( - cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/compute/metadata v0.3.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/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/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/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.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/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/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.3.10 // indirect + github.com/blevesearch/scorch_segment_api/v2 v2.2.15 // 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.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/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/boombuler/barcode v1.0.1 // indirect github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect - github.com/caddyserver/zerossl v0.1.3 // indirect + github.com/caddyserver/zerossl v0.1.2 // indirect github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudflare/circl v1.6.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect - github.com/cyphar/filepath-securejoin v0.3.6 // 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/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.4 // indirect + github.com/dlclark/regexp2 v1.11.0 // 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/fxamacker/cbor/v2 v2.8.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fxamacker/cbor/v2 v2.7.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-fed/httpsig v1.1.0 // indirect + github.com/go-faster/city v1.0.1 // indirect + github.com/go-faster/errors v0.7.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // 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/strfmt v0.22.0 // indirect github.com/go-openapi/swag v0.22.7 // 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/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/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.7.0 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/go-tpm v0.9.3 // indirect + github.com/google/go-tpm v0.9.1 // 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/libdns/libdns v0.2.3 // indirect - github.com/mailru/easyjson v0.9.0 // 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/markbates/going v1.0.3 // indirect github.com/mattn/go-colorable v0.1.13 // 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/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/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.2 // indirect + github.com/pjbgf/sha1cd v0.3.0 // 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.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // 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/rhysd/actionlint v1.6.27 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rogpeppe/go-internal v1.12.0 // 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.3.0 // 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/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/assert v1.3.0 // indirect - github.com/zeebo/blake3 v0.2.4 // indirect - go.etcd.io/bbolt v1.4.0 // 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 go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.uber.org/zap/exp v0.3.0 // indirect - golang.org/x/mod v0.24.0 // indirect - golang.org/x/time v0.10.0 // indirect - golang.org/x/tools v0.31.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.10.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // 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.25.1 +replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.21.3 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 1a285735a0..03eeb0b13c 100644 --- a/go.sum +++ b/go.sum @@ -1,33 +1,29 @@ -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= +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= 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.25.1 h1:T0CsN9iEWIyJzIbmMHMM9pl1KHzmI41q8mtepqVqdCc= -code.forgejo.org/forgejo/act v1.25.1/go.mod h1:tSg5CAHnXp4WLNkMa2e9AEDSujMxKzNM4bF2pvvRCYQ= +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/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/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.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.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/sdk/gitea v0.20.0 h1:Zm/QDwwZK1awoM4AxdjeAQbxolzx2rIP8dDfmKu+KoU= -code.gitea.io/sdk/gitea v0.20.0/go.mod h1:faouBHC/zyx5wLgjmRKR62ydyvMzwWf3QnU0bH7Cw6U= +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= 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= @@ -36,93 +32,110 @@ 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.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/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/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.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/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/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -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/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= 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.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/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/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.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= -github.com/bits-and-blooms/bitset v1.22.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/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.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/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/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.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/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/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.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/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/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= @@ -132,12 +145,13 @@ 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.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/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/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= @@ -150,19 +164,22 @@ 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.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/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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= -github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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= @@ -173,18 +190,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.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= -github.com/dlclark/regexp2 v1.11.4/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/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.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/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/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= @@ -198,14 +215,18 @@ 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.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/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/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= @@ -215,64 +236,94 @@ 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.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0= -github.com/go-chi/chi/v5 v5.2.0/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/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.9.2 h1:giOQAtCgBX08kosrX818DCQJTCNtKwoPBGu0qb6nKTY= -github.com/go-enry/go-enry/v2 v2.9.2/go.mod h1:9yrj4ES1YrbNb1Wb7/PWYr2bpaCXUGRt0uafN0ISyG8= +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-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-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= +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/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.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-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-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.13.2 h1:7O7xvsK7K+rZPKW6AQR1YyNhfywkv7B8/FsP3ki6Zv0= -github.com/go-git/go-git/v5 v5.13.2/go.mod h1:hWdW5P4YZRjmpGHwRH2v3zkWcNl6HeXaXQEMGb3NJ9A= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= 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-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-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-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= -github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-webauthn/webauthn v0.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/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/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.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= -github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +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/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.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-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/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= @@ -282,9 +333,11 @@ 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= @@ -295,21 +348,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.3 h1:+yx0/anQuGzi+ssRqeD6WpXjW2L/V0dItUayO0i9sRc= -github.com/google/go-tpm v0.9.3/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= +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/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-20241017200806-017d972448fc h1:NGyrhhFhwvRAZg02jnYVg3GBQy0qGBKmFQJwaPmpmxs= -github.com/google/pprof v0.0.0-20241017200806-017d972448fc/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +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/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= @@ -320,14 +373,22 @@ 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.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= -github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= +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/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= @@ -336,18 +397,44 @@ 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/jhillyerd/enmime/v2 v2.1.0 h1:c8Qwi5Xq5EdtMN6byQWoZ/8I2RMTo6OJ7Xay+s1oPO0= -github.com/jhillyerd/enmime/v2 v2.1.0/go.mod h1:EJ74dcRbBcqHSP2TBu08XRoy6y3Yx0cevwb1YkGMEmQ= +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/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= @@ -356,14 +443,18 @@ 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.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +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/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.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +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/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= @@ -376,18 +467,17 @@ 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.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8= -github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= +github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s= +github.com/libdns/libdns v0.2.2/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= @@ -398,39 +488,44 @@ 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.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/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/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.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/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= +github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= 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.88 h1:v8MoIJjwYxOkehp+eiLIuvXk87P2raUtoU5klrAAshs= -github.com/minio/minio-go/v7 v7.0.88/go.mod h1:33+O8h0tO7pCeCWwBVa07RhVVfB/3vS4kEX7rwYKmIg= +github.com/minio/minio-go/v7 v7.0.77 h1:GaGghJRg9nwDVlNbwYjSDJT1rqltQkBFDsypWX1v3Bw= +github.com/minio/minio-go/v7 v7.0.77/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg= +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/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/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/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/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= @@ -439,6 +534,8 @@ 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= @@ -451,18 +548,23 @@ 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.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= 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.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= -github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +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/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.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= -github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= 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= @@ -471,16 +573,18 @@ 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.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/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/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= @@ -492,26 +596,47 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.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.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.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/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/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.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= -github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= +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/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= @@ -521,124 +646,140 @@ 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.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +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/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.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= -github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +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/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.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= -github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +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-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -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/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/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -gitlab.com/gitlab-org/api/client-go v0.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.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= 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.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= 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.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.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= 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/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/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.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/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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.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/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/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.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 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= 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= @@ -646,6 +787,7 @@ 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= @@ -653,61 +795,70 @@ 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.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.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= 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.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= 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.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 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/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/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.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/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/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.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.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= 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= @@ -730,9 +881,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 3f0283db7f..b8cc5668e1 100644 --- a/main.go +++ b/main.go @@ -10,16 +10,16 @@ import ( "strings" "time" - "forgejo.org/cmd" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/cmd" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" // register supported doc types - _ "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" + _ "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" "github.com/urfave/cli/v2" ) diff --git a/models/actions/artifact.go b/models/actions/artifact.go index 10cd3868a1..0bc66ba24e 100644 --- a/models/actions/artifact.go +++ b/models/actions/artifact.go @@ -11,9 +11,9 @@ import ( "errors" "time" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/actions/forgejo.go b/models/actions/forgejo.go index ce3f8b0c8b..5ea77f4473 100644 --- a/models/actions/forgejo.go +++ b/models/actions/forgejo.go @@ -7,9 +7,9 @@ import ( "crypto/subtle" "fmt" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/util" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" gouuid "github.com/google/uuid" ) diff --git a/models/actions/forgejo_test.go b/models/actions/forgejo_test.go index fc4ccfa628..9295fc698e 100644 --- a/models/actions/forgejo_test.go +++ b/models/actions/forgejo_test.go @@ -6,9 +6,9 @@ import ( "crypto/subtle" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 27916f29ac..3cfb395e62 100644 --- a/models/actions/main_test.go +++ b/models/actions/main_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/actions/run.go b/models/actions/run.go index 671177a892..f637634575 100644 --- a/models/actions/run.go +++ b/models/actions/run.go @@ -10,15 +10,15 @@ import ( "strings" "time" - "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" + "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" "github.com/nektos/act/pkg/jobparser" "xorm.io/builder" @@ -37,7 +37,6 @@ 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 @@ -255,7 +254,6 @@ 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 { @@ -268,7 +266,6 @@ 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 @@ -394,7 +391,6 @@ 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 fffbb6670b..4b8664077d 100644 --- a/models/actions/run_job.go +++ b/models/actions/run_job.go @@ -9,10 +9,9 @@ import ( "slices" "time" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) @@ -72,15 +71,6 @@ 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) @@ -147,7 +137,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() } @@ -162,35 +152,29 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col return affected, nil } -func AggregateJobStatus(jobs []*ActionRunJob) Status { - allSuccessOrSkipped := len(jobs) != 0 - allSkipped := len(jobs) != 0 - var hasFailure, hasCancelled, hasWaiting, hasRunning, hasBlocked bool +func aggregateJobStatus(jobs []*ActionRunJob) Status { + allDone := true + allWaiting := true + hasFailure := false for _, job := range jobs { - 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 !job.Status.IsDone() { + allDone = false + } + if job.Status != StatusWaiting && !job.Status.IsDone() { + allWaiting = false + } + if job.Status == StatusFailure || job.Status == StatusCancelled { + hasFailure = true + } } - switch { - case allSkipped: - return StatusSkipped - case allSuccessOrSkipped: + if allDone { + if hasFailure { + return StatusFailure + } return StatusSuccess - 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 } + if allWaiting { + return StatusWaiting + } + return StatusRunning } diff --git a/models/actions/run_job_list.go b/models/actions/run_job_list.go index cbcb4beb8e..6c5d3b3252 100644 --- a/models/actions/run_job_list.go +++ b/models/actions/run_job_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) diff --git a/models/actions/run_job_status_test.go b/models/actions/run_job_status_test.go deleted file mode 100644 index 04fd9ceba7..0000000000 --- a/models/actions/run_job_status_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// 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 deleted file mode 100644 index 50a4ba10d8..0000000000 --- a/models/actions/run_job_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// 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 92be510569..4046c7d369 100644 --- a/models/actions/run_list.go +++ b/models/actions/run_list.go @@ -6,12 +6,11 @@ package actions import ( "context" - "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" + "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" "xorm.io/builder" ) @@ -113,14 +112,14 @@ type StatusInfo struct { } // GetStatusInfoList returns a slice of StatusInfo -func GetStatusInfoList(ctx context.Context, lang translation.Locale) []StatusInfo { +func GetStatusInfoList(ctx context.Context) []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.LocaleString(lang), + DisplayedStatus: s.String(), }) } return statusInfoList diff --git a/models/actions/runner.go b/models/actions/runner.go index 99173000fb..175f211c72 100644 --- a/models/actions/runner.go +++ b/models/actions/runner.go @@ -11,15 +11,15 @@ import ( "strings" "time" - 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" + 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" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" "xorm.io/builder" @@ -271,7 +271,6 @@ 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) @@ -282,22 +281,27 @@ func UpdateRunner(ctx context.Context, r *ActionRunner, cols ...string) error { } // DeleteRunner deletes a runner by given ID. -func DeleteRunner(ctx context.Context, r *ActionRunner) error { +func DeleteRunner(ctx context.Context, id int64) error { + runner, err := GetRunnerByID(ctx, id) + if err != nil { + return err + } + // 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(r.ID)) - r.UUID = fmt.Sprintf("ffffffff-ffff-ffff-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x", + binary.LittleEndian.PutUint64(b, uint64(id)) + runner.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, r, "UUID") + err = UpdateRunner(ctx, runner, "UUID") if err != nil { return err } - _, err = db.DeleteByID[ActionRunner](ctx, r.ID) + _, err = db.DeleteByID[ActionRunner](ctx, id) return err } @@ -308,7 +312,6 @@ 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 6a64c46596..3ef8ebb254 100644 --- a/models/actions/runner_list.go +++ b/models/actions/runner_list.go @@ -6,10 +6,10 @@ package actions import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" + "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" ) type RunnerList []*ActionRunner diff --git a/models/actions/runner_test.go b/models/actions/runner_test.go index 0623e66046..26ef4c44c6 100644 --- a/models/actions/runner_test.go +++ b/models/actions/runner_test.go @@ -7,9 +7,9 @@ import ( "fmt" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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, &ActionRunner{ID: recordID}) + err := DeleteRunner(db.DefaultContext, recordID) require.NoError(t, err) var after ActionRunner diff --git a/models/actions/runner_token.go b/models/actions/runner_token.go index a59304d8e8..fd6ba7ecad 100644 --- a/models/actions/runner_token.go +++ b/models/actions/runner_token.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" ) // ActionRunnerToken represents runner tokens diff --git a/models/actions/runner_token_test.go b/models/actions/runner_token_test.go index 65d83a8fd0..35c9a9d3c3 100644 --- a/models/actions/runner_token_test.go +++ b/models/actions/runner_token_test.go @@ -6,8 +6,8 @@ package actions import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 633582e017..acb9961bf6 100644 --- a/models/actions/schedule.go +++ b/models/actions/schedule.go @@ -8,14 +8,11 @@ import ( "fmt" "time" - "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" + "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" ) // ActionSchedule represents a schedule of a workflow file @@ -45,12 +42,15 @@ 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,7 +67,6 @@ 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 @@ -139,25 +138,3 @@ func CleanRepoScheduleTasks(ctx context.Context, repo *repo_model.Repository, ca } 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 new file mode 100644 index 0000000000..5361b94801 --- /dev/null +++ b/models/actions/schedule_list.go @@ -0,0 +1,83 @@ +// 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 83bdceb850..923e5f7807 100644 --- a/models/actions/schedule_spec.go +++ b/models/actions/schedule_spec.go @@ -8,9 +8,9 @@ import ( "strings" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/timeutil" "github.com/robfig/cron/v3" ) diff --git a/models/actions/schedule_spec_list.go b/models/actions/schedule_spec_list.go index 0a09a60acb..4dc43f975b 100644 --- a/models/actions/schedule_spec_list.go +++ b/models/actions/schedule_spec_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/container" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/container" "xorm.io/builder" ) @@ -36,7 +36,7 @@ func (specs SpecList) LoadSchedules(ctx context.Context) error { } repoIDs := specs.GetRepoIDs() - repos, err := repo_model.GetRepositoriesMapByIDs(ctx, repoIDs) + repos, err := GetReposMapByIDs(ctx, repoIDs) if err != nil { return err } diff --git a/models/actions/status.go b/models/actions/status.go index f4357af731..eda2234137 100644 --- a/models/actions/status.go +++ b/models/actions/status.go @@ -4,7 +4,7 @@ package actions import ( - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/translation" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" ) diff --git a/models/actions/task.go b/models/actions/task.go index 63cbc6e586..8d41a631aa 100644 --- a/models/actions/task.go +++ b/models/actions/task.go @@ -9,13 +9,14 @@ import ( "fmt" "time" - 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" + 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" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" lru "github.com/hashicorp/golang-lru/v2" @@ -244,7 +245,7 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask var job *ActionRunJob log.Trace("runner labels: %v", runner.AgentLabels) for _, v := range jobs { - if v.ItRunsOn(runner.AgentLabels) { + if isSubset(runner.AgentLabels, v.RunsOn) { job = v break } @@ -340,7 +341,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, runnerID int64, state *runnerv1.TaskState) (*ActionTask, error) { +func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionTask, error) { stepStates := map[int64]*runnerv1.StepState{} for _, v := range state.Steps { stepStates[v.Id] = v @@ -359,8 +360,6 @@ func UpdateTaskByState(ctx context.Context, runnerID int64, state *runnerv1.Task 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() { @@ -481,6 +480,20 @@ 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 fe4c028c2c..df4b43c5ef 100644 --- a/models/actions/task_list.go +++ b/models/actions/task_list.go @@ -6,9 +6,9 @@ package actions import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/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 != nil { - cond = cond.And(builder.In("status", opts.Status)) + if opts.Status > StatusUnknown { + cond = cond.And(builder.Eq{"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 fa13cadd53..eab5b93118 100644 --- a/models/actions/task_output.go +++ b/models/actions/task_output.go @@ -6,7 +6,7 @@ package actions import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // ActionTaskOutput represents an output of ActionTask. diff --git a/models/actions/task_step.go b/models/actions/task_step.go index 1f20157271..3af1fe3f5a 100644 --- a/models/actions/task_step.go +++ b/models/actions/task_step.go @@ -7,8 +7,8 @@ import ( "context" "time" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" ) // ActionTaskStep represents a step of ActionTask diff --git a/models/actions/tasks_version.go b/models/actions/tasks_version.go index a5c357888f..d8df353593 100644 --- a/models/actions/tasks_version.go +++ b/models/actions/tasks_version.go @@ -6,9 +6,9 @@ package actions import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" ) // ActionTasksVersion diff --git a/models/actions/utils.go b/models/actions/utils.go index 7dd3f7ec12..12657942fc 100644 --- a/models/actions/utils.go +++ b/models/actions/utils.go @@ -12,9 +12,9 @@ import ( "io" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" ) func generateSaltedToken() (string, string, string, string, error) { diff --git a/models/actions/utils_test.go b/models/actions/utils_test.go index af6fd04a6a..98c048d4ef 100644 --- a/models/actions/utils_test.go +++ b/models/actions/utils_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/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 203065487c..d0f917d923 100644 --- a/models/actions/variable.go +++ b/models/actions/variable.go @@ -7,9 +7,9 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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).Where("owner_id = ? AND repo_id = ?", variable.OwnerID, variable.RepoID).Cols("name", "data"). + count, err := db.GetEngine(ctx).ID(variable.ID).Cols("name", "data"). Update(&ActionVariable{ Name: variable.Name, Data: variable.Data, @@ -94,9 +94,11 @@ func UpdateVariable(ctx context.Context, variable *ActionVariable) (bool, error) return count != 0, err } -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 DeleteVariable(ctx context.Context, id int64) error { + if _, err := db.DeleteByID[ActionVariable](ctx, id); err != nil { + return err + } + return nil } func GetVariablesOfRun(ctx context.Context, run *ActionRun) (map[string]string, error) { diff --git a/models/activities/action.go b/models/activities/action.go index ef99132e6c..dd67b98242 100644 --- a/models/activities/action.go +++ b/models/activities/action.go @@ -14,20 +14,20 @@ import ( "strings" "time" - "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" + "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" "xorm.io/builder" "xorm.io/xorm/schemas" diff --git a/models/activities/action_list.go b/models/activities/action_list.go index 64b92bbda1..aafb7f8a26 100644 --- a/models/activities/action_list.go +++ b/models/activities/action_list.go @@ -8,12 +8,12 @@ import ( "fmt" "strconv" - "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" + "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" "xorm.io/builder" ) diff --git a/models/activities/action_test.go b/models/activities/action_test.go index ebc40cffa5..4ce030dd48 100644 --- a/models/activities/action_test.go +++ b/models/activities/action_test.go @@ -8,13 +8,13 @@ import ( "path" "testing" - 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" + 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" "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 a5245ab1d3..43afb84ef1 100644 --- a/models/activities/main_test.go +++ b/models/activities/main_test.go @@ -6,11 +6,10 @@ package activities_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/models/activities/notification.go b/models/activities/notification.go index 4d13900459..09cc640224 100644 --- a/models/activities/notification.go +++ b/models/activities/notification.go @@ -9,14 +9,14 @@ import ( "net/url" "strconv" - "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" + "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" "xorm.io/builder" ) diff --git a/models/activities/notification_list.go b/models/activities/notification_list.go index 9b09dde7ab..32d2a5c051 100644 --- a/models/activities/notification_list.go +++ b/models/activities/notification_list.go @@ -6,14 +6,14 @@ package activities import ( "context" - "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" + "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" "xorm.io/builder" ) diff --git a/models/activities/notification_test.go b/models/activities/notification_test.go index 305a2ae430..3ff223d870 100644 --- a/models/activities/notification_test.go +++ b/models/activities/notification_test.go @@ -7,11 +7,11 @@ import ( "context" "testing" - 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" + 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" "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 3d15c22e19..ffa709ad19 100644 --- a/models/activities/repo_activity.go +++ b/models/activities/repo_activity.go @@ -9,12 +9,12 @@ import ( "sort" "time" - "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" + "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" "xorm.io/xorm" ) diff --git a/models/activities/repo_activity_test.go b/models/activities/repo_activity_test.go index c111c50208..06cd0e1e8a 100644 --- a/models/activities/repo_activity_test.go +++ b/models/activities/repo_activity_test.go @@ -7,9 +7,9 @@ import ( "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/activities/statistic.go b/models/activities/statistic.go index 4c15cb2898..ff81ad78a1 100644 --- a/models/activities/statistic.go +++ b/models/activities/statistic.go @@ -6,18 +6,18 @@ package activities import ( "context" - 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" + 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" ) // Statistic contains the database statistics diff --git a/models/activities/user_heatmap.go b/models/activities/user_heatmap.go index 0cc3f759c6..080075d793 100644 --- a/models/activities/user_heatmap.go +++ b/models/activities/user_heatmap.go @@ -6,11 +6,11 @@ package activities import ( "context" - "forgejo.org/models/db" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "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" ) // 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 d922f9a78b..316ea7d76e 100644 --- a/models/activities/user_heatmap_test.go +++ b/models/activities/user_heatmap_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" - 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" + 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" "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.JSONEq(t, tc.JSONResult, string(jsonData)) + assert.Equal(t, tc.JSONResult, string(jsonData)) } } diff --git a/models/admin/task.go b/models/admin/task.go index b4e1ac0134..c8bc95f981 100644 --- a/models/admin/task.go +++ b/models/admin/task.go @@ -7,16 +7,16 @@ import ( "context" "fmt" - "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" + "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" ) // 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 fc0dd88232..03bc82302f 100644 --- a/models/asymkey/error.go +++ b/models/asymkey/error.go @@ -6,7 +6,7 @@ package asymkey import ( "fmt" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // ErrKeyUnableVerify represents a "KeyUnableVerify" kind of error. @@ -192,6 +192,28 @@ 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 b7e10ce85c..6e2914e476 100644 --- a/models/asymkey/gpg_key.go +++ b/models/asymkey/gpg_key.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/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 06cfd09a3e..6c0f6e01a7 100644 --- a/models/asymkey/gpg_key_add.go +++ b/models/asymkey/gpg_key_add.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 73b066b17c..9aa606405e 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 "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" ) // __________________ ________ ____ __. diff --git a/models/asymkey/gpg_key_import.go b/models/asymkey/gpg_key_import.go index 8a63ea4a35..c9d46d29e5 100644 --- a/models/asymkey/gpg_key_import.go +++ b/models/asymkey/gpg_key_import.go @@ -6,7 +6,7 @@ package asymkey import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // __________________ ________ ____ __. diff --git a/models/asymkey/gpg_key_list.go b/models/asymkey/gpg_key_list.go index b2d4fb11f6..89548e495e 100644 --- a/models/asymkey/gpg_key_list.go +++ b/models/asymkey/gpg_key_list.go @@ -6,7 +6,7 @@ package asymkey import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) type GPGKeyList []*GPGKey diff --git a/models/asymkey/gpg_key_object_verification.go b/models/asymkey/gpg_key_object_verification.go index 407a29c221..24d72a52c1 100644 --- a/models/asymkey/gpg_key_object_verification.go +++ b/models/asymkey/gpg_key_object_verification.go @@ -10,12 +10,12 @@ import ( "hash" "strings" - "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" + "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" "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 f054525e8f..5fd3983e54 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" - "forgejo.org/modules/git" + "code.gitea.io/gitea/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 4db07b84c2..e9aa9cf5ec 100644 --- a/models/asymkey/gpg_key_test.go +++ b/models/asymkey/gpg_key_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "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 2b5ea7a1ac..01812a2d54 100644 --- a/models/asymkey/gpg_key_verify.go +++ b/models/asymkey/gpg_key_verify.go @@ -8,10 +8,10 @@ import ( "strconv" "time" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" + "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" ) // __________________ ________ ____ __. diff --git a/models/asymkey/main_test.go b/models/asymkey/main_test.go index 316e8f1d54..87b5c22c4a 100644 --- a/models/asymkey/main_test.go +++ b/models/asymkey/main_test.go @@ -6,7 +6,7 @@ package asymkey import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/asymkey/ssh_key.go b/models/asymkey/ssh_key.go index 7f76009e7f..7a18732c32 100644 --- a/models/asymkey/ssh_key.go +++ b/models/asymkey/ssh_key.go @@ -10,13 +10,13 @@ import ( "strings" "time" - "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" + "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" "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 d3bf6fe886..d3f9f3f3be 100644 --- a/models/asymkey/ssh_key_authorized_keys.go +++ b/models/asymkey/ssh_key_authorized_keys.go @@ -14,10 +14,10 @@ import ( "sync" "time" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // _____ __ .__ .__ .___ @@ -87,17 +87,20 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error { } defer f.Close() - 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 { + // Note: chmod command does not support in Windows. + if !setting.IsWindows { + 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 + } + } } for _, key := range keys { diff --git a/models/asymkey/ssh_key_authorized_principals.go b/models/asymkey/ssh_key_authorized_principals.go index 0b4fe13ba7..f85de12aae 100644 --- a/models/asymkey/ssh_key_authorized_principals.go +++ b/models/asymkey/ssh_key_authorized_principals.go @@ -13,10 +13,10 @@ import ( "strings" "time" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // _____ __ .__ .__ .___ diff --git a/models/asymkey/ssh_key_deploy.go b/models/asymkey/ssh_key_deploy.go index 22e80840af..923c5020ed 100644 --- a/models/asymkey/ssh_key_deploy.go +++ b/models/asymkey/ssh_key_deploy.go @@ -8,9 +8,9 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/models/perm" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) @@ -105,6 +105,14 @@ 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 11112e4bc3..1ed3b5df2a 100644 --- a/models/asymkey/ssh_key_fingerprint.go +++ b/models/asymkey/ssh_key_fingerprint.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" "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 e0476fe5a8..5ad6fdb0a9 100644 --- a/models/asymkey/ssh_key_object_verification.go +++ b/models/asymkey/ssh_key_object_verification.go @@ -9,9 +9,9 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/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 5d1b7edc27..0d5ebabb70 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" - "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" + "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" "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 305e464b4b..94b1cf112b 100644 --- a/models/asymkey/ssh_key_parse.go +++ b/models/asymkey/ssh_key_parse.go @@ -16,10 +16,10 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "golang.org/x/crypto/ssh" ) @@ -219,13 +219,8 @@ 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 pkeyType { + switch pkey.Type() { case ssh.KeyAlgoDSA: rawPub := struct { Name string diff --git a/models/asymkey/ssh_key_principals.go b/models/asymkey/ssh_key_principals.go index ba2a1a8c7d..4e7dee2c91 100644 --- a/models/asymkey/ssh_key_principals.go +++ b/models/asymkey/ssh_key_principals.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" ) // 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 f3c3e41955..2625d6ac91 100644 --- a/models/asymkey/ssh_key_test.go +++ b/models/asymkey/ssh_key_test.go @@ -12,9 +12,9 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" "github.com/42wim/sshsig" "github.com/stretchr/testify/assert" @@ -35,7 +35,6 @@ 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 5dd26ccc9a..208288c77b 100644 --- a/models/asymkey/ssh_key_verify.go +++ b/models/asymkey/ssh_key_verify.go @@ -7,8 +7,8 @@ import ( "bytes" "context" - "forgejo.org/models/db" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" "github.com/42wim/sshsig" ) diff --git a/models/auth/access_token.go b/models/auth/access_token.go index 31d88c6b20..63331b4841 100644 --- a/models/auth/access_token.go +++ b/models/auth/access_token.go @@ -11,10 +11,10 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" lru "github.com/hashicorp/golang-lru/v2" "xorm.io/builder" @@ -98,15 +98,6 @@ 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 @@ -119,7 +110,8 @@ func generateAccessToken(t *AccessToken) error { t.Token = hex.EncodeToString(token) t.TokenHash = HashToken(t.Token, t.TokenSalt) t.TokenLastEight = t.Token[len(t.Token)-8:] - return nil + _, err = db.GetEngine(ctx).Insert(t) + return err } // DisplayPublicOnly whether to display this as a public-only token. @@ -242,25 +234,3 @@ 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 802ad5aa07..003ca5c9ab 100644 --- a/models/auth/access_token_scope.go +++ b/models/auth/access_token_scope.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "forgejo.org/models/perm" + "code.gitea.io/gitea/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 913118433c..e6ea4876e5 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 "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -131,28 +131,3 @@ 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 a3ac9c4c1a..c64af3e41f 100644 --- a/models/auth/auth_token.go +++ b/models/auth/auth_token.go @@ -10,9 +10,9 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" ) type AuthorizationPurpose string diff --git a/models/auth/main_test.go b/models/auth/main_test.go index b30db24483..d772ea6b1c 100644 --- a/models/auth/main_test.go +++ b/models/auth/main_test.go @@ -6,14 +6,13 @@ package auth_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/auth" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/perm/access" + _ "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" ) func TestMain(m *testing.M) { diff --git a/models/auth/oauth2.go b/models/auth/oauth2.go index fb0a451566..9a7854408f 100644 --- a/models/auth/oauth2.go +++ b/models/auth/oauth2.go @@ -14,11 +14,11 @@ import ( "net/url" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" uuid "github.com/google/uuid" "golang.org/x/crypto/bcrypt" diff --git a/models/auth/oauth2_list.go b/models/auth/oauth2_list.go index 6f508833a0..c55f10b3c8 100644 --- a/models/auth/oauth2_list.go +++ b/models/auth/oauth2_list.go @@ -4,7 +4,7 @@ package auth import ( - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "xorm.io/builder" ) diff --git a/models/auth/oauth2_test.go b/models/auth/oauth2_test.go index 65865c6d31..9b562c8648 100644 --- a/models/auth/oauth2_test.go +++ b/models/auth/oauth2_test.go @@ -4,12 +4,14 @@ package auth_test import ( + "path/filepath" "slices" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + 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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -273,7 +275,13 @@ func TestBuiltinApplicationsClientIDs(t *testing.T) { } func TestOrphanedOAuth2Applications(t *testing.T) { - defer unittest.OverrideFixtures("models/auth/TestOrphanedOAuth2Applications")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"models/auth/TestOrphanedOAuth2Applications/"}, + }, + )() require.NoError(t, unittest.PrepareTestDatabase()) count, err := auth_model.CountOrphanedOAuth2Applications(db.DefaultContext) diff --git a/models/auth/session.go b/models/auth/session.go index b3724dafb6..75a205f702 100644 --- a/models/auth/session.go +++ b/models/auth/session.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) diff --git a/models/auth/session_test.go b/models/auth/session_test.go index ab6415f289..3b57239704 100644 --- a/models/auth/session_test.go +++ b/models/auth/session_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/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 ecd3abc39d..d03d4975dc 100644 --- a/models/auth/source.go +++ b/models/auth/source.go @@ -9,11 +9,11 @@ import ( "fmt" "reflect" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/builder" "xorm.io/xorm" @@ -32,7 +32,7 @@ const ( PAM // 4 DLDAP // 5 OAuth2 // 6 - _ // 7 (was SSPI) + SSPI // 7 Remote // 8 ) @@ -53,6 +53,7 @@ var Names = map[Type]string{ SMTP: "SMTP", PAM: "PAM", OAuth2: "OAuth2", + SSPI: "SPNEGO with SSPI", Remote: "Remote", } @@ -177,6 +178,11 @@ 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 } @@ -259,6 +265,20 @@ 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) @@ -279,6 +299,17 @@ 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 ed21aef253..522fecc25f 100644 --- a/models/auth/source_test.go +++ b/models/auth/source_test.go @@ -7,10 +7,10 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/json" + 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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/auth/two_factor.go b/models/auth/two_factor.go deleted file mode 100644 index e8f19c33cc..0000000000 --- a/models/auth/two_factor.go +++ /dev/null @@ -1,21 +0,0 @@ -// 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 deleted file mode 100644 index 36e0404ae2..0000000000 --- a/models/auth/two_factor_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// 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 edff471836..d0c341a192 100644 --- a/models/auth/twofactor.go +++ b/models/auth/twofactor.go @@ -5,16 +5,19 @@ package auth import ( "context" + "crypto/md5" "crypto/sha256" "crypto/subtle" "encoding/base32" + "encoding/base64" "encoding/hex" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/keying" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "github.com/pquerna/otp/totp" "golang.org/x/crypto/pbkdf2" @@ -46,9 +49,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 []byte `xorm:"BLOB"` + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"UNIQUE"` + Secret string ScratchSalt string ScratchHash string LastUsedPasscode string `xorm:"VARCHAR(10)"` @@ -89,35 +92,39 @@ 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) { - key := keying.DeriveKey(keying.ContextTOTP) - t.Secret = key.Encrypt([]byte(secretString), keying.ColumnAndID("secret", t.ID)) +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 } // ValidateTOTP validates the provided passcode. func (t *TwoFactor) ValidateTOTP(passcode string) (bool, error) { - key := keying.DeriveKey(keying.ContextTOTP) - secret, err := key.Decrypt(t.Secret, keying.ColumnAndID("secret", t.ID)) + decodedStoredSecret, err := base64.StdEncoding.DecodeString(t.Secret) if err != nil { return false, err } - return totp.Validate(passcode, string(secret)), nil + secretBytes, err := secret.AesDecrypt(t.getEncryptionKey(), decodedStoredSecret) + if err != nil { + return false, err + } + secretStr := string(secretBytes) + return totp.Validate(passcode, secretStr), nil } // NewTwoFactor creates a new two-factor authentication token. -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 - }) +func NewTwoFactor(ctx context.Context, t *TwoFactor) error { + _, err := db.GetEngine(ctx).Insert(t) + return err } // UpdateTwoFactor updates a two-factor authentication token. @@ -139,9 +146,9 @@ func GetTwoFactorByUID(ctx context.Context, uid int64) (*TwoFactor, error) { return twofa, nil } -// 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) { +// HasTwoFactorByUID returns the two-factor authentication token associated with +// the user, if any. +func HasTwoFactorByUID(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 5b86a6e6f2..aa13cf6cb1 100644 --- a/models/auth/webauthn.go +++ b/models/auth/webauthn.go @@ -8,9 +8,9 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/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 abf8e34408..e1cd652009 100644 --- a/models/auth/webauthn_test.go +++ b/models/auth/webauthn_test.go @@ -6,9 +6,9 @@ package auth_test import ( "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 ad59bd8769..9eb34dcbcc 100644 --- a/models/avatars/avatar.go +++ b/models/avatars/avatar.go @@ -14,10 +14,10 @@ import ( "strings" "sync/atomic" - "forgejo.org/models/db" - "forgejo.org/modules/cache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "code.forgejo.org/forgejo-contrib/go-libravatar" ) diff --git a/models/avatars/avatar_test.go b/models/avatars/avatar_test.go index 7850d2c096..85c40c3fa1 100644 --- a/models/avatars/avatar_test.go +++ b/models/avatars/avatar_test.go @@ -6,11 +6,11 @@ package avatars_test import ( "testing" - 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" + 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" "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 bdc66954b1..c721a7dc2a 100644 --- a/models/avatars/main_test.go +++ b/models/avatars/main_test.go @@ -6,11 +6,11 @@ package avatars_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/perm/access" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/activities" + _ "code.gitea.io/gitea/models/perm/access" ) func TestMain(m *testing.M) { diff --git a/models/db/collation.go b/models/db/collation.go index 768ada89e6..39d28fa2ff 100644 --- a/models/db/collation.go +++ b/models/db/collation.go @@ -8,9 +8,9 @@ import ( "fmt" "strings" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/db/common.go b/models/db/common.go index c9b012597c..f3fd3e72ae 100644 --- a/models/db/common.go +++ b/models/db/common.go @@ -6,8 +6,8 @@ package db import ( "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/db/context.go b/models/db/context.go index 35526936af..43f612518a 100644 --- a/models/db/context.go +++ b/models/db/context.go @@ -269,9 +269,6 @@ 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 849c5dea41..38e91f22ed 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 ( - "errors" + "fmt" "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 errors.New("error") + return fmt.Errorf("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 errors.New("error") + return fmt.Errorf("error") }) mockCommitter.Assert(t) diff --git a/models/db/context_test.go b/models/db/context_test.go index 7ab327b7e9..855f360b75 100644 --- a/models/db/context_test.go +++ b/models/db/context_test.go @@ -7,8 +7,8 @@ import ( "context" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 1f37e49176..956e17d411 100644 --- a/models/db/convert.go +++ b/models/db/convert.go @@ -8,8 +8,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" "xorm.io/xorm/schemas" diff --git a/models/db/engine.go b/models/db/engine.go index ca6576da8a..61649592e7 100755 --- a/models/db/engine.go +++ b/models/db/engine.go @@ -11,12 +11,11 @@ import ( "fmt" "io" "reflect" - "runtime/trace" "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" "xorm.io/xorm/contexts" @@ -164,8 +163,6 @@ func InitEngine(ctx context.Context) error { Logger: errorLogger, }) - xormEngine.AddHook(&TracingHook{}) - SetDefaultEngine(ctx, xormEngine) return nil } @@ -321,25 +318,6 @@ 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 5d20e3d602..230ee3f2b1 100644 --- a/models/db/engine_test.go +++ b/models/db/engine_test.go @@ -8,14 +8,14 @@ import ( "testing" "time" - "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/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/cmd" // for TestPrimaryKeys + _ "code.gitea.io/gitea/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 "forgejo.org/cmd" to make sure each db.RegisterModel in init functions has been called. + // Import "code.gitea.io/gitea/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 6b70c40eb3..665e970e17 100644 --- a/models/db/error.go +++ b/models/db/error.go @@ -6,7 +6,7 @@ package db import ( "fmt" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // ErrCancelled represents an error due to context cancellation diff --git a/models/db/index.go b/models/db/index.go index 4c15dbe8a1..259ddd6ade 100644 --- a/models/db/index.go +++ b/models/db/index.go @@ -9,7 +9,7 @@ import ( "fmt" "strconv" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 929e514329..11fbc70d8d 100644 --- a/models/db/index_test.go +++ b/models/db/index_test.go @@ -9,8 +9,8 @@ import ( "fmt" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 104a7a8e39..d4c1139637 100644 --- a/models/db/install/db.go +++ b/models/db/install/db.go @@ -4,8 +4,8 @@ package install import ( - "forgejo.org/models/db" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/db/iterate.go b/models/db/iterate.go index 450c7d3389..e1caefa72b 100644 --- a/models/db/iterate.go +++ b/models/db/iterate.go @@ -6,7 +6,7 @@ package db import ( "context" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/builder" ) diff --git a/models/db/iterate_test.go b/models/db/iterate_test.go index 47b6a956f4..7535d01d56 100644 --- a/models/db/iterate_test.go +++ b/models/db/iterate_test.go @@ -7,9 +7,9 @@ import ( "context" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 057221936c..5c005a0350 100644 --- a/models/db/list.go +++ b/models/db/list.go @@ -6,7 +6,7 @@ package db import ( "context" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/builder" "xorm.io/xorm" diff --git a/models/db/list_test.go b/models/db/list_test.go index f13958496a..82240d205b 100644 --- a/models/db/list_test.go +++ b/models/db/list_test.go @@ -6,9 +6,9 @@ package db_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 387709cc50..457ee80ff5 100644 --- a/models/db/log.go +++ b/models/db/log.go @@ -7,7 +7,7 @@ import ( "fmt" "sync/atomic" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" xormlog "xorm.io/xorm/log" ) @@ -69,9 +69,6 @@ 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 4b06923950..7d80b400fe 100644 --- a/models/db/main_test.go +++ b/models/db/main_test.go @@ -6,10 +6,10 @@ package db_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/repo" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/db/name.go b/models/db/name.go index 29b60b2373..51be33a8bc 100644 --- a/models/db/name.go +++ b/models/db/name.go @@ -9,7 +9,7 @@ import ( "strings" "unicode/utf8" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) var ( diff --git a/models/db/paginator/main_test.go b/models/db/paginator/main_test.go index e2528be121..47993aed6b 100644 --- a/models/db/paginator/main_test.go +++ b/models/db/paginator/main_test.go @@ -6,7 +6,7 @@ package paginator import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/db/paginator/paginator_test.go b/models/db/paginator/paginator_test.go index c6d0569aaa..20602212d9 100644 --- a/models/db/paginator/paginator_test.go +++ b/models/db/paginator/paginator_test.go @@ -6,8 +6,8 @@ package paginator import ( "testing" - "forgejo.org/models/db" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/models/db/sequence.go b/models/db/sequence.go index 1740e74c52..f49ad935de 100644 --- a/models/db/sequence.go +++ b/models/db/sequence.go @@ -8,7 +8,7 @@ import ( "fmt" "regexp" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 376f984dc6..ec63447f6f 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" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/lib/pq" "xorm.io/xorm/dialects" diff --git a/models/dbfs/dbfile.go b/models/dbfs/dbfile.go index 12c0398abc..dd27b5c36b 100644 --- a/models/dbfs/dbfile.go +++ b/models/dbfs/dbfile.go @@ -14,7 +14,7 @@ import ( "strings" "time" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) var defaultFileBlockSize int64 = 32 * 1024 diff --git a/models/dbfs/dbfs.go b/models/dbfs/dbfs.go index ba57e50151..f68b4a2b70 100644 --- a/models/dbfs/dbfs.go +++ b/models/dbfs/dbfs.go @@ -10,7 +10,7 @@ import ( "path" "time" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) /* diff --git a/models/dbfs/dbfs_test.go b/models/dbfs/dbfs_test.go index 8e42c54f31..3ad273a732 100644 --- a/models/dbfs/dbfs_test.go +++ b/models/dbfs/dbfs_test.go @@ -9,7 +9,7 @@ import ( "os" "testing" - "forgejo.org/models/db" + "code.gitea.io/gitea/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 3d4b2bc235..537ba0935d 100644 --- a/models/dbfs/main_test.go +++ b/models/dbfs/main_test.go @@ -6,7 +6,7 @@ package dbfs import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/error.go b/models/error.go index e8962f386b..75c53245de 100644 --- a/models/error.go +++ b/models/error.go @@ -7,9 +7,9 @@ package models import ( "fmt" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/util" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/util" ) // ErrUserOwnRepos represents a "UserOwnRepos" kind of error. @@ -151,6 +151,25 @@ 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 new file mode 100644 index 0000000000..6234caefad --- /dev/null +++ b/models/fixture_generation.go @@ -0,0 +1,50 @@ +// 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 new file mode 100644 index 0000000000..33429c8c2d --- /dev/null +++ b/models/fixture_test.go @@ -0,0 +1,36 @@ +// 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 deleted file mode 100644 index 8950b33606..0000000000 --- a/models/fixtures/PrivateIssueProjects/project.yml +++ /dev/null @@ -1,23 +0,0 @@ -- - 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 deleted file mode 100644 index 3f1fe1e705..0000000000 --- a/models/fixtures/PrivateIssueProjects/project_board.yml +++ /dev/null @@ -1,17 +0,0 @@ -- - 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 deleted file mode 100644 index 0245fb47f3..0000000000 --- a/models/fixtures/PrivateIssueProjects/project_issue.yml +++ /dev/null @@ -1,23 +0,0 @@ -- - 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 deleted file mode 100644 index db5392126d..0000000000 --- a/models/fixtures/TestGetUsedForUser/action_artifact.yaml +++ /dev/null @@ -1,17 +0,0 @@ -- - 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 deleted file mode 100644 index ec90787c43..0000000000 --- a/models/fixtures/TestPackagesGetOrInsertBlob/package_blob.yml +++ /dev/null @@ -1,17 +0,0 @@ -- - 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 deleted file mode 100644 index 4149e34b0b..0000000000 --- a/models/fixtures/TestPrivateRepoProjects/access.yml +++ /dev/null @@ -1,5 +0,0 @@ -- - id: 1001 - user_id: 29 - repo_id: 3 - mode: 1 diff --git a/models/fixtures/TestPrivateRepoProjects/project.yml b/models/fixtures/TestPrivateRepoProjects/project.yml deleted file mode 100644 index f66e4c8676..0000000000 --- a/models/fixtures/TestPrivateRepoProjects/project.yml +++ /dev/null @@ -1,11 +0,0 @@ -- - 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 deleted file mode 100644 index 9829cf7e27..0000000000 --- a/models/fixtures/TestPrivateRepoProjects/project_board.yml +++ /dev/null @@ -1,8 +0,0 @@ -- - 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 deleted file mode 100644 index 3e8c1dca9e..0000000000 --- a/models/fixtures/TestPrivateRepoProjects/project_issue.yml +++ /dev/null @@ -1,11 +0,0 @@ -- - 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 deleted file mode 100644 index 2c51c11ebd..0000000000 --- a/models/fixtures/action_artifact.yml +++ /dev/null @@ -1,71 +0,0 @@ -- - 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 7a7bf34197..9c60b352f9 100644 --- a/models/fixtures/action_run.yml +++ b/models/fixtures/action_run.yml @@ -413,44 +413,6 @@ }, "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 702c6bc832..0b02d0e17e 100644 --- a/models/fixtures/action_run_job.yml +++ b/models/fixtures/action_run_job.yml @@ -26,49 +26,6 @@ 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 @@ -83,48 +40,3 @@ 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 506a47d8a0..d88a8ed8a9 100644 --- a/models/fixtures/action_task.yml +++ b/models/fixtures/action_task.yml @@ -57,63 +57,3 @@ 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 deleted file mode 100644 index 314e9f7115..0000000000 --- a/models/fixtures/action_task_output.yml +++ /dev/null @@ -1,20 +0,0 @@ -- - 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 2a9e3105e6..93003049c6 100644 --- a/models/fixtures/branch.yml +++ b/models/fixtures/branch.yml @@ -45,27 +45,3 @@ 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/commit_status.yml b/models/fixtures/commit_status.yml index c568e89cea..0ba6caafe9 100644 --- a/models/fixtures/commit_status.yml +++ b/models/fixtures/commit_status.yml @@ -7,7 +7,6 @@ target_url: https://example.com/builds/ description: My awesome CI-service context: ci/awesomeness - context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7 creator_id: 2 - @@ -19,7 +18,6 @@ target_url: https://example.com/coverage/ description: My awesome Coverage service context: cov/awesomeness - context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe creator_id: 2 - @@ -31,7 +29,6 @@ target_url: https://example.com/coverage/ description: My awesome Coverage service context: cov/awesomeness - context_hash: 3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe creator_id: 2 - @@ -43,7 +40,6 @@ target_url: https://example.com/builds/ description: My awesome CI-service context: ci/awesomeness - context_hash: c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7 creator_id: 2 - @@ -55,41 +51,15 @@ target_url: https://example.com/builds/ description: My awesome deploy service context: deploy/awesomeness - context_hash: ae9547713a6665fc4261d0756904932085a41cf2 creator_id: 2 - id: 6 - index: 1 + index: 6 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 deleted file mode 100644 index ca780a73aa..0000000000 --- a/models/fixtures/federated_user.yml +++ /dev/null @@ -1 +0,0 @@ -[] # empty diff --git a/models/fixtures/federation_host.yml b/models/fixtures/federation_host.yml deleted file mode 100644 index ca780a73aa..0000000000 --- a/models/fixtures/federation_host.yml +++ /dev/null @@ -1 +0,0 @@ -[] # empty diff --git a/models/fixtures/label.yml b/models/fixtures/label.yml index acfac74968..2242b90dcd 100644 --- a/models/fixtures/label.yml +++ b/models/fixtures/label.yml @@ -96,14 +96,3 @@ 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 79051ffb6c..9a16316e5a 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -64,8 +64,6 @@ 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 0ba4d06e14..51f526f889 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -29,8 +29,7 @@ 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 @@ -132,7 +131,6 @@ owner_name: org3 lower_name: repo5 name: repo5 - default_branch: master num_watches: 0 num_stars: 0 num_forks: 0 diff --git a/models/fixtures/secret.yml b/models/fixtures/secret.yml deleted file mode 100644 index ca780a73aa..0000000000 --- a/models/fixtures/secret.yml +++ /dev/null @@ -1 +0,0 @@ -[] # empty diff --git a/models/fixtures/system_setting.yml b/models/fixtures/system_setting.yml index dcad176c89..30542bc82a 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: 'true' + setting_value: 'false' version: 1 created: 1653533198 updated: 1653533198 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml index e8f8d0e422..de0e8d738b 100644 --- a/models/fixtures/team_unit.yml +++ b/models/fixtures/team_unit.yml @@ -1,49 +1,42 @@ - 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 bca1109ea8..d8cb85274b 100644 --- a/models/fixtures/two_factor.yml +++ b/models/fixtures/two_factor.yml @@ -1,9 +1,9 @@ - - 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: 1 + uid: 24 + secret: KlDporn6Ile4vFcKI8z7Z6sqK1Scj2Qp0ovtUzCZO6jVbRW2lAoT7UDxDPtrab8d2B9zKOocBRdBJnS8orsrUNrsyETY+jJHb79M82uZRioKbRUz15sfOpmJmEzkFeSg6S4LicUBQos= + 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 630505b8b4..73b9a97e1b 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: "" + avatar: avatar1 avatar_email: user1@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -36,7 +36,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578000 - id: 2 @@ -45,7 +44,6 @@ 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 @@ -62,9 +60,8 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar2 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 @@ -76,7 +73,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578010 - id: 3 @@ -101,9 +97,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar3 avatar_email: org3@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -114,7 +110,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578020 - id: 4 @@ -139,9 +134,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar4 avatar_email: user4@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 1 num_stars: 0 @@ -152,7 +147,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578030 - id: 5 @@ -177,9 +171,9 @@ allow_import_local: false allow_create_organization: false prohibit_login: false - avatar: "" + avatar: avatar5 avatar_email: user5@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -190,7 +184,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578040 - id: 6 @@ -215,9 +208,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar6 avatar_email: org6@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -228,7 +221,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578050 - id: 7 @@ -253,9 +245,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar7 avatar_email: org7@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -266,7 +258,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578060 - id: 8 @@ -291,9 +282,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar8 avatar_email: user8@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 1 num_following: 1 num_stars: 0 @@ -304,7 +295,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578070 - id: 9 @@ -329,9 +319,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar9 avatar_email: user9@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -342,7 +332,7 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578080 + created_unix: 1730468968 - id: 10 @@ -351,7 +341,6 @@ 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 @@ -368,9 +357,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar10 avatar_email: user10@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -381,7 +370,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578090 - id: 11 @@ -406,9 +394,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar11 avatar_email: user11@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -419,7 +407,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578100 - id: 12 @@ -444,9 +431,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar12 avatar_email: user12@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -457,7 +444,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578110 - id: 13 @@ -482,9 +468,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar13 avatar_email: user13@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -495,7 +481,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578120 - id: 14 @@ -520,9 +505,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar14 avatar_email: user13@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -533,7 +518,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578130 - id: 15 @@ -558,9 +542,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar15 avatar_email: user15@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -571,7 +555,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578140 - id: 16 @@ -596,9 +579,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar16 avatar_email: user16@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -609,7 +592,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578150 - id: 17 @@ -634,9 +616,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar17 avatar_email: org17@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -647,7 +629,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578160 - id: 18 @@ -672,9 +653,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar18 avatar_email: user18@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -685,7 +666,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578170 - id: 19 @@ -710,9 +690,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar19 avatar_email: org19@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -723,7 +703,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578180 - id: 20 @@ -748,9 +727,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar20 avatar_email: user20@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -761,7 +740,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578190 - id: 21 @@ -786,9 +764,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar21 avatar_email: user21@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -799,7 +777,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578200 - id: 22 @@ -824,9 +801,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar22 avatar_email: limited_org@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -837,7 +814,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578210 - id: 23 @@ -862,9 +838,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar23 avatar_email: privated_org@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -875,7 +851,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578220 - id: 24 @@ -900,9 +875,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar24 avatar_email: user24@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -913,7 +888,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578230 - id: 25 @@ -938,9 +912,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar25 avatar_email: org25@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -951,7 +925,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578240 - id: 26 @@ -976,9 +949,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar26 avatar_email: org26@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -989,7 +962,6 @@ repo_admin_change_team_access: true theme: "" keep_activity_private: false - created_unix: 1672578250 - id: 27 @@ -1014,9 +986,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar27 avatar_email: user27@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1027,7 +999,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578260 - id: 28 @@ -1052,9 +1023,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar28 avatar_email: user28@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1065,7 +1036,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578270 - id: 29 @@ -1090,9 +1060,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar29 avatar_email: user29@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1103,7 +1073,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578280 - id: 30 @@ -1128,9 +1097,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar29 avatar_email: user30@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1141,7 +1110,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578290 - id: 31 @@ -1166,9 +1134,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar31 avatar_email: user31@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 1 num_stars: 0 @@ -1179,7 +1147,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578300 - id: 32 @@ -1204,9 +1171,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar32 avatar_email: user30@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1217,7 +1184,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578310 - id: 33 @@ -1242,9 +1208,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar33 avatar_email: user33@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 1 num_following: 0 num_stars: 0 @@ -1255,7 +1221,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578320 - id: 34 @@ -1281,7 +1246,7 @@ allow_import_local: false allow_create_organization: false prohibit_login: false - avatar: "" + avatar: avatar34 avatar_email: user34@example.com use_custom_avatar: true num_followers: 0 @@ -1294,7 +1259,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578330 - id: 35 @@ -1319,9 +1283,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar35 avatar_email: private_org35@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1332,7 +1296,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578340 - id: 36 @@ -1357,9 +1320,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar22 avatar_email: abcde@gitea.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1370,7 +1333,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578350 - id: 37 @@ -1395,9 +1357,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: true - avatar: "" + avatar: avatar29 avatar_email: user37@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1408,7 +1370,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578360 - id: 38 @@ -1433,9 +1394,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar38 avatar_email: user38@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1446,7 +1407,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578370 - id: 39 @@ -1471,9 +1431,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar39 avatar_email: user39@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1484,7 +1444,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578380 - id: 40 @@ -1509,9 +1468,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar40 avatar_email: user40@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1522,7 +1481,6 @@ repo_admin_change_team_access: false theme: "" keep_activity_private: false - created_unix: 1672578390 - id: 41 @@ -1547,9 +1505,9 @@ allow_import_local: false allow_create_organization: true prohibit_login: false - avatar: "" + avatar: avatar41 avatar_email: org41@example.com - use_custom_avatar: true + use_custom_avatar: false num_followers: 0 num_following: 0 num_stars: 0 @@ -1560,4 +1518,3 @@ 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 f471e94511..8ff7993398 100644 --- a/models/fixtures/user_redirect.yml +++ b/models/fixtures/user_redirect.yml @@ -2,4 +2,3 @@ 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 00f13ea399..b60c0c39cf 100644 --- a/models/forgefed/federationhost.go +++ b/models/forgefed/federationhost.go @@ -8,8 +8,8 @@ import ( "strings" "time" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/validation" ) // FederationHost data type diff --git a/models/forgefed/federationhost_repository.go b/models/forgefed/federationhost_repository.go index b04a5cd882..03d8741c58 100644 --- a/models/forgefed/federationhost_repository.go +++ b/models/forgefed/federationhost_repository.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/validation" ) func init() { diff --git a/models/forgefed/federationhost_test.go b/models/forgefed/federationhost_test.go index 7e48a41d3b..ea5494c6e9 100644 --- a/models/forgefed/federationhost_test.go +++ b/models/forgefed/federationhost_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" ) func Test_FederationHostValidation(t *testing.T) { diff --git a/models/forgefed/nodeinfo.go b/models/forgefed/nodeinfo.go index 2461b5e499..66d2eca7aa 100644 --- a/models/forgefed/nodeinfo.go +++ b/models/forgefed/nodeinfo.go @@ -6,7 +6,7 @@ package forgefed import ( "net/url" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" "github.com/valyala/fastjson" ) diff --git a/models/forgefed/nodeinfo_test.go b/models/forgefed/nodeinfo_test.go index 9e37e77100..4c73bb44d8 100644 --- a/models/forgefed/nodeinfo_test.go +++ b/models/forgefed/nodeinfo_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/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 dcc9d588cd..fa56182627 100644 --- a/models/forgejo/semver/main_test.go +++ b/models/forgejo/semver/main_test.go @@ -5,12 +5,11 @@ package semver import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/models/forgejo/semver/semver.go b/models/forgejo/semver/semver.go index 24a3db9181..7f122d2301 100644 --- a/models/forgejo/semver/semver.go +++ b/models/forgejo/semver/semver.go @@ -5,7 +5,7 @@ package semver import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "github.com/hashicorp/go-version" ) diff --git a/models/forgejo/semver/semver_test.go b/models/forgejo/semver/semver_test.go index 2d055e86bb..a508c69b18 100644 --- a/models/forgejo/semver/semver_test.go +++ b/models/forgejo/semver/semver_test.go @@ -5,8 +5,8 @@ package semver import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 031fe8090d..2297f74f73 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/models/migrations/test" ) func TestMain(m *testing.M) { diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go index a4cbca70c1..cca83d6b4d 100644 --- a/models/forgejo_migrations/migrate.go +++ b/models/forgejo_migrations/migrate.go @@ -8,12 +8,12 @@ import ( "fmt" "os" - "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" + "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" "xorm.io/xorm" "xorm.io/xorm/names" @@ -58,42 +58,30 @@ 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), - // v10 -> v11 - NewMigration("Add the `created` column to the `issue` table", forgejo_v1_22.AddCreatedToIssue), // v11 -> v12 - NewMigration("Add repo_archive_download_count table", forgejo_v1_22.AddRepoArchiveDownloadCount), + NewMigration("Add the `created` column to the `issue` table", forgejo_v1_22.AddCreatedToIssue), // v12 -> v13 - NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), + NewMigration("Add repo_archive_download_count table", forgejo_v1_22.AddRepoArchiveDownloadCount), // v13 -> v14 - NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge), + NewMigration("Add `hide_archive_links` column to `release` table", AddHideArchiveLinksToRelease), // v14 -> v15 - NewMigration("Create the `federation_host` table", CreateFederationHostTable), + NewMigration("Remove Gitea-specific columns from the repository and badge tables", RemoveGiteaSpecificColumnsFromRepositoryAndBadge), // v15 -> v16 - NewMigration("Create the `federated_user` table", CreateFederatedUserTable), + NewMigration("Create the `federation_host` table", CreateFederationHostTable), // v16 -> v17 - NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser), + NewMigration("Create the `federated_user` table", CreateFederatedUserTable), // v17 -> v18 - NewMigration("Create the `following_repo` table", CreateFollowingRepoTable), + NewMigration("Add `normalized_federated_uri` column to `user` table", AddNormalizedFederatedURIToUser), // v18 -> v19 - NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable), + NewMigration("Create the `following_repo` table", CreateFollowingRepoTable), // v19 -> v20 - NewMigration("Creating Quota-related tables", CreateQuotaTables), + NewMigration("Add external_url to attachment table", AddExternalURLColumnToAttachmentTable), // v20 -> v21 - NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), + NewMigration("Creating Quota-related tables", CreateQuotaTables), // v21 -> v22 - NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), + NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), // 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), + NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), } // GetCurrentDBVersion returns the current Forgejo database version. diff --git a/models/forgejo_migrations/migrate_test.go b/models/forgejo_migrations/migrate_test.go index 20653929a3..48ee4f77b1 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/models/migrations/test" "github.com/stretchr/testify/require" ) diff --git a/models/forgejo_migrations/v14.go b/models/forgejo_migrations/v14.go index 53f1ef2223..f6dd35ecf0 100644 --- a/models/forgejo_migrations/v14.go +++ b/models/forgejo_migrations/v14.go @@ -4,7 +4,7 @@ package forgejo_migrations //nolint:revive import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v15.go b/models/forgejo_migrations/v15.go index 5e5588dd05..d7ed19ca7c 100644 --- a/models/forgejo_migrations/v15.go +++ b/models/forgejo_migrations/v15.go @@ -6,7 +6,7 @@ package forgejo_migrations //nolint:revive import ( "time" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v18.go b/models/forgejo_migrations/v18.go index e6c1493f0e..afccfbfe15 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(FollowingRepo)) + return x.Sync(new(FederatedUser)) } diff --git a/models/forgejo_migrations/v1_20/v1.go b/models/forgejo_migrations/v1_20/v1.go index 72beaf23de..1097613655 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 ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/forgejo_migrations/v1_20/v3.go b/models/forgejo_migrations/v1_20/v3.go index cce227e6eb..caa4f1aa99 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 ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/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 03c4c5272c..097110893f 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 17bb592379..c693993565 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 ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/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 2af9e431b1..128fd08ab0 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 deleted file mode 100644 index 20a916a716..0000000000 --- a/models/forgejo_migrations/v23.go +++ /dev/null @@ -1,16 +0,0 @@ -// 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 deleted file mode 100644 index ebfb5fc1c4..0000000000 --- a/models/forgejo_migrations/v24.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 deleted file mode 100644 index 8e3032a40c..0000000000 --- a/models/forgejo_migrations/v25.go +++ /dev/null @@ -1,96 +0,0 @@ -// 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 deleted file mode 100644 index e7402fd021..0000000000 --- a/models/forgejo_migrations/v25_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// 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 deleted file mode 100644 index 3292d93ffd..0000000000 --- a/models/forgejo_migrations/v26.go +++ /dev/null @@ -1,14 +0,0 @@ -// 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 deleted file mode 100644 index 2efa3485a8..0000000000 --- a/models/forgejo_migrations/v27.go +++ /dev/null @@ -1,18 +0,0 @@ -// 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 deleted file mode 100644 index cba888d2ec..0000000000 --- a/models/forgejo_migrations/v28.go +++ /dev/null @@ -1,15 +0,0 @@ -// 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 a73a0f2a20..f004d502ac 100644 --- a/models/git/branch.go +++ b/models/git/branch.go @@ -8,14 +8,13 @@ import ( "fmt" "time" - "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" + "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" "xorm.io/builder" ) @@ -163,22 +162,9 @@ func GetBranch(ctx context.Context, repoID int64, branchName string) (*Branch, e return &branch, nil } -func GetBranches(ctx context.Context, repoID int64, branchNames []string, includeDeleted bool) ([]*Branch, error) { +func GetBranches(ctx context.Context, repoID int64, branchNames []string) ([]*Branch, error) { branches := make([]*Branch, 0, len(branchNames)) - - 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 + return branches, db.GetEngine(ctx).Where("repo_id=?", repoID).In("name", branchNames).Find(&branches) } func AddBranches(ctx context.Context, branches []*Branch) error { @@ -431,18 +417,15 @@ 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.And( - builder.Eq{"pull_request.head_repo_id": repoID}, - builder.Or( - builder.Eq{"pull_request.has_merged": true}, - builder.Eq{"issue.is_closed": false}, - ), - )) + Where(builder.Eq{ + "pull_request.head_repo_id": repoID, + "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.Minute*30).Unix()). + And("commit_time >= ?", time.Now().Add(-time.Hour*6).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 4b678f15c0..81a43eaea3 100644 --- a/models/git/branch_list.go +++ b/models/git/branch_list.go @@ -6,10 +6,10 @@ package git import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/optional" + "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" "xorm.io/builder" ) diff --git a/models/git/branch_test.go b/models/git/branch_test.go index 5c1762750e..81839eb774 100644 --- a/models/git/branch_test.go +++ b/models/git/branch_test.go @@ -7,13 +7,13 @@ import ( "context" "testing" - "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" + "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" "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 a679703ffd..53d1ddc8c3 100644 --- a/models/git/commit_status.go +++ b/models/git/commit_status.go @@ -13,16 +13,16 @@ import ( "strings" "time" - 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" + 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" "xorm.io/builder" "xorm.io/xorm" @@ -288,12 +288,16 @@ 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) { - results := []*CommitStatus{} - repoStatuses := make(map[int64][]*CommitStatus) + type result struct { + Index int64 + RepoID int64 + SHA string + } - if len(repoSHAs) == 0 { - // Avoid performing query when there will be no query conditions added. - return repoStatuses, nil + results := make([]result, 0, len(repoSHAs)) + + getBase := func() *xorm.Session { + return db.GetEngine(ctx).Table(&CommitStatus{}) } // Create a disjunction of conditions for each repoID and SHA pair @@ -301,30 +305,38 @@ 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 } - // Group the statuses by repo ID - for _, status := range results { - repoStatuses[status.RepoID] = append(repoStatuses[status.RepoID], status) + 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) + } } return repoStatuses, nil @@ -336,12 +348,6 @@ 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) @@ -361,6 +367,8 @@ 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 448aa5aed7..7603e7aa65 100644 --- a/models/git/commit_status_summary.go +++ b/models/git/commit_status_summary.go @@ -6,9 +6,9 @@ package git import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" "xorm.io/builder" ) diff --git a/models/git/commit_status_test.go b/models/git/commit_status_test.go index c062bbbbb9..1014ee1e13 100644 --- a/models/git/commit_status_test.go +++ b/models/git/commit_status_test.go @@ -8,15 +8,15 @@ import ( "testing" "time" - 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" + 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" "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.EqualValues(t, 6, maxResults) - assert.Len(t, statuses, 6) + assert.Equal(t, 5, int(maxResults)) + assert.Len(t, statuses, 5) assert.Equal(t, "ci/awesomeness", statuses[0].Context) assert.Equal(t, structs.CommitStatusPending, statuses[0].State) @@ -58,17 +58,13 @@ 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.EqualValues(t, 6, maxResults) + assert.Equal(t, 5, int(maxResults)) assert.Empty(t, statuses) } diff --git a/models/git/lfs.go b/models/git/lfs.go index 9ec1ca7d8a..44b741c4c8 100644 --- a/models/git/lfs.go +++ b/models/git/lfs.go @@ -7,16 +7,16 @@ import ( "context" "fmt" - "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" + "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" "xorm.io/builder" ) @@ -136,6 +136,8 @@ 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 9dc0a947c3..07ce7d4abf 100644 --- a/models/git/lfs_lock.go +++ b/models/git/lfs_lock.go @@ -10,14 +10,14 @@ import ( "strings" "time" - "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" + "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" ) // 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 ffa4db21c4..cab1e61cab 100644 --- a/models/git/lfs_lock_list.go +++ b/models/git/lfs_lock_list.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/container" ) // LFSLockList is a list of LFSLock diff --git a/models/git/lfs_test.go b/models/git/lfs_test.go index af5e1abd90..afb73ecf4e 100644 --- a/models/git/lfs_test.go +++ b/models/git/lfs_test.go @@ -5,19 +5,26 @@ package git import ( "context" + "path/filepath" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestIterateRepositoryIDsWithLFSMetaObjects(t *testing.T) { - defer unittest.OverrideFixtures("models/git/TestIterateRepositoryIDsWithLFSMetaObjects")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"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 63a3c363ab..aab1fa9a26 100644 --- a/models/git/main_test.go +++ b/models/git/main_test.go @@ -6,12 +6,11 @@ package git_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/models/git/protected_branch_list_test.go b/models/git/protected_banch_list_test.go similarity index 79% rename from models/git/protected_branch_list_test.go rename to models/git/protected_banch_list_test.go index db7e54f685..09319d21a8 100644 --- a/models/git/protected_branch_list_test.go +++ b/models/git/protected_banch_list_test.go @@ -75,32 +75,3 @@ 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_branch.go b/models/git/protected_branch.go index c1eb750230..a8b8c81bbe 100644 --- a/models/git/protected_branch.go +++ b/models/git/protected_branch.go @@ -10,16 +10,16 @@ import ( "slices" "strings" - "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" + "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" "github.com/gobwas/glob" "github.com/gobwas/glob/syntax" @@ -79,20 +79,14 @@ func IsRuleNameSpecial(ruleName string) bool { } func (protectBranch *ProtectedBranch) loadGlob() { - 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), '/') + 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) } } diff --git a/models/git/protected_branch_list.go b/models/git/protected_branch_list.go index c7a3154884..613333a5a2 100644 --- a/models/git/protected_branch_list.go +++ b/models/git/protected_branch_list.go @@ -7,8 +7,8 @@ import ( "context" "sort" - "forgejo.org/models/db" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/optional" "github.com/gobwas/glob" ) diff --git a/models/git/protected_tag.go b/models/git/protected_tag.go index eeaae41868..9a6646c742 100644 --- a/models/git/protected_tag.go +++ b/models/git/protected_tag.go @@ -9,9 +9,9 @@ import ( "slices" "strings" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/modules/timeutil" "github.com/gobwas/glob" ) diff --git a/models/git/protected_tag_test.go b/models/git/protected_tag_test.go index eec13fdc1f..796e1594b9 100644 --- a/models/git/protected_tag_test.go +++ b/models/git/protected_tag_test.go @@ -6,9 +6,9 @@ package git_test import ( "testing" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/action_aggregator.go b/models/issues/action_aggregator.go deleted file mode 100644 index cf5be753f1..0000000000 --- a/models/issues/action_aggregator.go +++ /dev/null @@ -1,375 +0,0 @@ -// 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 b1099b6b63..a83cb250fa 100644 --- a/models/issues/assignees.go +++ b/models/issues/assignees.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/issues/assignees_test.go b/models/issues/assignees_test.go index a5e8f0cb09..47fb81a237 100644 --- a/models/issues/assignees_test.go +++ b/models/issues/assignees_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/comment.go b/models/issues/comment.go index 1b9b259a30..d53e5f5949 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -12,22 +12,22 @@ import ( "strconv" "unicode/utf8" - "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" + "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" "xorm.io/builder" ) @@ -114,8 +114,6 @@ const ( CommentTypePin // 36 pin Issue CommentTypeUnpin // 37 unpin Issue - - CommentTypeAggregator // 38 Aggregator of comments ) var commentStrings = []string{ @@ -157,7 +155,6 @@ var commentStrings = []string{ "pull_cancel_scheduled_merge", "pin", "unpin", - "action_aggregator", } func (t CommentType) String() string { @@ -197,20 +194,6 @@ 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 @@ -241,44 +224,41 @@ 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:"-"` - 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:"-"` + 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:"-"` CommitID int64 Line int64 // - previous line / + proposed line @@ -649,11 +629,8 @@ 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 { - if !organization.IsErrTeamNotExist(err) { - return err - } - c.AssigneeTeam = organization.NewGhostTeam() + if err != nil && !organization.IsErrTeamNotExist(err) { + return err } } } @@ -902,7 +879,7 @@ func updateCommentInfos(ctx context.Context, opts *CreateCommentOptions, comment } fallthrough case CommentTypeComment: - if err := UpdateIssueNumComments(ctx, opts.Issue.ID); err != nil { + if _, err = db.Exec(ctx, "UPDATE `issue` SET num_comments=num_comments+1 WHERE id=?", opts.Issue.ID); err != nil { return err } fallthrough @@ -1117,7 +1094,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) } @@ -1197,8 +1174,8 @@ func DeleteComment(ctx context.Context, comment *Comment) error { return err } - if comment.Type.CountedAsConversation() { - if err := UpdateIssueNumComments(ctx, comment.IssueID); err != nil { + if comment.Type == CommentTypeComment { + if _, err := e.ID(comment.IssueID).Decr("num_comments").Update(new(Issue)); err != nil { return err } } @@ -1315,21 +1292,6 @@ 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 { @@ -1362,7 +1324,8 @@ func InsertIssueComments(ctx context.Context, comments []*Comment) error { } for _, issueID := range issueIDs { - if err := UpdateIssueNumComments(ctx, issueID); err != nil { + 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 { return err } } diff --git a/models/issues/comment_code.go b/models/issues/comment_code.go index 3c87a1b41a..2f6f57e0da 100644 --- a/models/issues/comment_code.go +++ b/models/issues/comment_code.go @@ -6,10 +6,10 @@ package issues import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" + "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" "xorm.io/builder" ) diff --git a/models/issues/comment_list.go b/models/issues/comment_list.go index 7285e347b4..7a133d1c16 100644 --- a/models/issues/comment_list.go +++ b/models/issues/comment_list.go @@ -6,11 +6,11 @@ package issues import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/log" + "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" ) // CommentList defines a list of comments diff --git a/models/issues/comment_list_test.go b/models/issues/comment_list_test.go index 062a710b84..5ad1cd19c9 100644 --- a/models/issues/comment_list_test.go +++ b/models/issues/comment_list_test.go @@ -6,10 +6,10 @@ package issues import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "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 0e257f533c..f7088cc96c 100644 --- a/models/issues/comment_test.go +++ b/models/issues/comment_test.go @@ -7,12 +7,12 @@ import ( "testing" "time" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -125,12 +125,3 @@ 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 476c6e0f90..cd3e217b21 100644 --- a/models/issues/content_history.go +++ b/models/issues/content_history.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "forgejo.org/models/avatars" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/builder" ) diff --git a/models/issues/content_history_test.go b/models/issues/content_history_test.go index 4e158da1cc..dde6f195bc 100644 --- a/models/issues/content_history_test.go +++ b/models/issues/content_history_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/dependency.go b/models/issues/dependency.go index fab35dad12..146dd1887d 100644 --- a/models/issues/dependency.go +++ b/models/issues/dependency.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" ) // ErrDependencyExists represents a "DependencyAlreadyExists" kind of error. diff --git a/models/issues/dependency_test.go b/models/issues/dependency_test.go index 46f3ad10e5..1e73c581ee 100644 --- a/models/issues/dependency_test.go +++ b/models/issues/dependency_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue.go b/models/issues/issue.go index 142f2de182..f7379b7e0c 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -11,16 +11,16 @@ import ( "regexp" "slices" - "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" + "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" "xorm.io/builder" ) @@ -63,6 +63,21 @@ 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 @@ -253,9 +268,6 @@ 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 } @@ -399,11 +411,6 @@ 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 @@ -546,9 +553,6 @@ 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 @@ -640,7 +644,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) @@ -871,7 +875,7 @@ func GetPinnedIssues(ctx context.Context, repoID int64, isPull bool) (IssueList, return issues, nil } -// IsNewPinAllowed returns if a new Issue or Pull request can be pinned +// IsNewPinnedAllowed 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 5012067d70..9386027f74 100644 --- a/models/issues/issue_index.go +++ b/models/issues/issue_index.go @@ -6,7 +6,7 @@ package issues import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/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 6de3f0bc95..eb79a0806c 100644 --- a/models/issues/issue_index_test.go +++ b/models/issues/issue_index_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "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" "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 c9e792ed0f..04e1fa3d7d 100644 --- a/models/issues/issue_label.go +++ b/models/issues/issue_label.go @@ -8,9 +8,9 @@ import ( "fmt" "sort" - "forgejo.org/models/db" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" "xorm.io/builder" ) diff --git a/models/issues/issue_label_test.go b/models/issues/issue_label_test.go index 753e389c7b..67f4874c8f 100644 --- a/models/issues/issue_label_test.go +++ b/models/issues/issue_label_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/issue_list.go b/models/issues/issue_list.go index 5a02baa428..fe6c630a31 100644 --- a/models/issues/issue_list.go +++ b/models/issues/issue_list.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "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" + "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" "xorm.io/builder" ) diff --git a/models/issues/issue_list_test.go b/models/issues/issue_list_test.go index 7aa5222958..32cc0fe423 100644 --- a/models/issues/issue_list_test.go +++ b/models/issues/issue_list_test.go @@ -6,11 +6,11 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "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" "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 1e4a5906d9..b21629b529 100644 --- a/models/issues/issue_lock.go +++ b/models/issues/issue_lock.go @@ -6,8 +6,8 @@ package issues import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/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 3c6ce0ca1c..835ea1db52 100644 --- a/models/issues/issue_project.go +++ b/models/issues/issue_project.go @@ -6,12 +6,10 @@ package issues import ( "context" - "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" + "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" ) // LoadProject load the project the issue was assigned to @@ -50,28 +48,22 @@ func (issue *Issue) ProjectColumnID(ctx context.Context) int64 { } // LoadIssuesFromColumn load issues assigned to this column -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{ +func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column) (IssueList, error) { + issueList, err := Issues(ctx, &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 { - issueOpts.ProjectColumnID = db.NoConditionID - - issues, err := Issues(ctx, issueOpts) + issues, err := Issues(ctx, &IssuesOptions{ + ProjectColumnID: db.NoConditionID, + ProjectID: b.ProjectID, + SortType: "project-column-sorting", + }) if err != nil { return nil, err } @@ -86,10 +78,10 @@ func LoadIssuesFromColumn(ctx context.Context, b *project_model.Column, doer *us } // LoadIssuesFromColumnList load issues assigned to the columns -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) { +func LoadIssuesFromColumnList(ctx context.Context, bs project_model.ColumnList) (map[int64]IssueList, error) { issuesMap := make(map[int64]IssueList, len(bs)) for i := range bs { - il, err := LoadIssuesFromColumn(ctx, bs[i], doer, org, isClosed) + il, err := LoadIssuesFromColumn(ctx, bs[i]) if err != nil { return nil, err } @@ -168,36 +160,3 @@ 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 deleted file mode 100644 index 099679a8c7..0000000000 --- a/models/issues/issue_project_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// 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 bf4b89ee0b..e9f116bfc6 100644 --- a/models/issues/issue_search.go +++ b/models/issues/issue_search.go @@ -9,13 +9,13 @@ import ( "strconv" "strings" - "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" + "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" "xorm.io/builder" "xorm.io/xorm" @@ -49,13 +49,9 @@ type IssuesOptions struct { //nolint // prioritize issues from this repo PriorityRepoID int64 IsArchived optional.Option[bool] - - // If combined with AllPublic, then private as well as public issues - // that matches the criteria will be returned, if AllPublic is false - // 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 + 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 @@ -200,8 +196,7 @@ func applyRepoConditions(sess *xorm.Session, opts *IssuesOptions) { } else if len(opts.RepoIDs) > 1 { opts.RepoCond = builder.In("issue.repo_id", opts.RepoIDs) } - // If permission scoping is set, then we set this condition at a later stage. - if opts.AllPublic && opts.User == nil { + if opts.AllPublic { if opts.RepoCond == nil { opts.RepoCond = builder.NewCond() } @@ -273,14 +268,7 @@ func applyConditions(sess *xorm.Session, opts *IssuesOptions) { applyLabelsCondition(sess, opts) if opts.User != nil { - 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) + sess.And(issuePullAccessibleRepoCond("issue.repo_id", opts.User.ID, opts.Org, opts.Team, opts.IsPull.Value())) } } @@ -341,9 +329,6 @@ 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 eee8760b9f..dc634cf00e 100644 --- a/models/issues/issue_stats.go +++ b/models/issues/issue_stats.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "xorm.io/builder" "xorm.io/xorm" @@ -15,13 +15,13 @@ import ( // IssueStats represents issue statistic information. type IssueStats struct { - OpenCount, ClosedCount, AllCount int64 - YourRepositoriesCount int64 - AssignCount int64 - CreateCount int64 - MentionCount int64 - ReviewRequestedCount int64 - ReviewedCount int64 + OpenCount, ClosedCount int64 + YourRepositoriesCount int64 + AssignCount int64 + CreateCount int64 + MentionCount int64 + ReviewRequestedCount int64 + ReviewedCount int64 } // Filter modes. @@ -104,7 +104,6 @@ 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 @@ -132,13 +131,7 @@ func getIssueStatsChunk(ctx context.Context, opts *IssuesOptions, issueIDs []int stats.ClosedCount, err = applyIssuesOptions(sess, opts, issueIDs). And("issue.is_closed = ?", true). Count(new(Issue)) - if err != nil { - return stats, err - } - - stats.AllCount = stats.OpenCount + stats.ClosedCount - - return stats, nil + return stats, err } 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 549dc04433..fda75a6b47 100644 --- a/models/issues/issue_stats_test.go +++ b/models/issues/issue_stats_test.go @@ -6,9 +6,9 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -25,7 +25,6 @@ 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 afca27dfcf..580be9663b 100644 --- a/models/issues/issue_test.go +++ b/models/issues/issue_test.go @@ -4,18 +4,19 @@ package issues_test import ( + "context" "fmt" "sort" "sync" "testing" "time" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -308,7 +309,7 @@ func TestIssue_ResolveMentions(t *testing.T) { func TestResourceIndex(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - beforeCount, err := issues_model.CountIssues(t.Context(), &issues_model.IssuesOptions{}) + beforeCount, err := issues_model.CountIssues(context.Background(), &issues_model.IssuesOptions{}) require.NoError(t, err) var wg sync.WaitGroup @@ -325,7 +326,7 @@ func TestResourceIndex(t *testing.T) { t.Parallel() wg.Wait() - afterCount, err := issues_model.CountIssues(t.Context(), &issues_model.IssuesOptions{}) + afterCount, err := issues_model.CountIssues(context.Background(), &issues_model.IssuesOptions{}) require.NoError(t, err) assert.EqualValues(t, 100, afterCount-beforeCount) }) @@ -353,7 +354,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(t.Context(), &issues_model.IssuesOptions{ + issues, err := issues_model.Issues(context.TODO(), &issues_model.IssuesOptions{ Paginator: &db.ListOptions{ PageSize: issueAmount, }, diff --git a/models/issues/issue_update.go b/models/issues/issue_update.go index 9d0bc84454..dbfd2fc91b 100644 --- a/models/issues/issue_update.go +++ b/models/issues/issue_update.go @@ -8,20 +8,19 @@ import ( "fmt" "strings" - "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" + "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" "xorm.io/builder" ) @@ -64,10 +63,6 @@ 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 @@ -159,7 +154,6 @@ 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) } @@ -415,7 +409,6 @@ 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 { @@ -429,7 +422,6 @@ 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, @@ -437,7 +429,7 @@ func NewIssue(ctx context.Context, repo *repo_model.Repository, issue *Issue, la LabelIDs: labelIDs, Attachments: uuids, }); err != nil { - if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { + if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { return err } return fmt.Errorf("newIssue: %w", err) diff --git a/models/issues/issue_user.go b/models/issues/issue_user.go index 70e162411f..6b59e0725e 100644 --- a/models/issues/issue_user.go +++ b/models/issues/issue_user.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/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 77e6c5bc5a..e059e43e8b 100644 --- a/models/issues/issue_user_test.go +++ b/models/issues/issue_user_test.go @@ -6,10 +6,10 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "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" "github.com/stretchr/testify/require" ) diff --git a/models/issues/issue_watch.go b/models/issues/issue_watch.go index ecc09e1e81..9e616a0eb1 100644 --- a/models/issues/issue_watch.go +++ b/models/issues/issue_watch.go @@ -6,10 +6,10 @@ package issues import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "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" ) // 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 a5c01693fa..573215d577 100644 --- a/models/issues/issue_watch_test.go +++ b/models/issues/issue_watch_test.go @@ -6,9 +6,9 @@ package issues_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/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 4c753a58eb..9c9d5d66cd 100644 --- a/models/issues/issue_xref.go +++ b/models/issues/issue_xref.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - "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" + "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" ) type crossReference struct { diff --git a/models/issues/issue_xref_test.go b/models/issues/issue_xref_test.go index e74717be1e..a24d1b04ee 100644 --- a/models/issues/issue_xref_test.go +++ b/models/issues/issue_xref_test.go @@ -7,12 +7,12 @@ import ( "fmt" "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/label.go b/models/issues/label.go index 264ca8cc3d..61478e17ac 100644 --- a/models/issues/label.go +++ b/models/issues/label.go @@ -11,11 +11,11 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/label" - "forgejo.org/modules/optional" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/builder" ) @@ -303,9 +303,6 @@ 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"). @@ -356,17 +353,6 @@ 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"). @@ -382,9 +368,6 @@ 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). @@ -411,7 +394,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) } @@ -457,9 +440,6 @@ 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). @@ -486,7 +466,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 f2ba28a6d2..b03fc1cd20 100644 --- a/models/issues/label_test.go +++ b/models/issues/label_test.go @@ -6,12 +6,12 @@ package issues_test import ( "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -231,7 +231,8 @@ func TestGetLabelsByOrgID(t *testing.T) { testSuccess(3, "reversealphabetically", []int64{4, 3}) testSuccess(3, "default", []int64{3, 4}) - _, err := issues_model.GetLabelsByOrgID(db.DefaultContext, 0, "leastissues", db.ListOptions{}) + var err error + _, 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 05d854c964..baabd6646a 100644 --- a/models/issues/main_test.go +++ b/models/issues/main_test.go @@ -6,14 +6,14 @@ package issues_test import ( "testing" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/repo" - _ "forgejo.org/models/user" + _ "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" "github.com/stretchr/testify/require" ) diff --git a/models/issues/milestone.go b/models/issues/milestone.go index 52433e735d..4b3cb0e858 100644 --- a/models/issues/milestone.go +++ b/models/issues/milestone.go @@ -9,12 +9,12 @@ import ( "html/template" "strings" - "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" + "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" "xorm.io/builder" ) @@ -251,6 +251,21 @@ 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 e2079fb324..955ab2356d 100644 --- a/models/issues/milestone_list.go +++ b/models/issues/milestone_list.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/optional" "xorm.io/builder" ) diff --git a/models/issues/milestone_test.go b/models/issues/milestone_test.go index bfb4f38ad0..314cba308c 100644 --- a/models/issues/milestone_test.go +++ b/models/issues/milestone_test.go @@ -7,14 +7,14 @@ import ( "sort" "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -298,16 +298,17 @@ func TestNewMilestone(t *testing.T) { unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: milestone.RepoID}, &issues_model.Milestone{}) } -func TestChangeMilestoneStatusByRepoIDAndID(t *testing.T) { +func TestChangeMilestoneStatus(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) + milestone := unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}) - 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, 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, false)) + require.NoError(t, issues_model.ChangeMilestoneStatus(db.DefaultContext, milestone, false)) unittest.AssertExistsAndLoadBean(t, &issues_model.Milestone{ID: 1}, "is_closed=0") - unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: 1}, &issues_model.Milestone{}) + unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: milestone.RepoID}, &issues_model.Milestone{}) } func TestDeleteMilestoneByRepoID(t *testing.T) { diff --git a/models/issues/pull.go b/models/issues/pull.go index c46961447c..45e2e19434 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -12,17 +12,17 @@ import ( "strconv" "strings" - "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" + "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" "xorm.io/builder" ) @@ -566,7 +566,6 @@ 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, @@ -575,7 +574,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *Iss Attachments: uuids, IsPull: true, }); err != nil { - if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { + if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) || IsErrNewIssueInsert(err) { return err } return fmt.Errorf("newIssue: %w", err) @@ -690,7 +689,7 @@ func GetPullRequestByIssueID(ctx context.Context, issueID int64) (*PullRequest, return pr, pr.LoadAttributes(ctx) } -// GetPullRequestByBaseHeadInfo returns the pull request by given base and head +// GetPullRequestsByBaseHeadInfo 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 a448673454..f3970fa93b 100644 --- a/models/issues/pull_list.go +++ b/models/issues/pull_list.go @@ -7,14 +7,14 @@ import ( "context" "fmt" - "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" + "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" "xorm.io/xorm" ) @@ -26,7 +26,6 @@ type PullRequestsOptions struct { SortType string Labels []int64 MilestoneID int64 - PosterID int64 } func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { @@ -47,10 +46,6 @@ 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 e85b626c83..8e0c020ad9 100644 --- a/models/issues/pull_test.go +++ b/models/issues/pull_test.go @@ -8,12 +8,13 @@ import ( "testing" "time" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -160,7 +161,7 @@ func TestGetUnmergedPullRequestsByHeadInfo(t *testing.T) { } func TestGetUnmergedPullRequestsByHeadInfoMax(t *testing.T) { - defer unittest.OverrideFixtures("models/fixtures/TestGetUnmergedPullRequestsByHeadInfoMax")() + defer tests.AddFixtures("models/fixtures/TestGetUnmergedPullRequestsByHeadInfoMax/")() require.NoError(t, unittest.PrepareTestDatabase()) repoID := int64(1) diff --git a/models/issues/reaction.go b/models/issues/reaction.go index 522040c022..eb7faefc79 100644 --- a/models/issues/reaction.go +++ b/models/issues/reaction.go @@ -8,13 +8,13 @@ import ( "context" "fmt" - "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" + "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" "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 0ae201c500..e02e6d7e0c 100644 --- a/models/issues/reaction_test.go +++ b/models/issues/reaction_test.go @@ -6,12 +6,12 @@ package issues_test import ( "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/review.go b/models/issues/review.go index db5cd65e2e..a39c12069b 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -9,16 +9,16 @@ import ( "slices" "strings" - "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" + "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" "xorm.io/builder" ) @@ -614,10 +614,6 @@ 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 45480832d8..a5ceb21791 100644 --- a/models/issues/review_list.go +++ b/models/issues/review_list.go @@ -6,11 +6,11 @@ package issues import ( "context" - "forgejo.org/models/db" - organization_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/optional" + "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" "xorm.io/builder" ) diff --git a/models/issues/review_test.go b/models/issues/review_test.go index 33d131c225..51cb940579 100644 --- a/models/issues/review_test.go +++ b/models/issues/review_test.go @@ -6,11 +6,11 @@ package issues_test import ( "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/issues/stopwatch.go b/models/issues/stopwatch.go index 2ff2a17d92..93eaf8845d 100644 --- a/models/issues/stopwatch.go +++ b/models/issues/stopwatch.go @@ -8,11 +8,11 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" ) // ErrIssueStopwatchNotExist represents an error that stopwatch is not exist @@ -81,7 +81,7 @@ func GetUIDsAndStopwatch(ctx context.Context) (map[int64][]*Stopwatch, 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 3334ffea7d..af86e8b1d8 100644 --- a/models/issues/stopwatch_test.go +++ b/models/issues/stopwatch_test.go @@ -4,13 +4,15 @@ package issues_test import ( + "path/filepath" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "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" + "code.gitea.io/gitea/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -79,7 +81,13 @@ func TestCreateOrStopIssueStopwatch(t *testing.T) { } func TestGetUIDsAndStopwatch(t *testing.T) { - defer unittest.OverrideFixtures("models/issues/TestGetUIDsAndStopwatch")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"models/issues/TestGetUIDsAndStopwatch/"}, + }, + )() require.NoError(t, unittest.PrepareTestDatabase()) uidStopwatches, err := issues_model.GetUIDsAndStopwatch(db.DefaultContext) diff --git a/models/issues/tracked_time.go b/models/issues/tracked_time.go index 05d7b15815..caa582a9fc 100644 --- a/models/issues/tracked_time.go +++ b/models/issues/tracked_time.go @@ -9,11 +9,11 @@ import ( "fmt" "time" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" "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 770b43abd7..4d4e232012 100644 --- a/models/issues/tracked_time_test.go +++ b/models/issues/tracked_time_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/main_test.go b/models/main_test.go index 0edcf8f49d..a694130e53 100644 --- a/models/main_test.go +++ b/models/main_test.go @@ -6,15 +6,14 @@ package models import ( "testing" - 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" + 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" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/system" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/system" "github.com/stretchr/testify/require" ) diff --git a/models/migrations/base/db.go b/models/migrations/base/db.go index 897ad016ab..333fa3151f 100644 --- a/models/migrations/base/db.go +++ b/models/migrations/base/db.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 4a610e065d..4010a14311 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/timeutil" + migrations_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm/names" ) diff --git a/models/migrations/base/main_test.go b/models/migrations/base/main_test.go index 2b3889441a..c625ef02b8 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 "forgejo.org/models/migrations/test" + migrations_tests "code.gitea.io/gitea/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 deleted file mode 100644 index 91aa420340..0000000000 --- a/models/migrations/fixtures/Test_MigrateTwoFactorToKeying/two_factor.yml +++ /dev/null @@ -1,18 +0,0 @@ -- - 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 11933014d7..d7e951f8bc 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -8,29 +8,29 @@ import ( "context" "fmt" - "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" + "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" "xorm.io/xorm" "xorm.io/xorm/names" @@ -38,15 +38,25 @@ 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(idNumber int64, desc string, fn func(*xorm.Engine) error) *migration { - return &migration{idNumber, desc, fn} +// 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 } // Migrate executes the migration @@ -57,317 +67,538 @@ 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 // DB version is "the last migration's idNumber" + 1 + Version int64 } // 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 -func prepareMigrationTasks() []*migration { - if preparedMigrations != nil { - return preparedMigrations - } - preparedMigrations = []*migration{ - // Gitea 1.5.0 ends at database version 69 +var migrations = []Migration{ + // Gitea 1.5.0 ends at v69 - newMigration(70, "add issue_dependencies", v1_6.AddIssueDependencies), - newMigration(71, "protect each scratch token", v1_6.AddScratchHash), - newMigration(72, "add review", v1_6.AddReview), + // 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), - // Gitea 1.6.0 ends at database version 73 + // Gitea 1.6.0 ends at v73 - 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), + // 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), - // Gitea 1.7.0 ends at database version 76 + // Gitea 1.7.0 ends at v76 - 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), + // 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), - // Gitea 1.8.0 ends at database version 82 + // Gitea 1.8.0 ends at v82 - 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), + // 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), - // Gitea 1.9.0 ends at database version 88 + // Gitea 1.9.0 ends at v88 - 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), + // 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), - // Gitea 1.10.0 ends at database version 102 + // Gitea 1.10.0 ends at v102 - 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), + // 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), - // Gitea 1.11.0 ends at database version 117 + // Gitea 1.11.0 ends at v117 - 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), + // 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), - // Gitea 1.12.0 ends at database version 140 + // Gitea 1.12.0 ends at v140 - 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), + // 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), - // Gitea 1.13.0 ends at database version 155 + // Gitea 1.13.0 ends at v155 - 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), + // 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), - // Gitea 1.14.0 ends at database version 178 + // Gitea 1.14.0 ends at v178 - 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), + // 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), - // Gitea 1.15.0 ends at database version 189 + // Gitea 1.15.0 ends at v189 - 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), + // 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), - // Gitea 1.16.2 ends at database version 211 + // Gitea 1.16.2 ends at v211 - 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), + // 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), - // Gitea 1.17.0 ends at database version 224 + // Gitea 1.17.0 ends at v224 - 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), + // 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), - // Gitea 1.18.0 ends at database version 231 + // Gitea 1.18.0 ends at v231 - 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), + // 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), - // Gitea 1.19.0 ends at database version 244 + // Gitea 1.19.0 ends at v244 - 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), + // 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), - // Gitea 1.20.0 ends at database version 260 + // Gitea 1.20.0 ends at 260 - 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), + // 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), - // Gitea 1.21.0 ends at database version 280 + // Gitea 1.21.0 ends at 280 - 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), + // 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), - // Gitea 1.22.0-rc0 ends at database version 294 + // Gitea 1.22.0-rc0 ends at 294 - 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), + // 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), - // Gitea 1.22.0-rc1 ends at migration ID number 298 (database version 299) + // Gitea 1.22.0-rc1 ends at 299 - 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 + // 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), } // GetCurrentDBVersion returns the current db version @@ -387,20 +618,9 @@ func GetCurrentDBVersion(x *xorm.Engine) (int64, error) { return currentVersion.Version, nil } -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()) +// ExpectedVersion returns the expected db version +func ExpectedVersion() int64 { + return int64(minDBVersion + len(migrations)) } // EnsureUpToDate will check if the db is at the correct version @@ -411,35 +631,24 @@ 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) } - expectedDB := ExpectedDBVersion() + expected := ExpectedVersion() - 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) + 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) } 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 { @@ -452,10 +661,11 @@ 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, it is a fresh installation, and we can skip all migrations. - // XORM model framework will create all tables when initializing. + // If the version record does not exist we think + // it is a fresh installation and we can skip all migrations. currentVersion.ID = 0 - currentVersion.Version = maxDBVer + currentVersion.Version = int64(minDBVersion + len(migrations)) + if _, err = x.InsertOne(currentVersion); err != nil { return fmt.Errorf("insert: %w", err) } @@ -463,20 +673,19 @@ func Migrate(x *xorm.Engine) error { previousVersion = currentVersion.Version } - curDBVer := currentVersion.Version - // Outdated Forgejo database version is not supported - if curDBVer < minDBVersion { + v := currentVersion.Version + if minDBVersion > v { 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'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) + // 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)) 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;", maxDBVer) + 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)) } log.Fatal("Migration Error: %s", msg) return nil @@ -494,14 +703,14 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t } // Migrate - for _, m := range getPendingMigrations(curDBVer, migrations) { - log.Info("Migration[%d]: %s", m.idNumber, m.description) + for i, m := range migrations[v-minDBVersion:] { + log.Info("Migration[%d]: %s", v+int64(i), 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", m.idNumber, m.description, err) + return fmt.Errorf("migration[%d]: %s failed: %w", v+int64(i), m.Description(), err) } - currentVersion.Version = migrationIDNumberToDBVersion(m.idNumber) + currentVersion.Version = v + int64(i) + 1 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 deleted file mode 100644 index ea941b9a09..0000000000 --- a/models/migrations/migrations_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// 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 07487cf58a..0e37233471 100644 --- a/models/migrations/test/tests.go +++ b/models/migrations/test/tests.go @@ -11,18 +11,19 @@ import ( "os" "path" "path/filepath" + "runtime" "strings" "testing" "time" - "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" + "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" "github.com/stretchr/testify/require" "xorm.io/xorm" @@ -122,6 +123,9 @@ 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 3bfb770f24..34c8240031 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" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_10/v99.go b/models/migrations/v1_10/v99.go index 7f287b77aa..ebe6597f7c 100644 --- a/models/migrations/v1_10/v99.go +++ b/models/migrations/v1_10/v99.go @@ -4,7 +4,7 @@ package v1_10 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v102.go b/models/migrations/v1_11/v102.go index a585d9c423..9358e4cef3 100644 --- a/models/migrations/v1_11/v102.go +++ b/models/migrations/v1_11/v102.go @@ -4,7 +4,7 @@ package v1_11 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v104.go b/models/migrations/v1_11/v104.go index af3578ca4a..3e8ee64bc1 100644 --- a/models/migrations/v1_11/v104.go +++ b/models/migrations/v1_11/v104.go @@ -4,7 +4,7 @@ package v1_11 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_11/v112.go b/models/migrations/v1_11/v112.go index 6112ab51a5..0857663119 100644 --- a/models/migrations/v1_11/v112.go +++ b/models/migrations/v1_11/v112.go @@ -7,8 +7,8 @@ import ( "fmt" "path/filepath" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 3d4b41017b..8c631cfd0b 100644 --- a/models/migrations/v1_11/v115.go +++ b/models/migrations/v1_11/v115.go @@ -12,10 +12,10 @@ import ( "path/filepath" "time" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v127.go b/models/migrations/v1_12/v127.go index 11a4042973..00e391dc87 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v128.go b/models/migrations/v1_12/v128.go index 6d7307f470..6eea1337ef 100644 --- a/models/migrations/v1_12/v128.go +++ b/models/migrations/v1_12/v128.go @@ -10,9 +10,9 @@ import ( "strings" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v130.go b/models/migrations/v1_12/v130.go index bfa856796a..391810c7ca 100644 --- a/models/migrations/v1_12/v130.go +++ b/models/migrations/v1_12/v130.go @@ -4,8 +4,8 @@ package v1_12 //nolint import ( - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v134.go b/models/migrations/v1_12/v134.go index bba996fd40..23c2916ba8 100644 --- a/models/migrations/v1_12/v134.go +++ b/models/migrations/v1_12/v134.go @@ -10,9 +10,9 @@ import ( "strings" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v136.go b/models/migrations/v1_12/v136.go index db6fc6dea1..d91ff92feb 100644 --- a/models/migrations/v1_12/v136.go +++ b/models/migrations/v1_12/v136.go @@ -10,10 +10,10 @@ import ( "strings" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_12/v139.go b/models/migrations/v1_12/v139.go index cd7963524e..5b6576951d 100644 --- a/models/migrations/v1_12/v139.go +++ b/models/migrations/v1_12/v139.go @@ -4,7 +4,7 @@ package v1_12 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v140.go b/models/migrations/v1_13/v140.go index d74f808e9f..2d3337012d 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" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v142.go b/models/migrations/v1_13/v142.go index 7490e0f3b4..7c7c01ad47 100644 --- a/models/migrations/v1_13/v142.go +++ b/models/migrations/v1_13/v142.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 1f9120e2ba..885768dff3 100644 --- a/models/migrations/v1_13/v143.go +++ b/models/migrations/v1_13/v143.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v144.go b/models/migrations/v1_13/v144.go index 7e801eab8a..f5a0bc5751 100644 --- a/models/migrations/v1_13/v144.go +++ b/models/migrations/v1_13/v144.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 a01f577ed1..5b38f1cd80 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" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v146.go b/models/migrations/v1_13/v146.go index a1b54ee3aa..7d9a878704 100644 --- a/models/migrations/v1_13/v146.go +++ b/models/migrations/v1_13/v146.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v147.go b/models/migrations/v1_13/v147.go index cc57504c74..510ef39b28 100644 --- a/models/migrations/v1_13/v147.go +++ b/models/migrations/v1_13/v147.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v149.go b/models/migrations/v1_13/v149.go index 3a0c5909d5..2a1db04cbb 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v150.go b/models/migrations/v1_13/v150.go index be14fd130c..d5ba489566 100644 --- a/models/migrations/v1_13/v150.go +++ b/models/migrations/v1_13/v150.go @@ -4,8 +4,8 @@ package v1_13 //nolint import ( - "forgejo.org/models/migrations/base" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_13/v151.go b/models/migrations/v1_13/v151.go index 60339962cb..ea4a8eae31 100644 --- a/models/migrations/v1_13/v151.go +++ b/models/migrations/v1_13/v151.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 cf31190781..60cc56713e 100644 --- a/models/migrations/v1_13/v154.go +++ b/models/migrations/v1_13/v154.go @@ -4,7 +4,7 @@ package v1_13 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/main_test.go b/models/migrations/v1_14/main_test.go index c01faedc35..cf7fcb56a6 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 b6dc91a054..2cf4954a15 100644 --- a/models/migrations/v1_14/v156.go +++ b/models/migrations/v1_14/v156.go @@ -8,9 +8,9 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v158.go b/models/migrations/v1_14/v158.go index 9849d5a9ea..2d688b1706 100644 --- a/models/migrations/v1_14/v158.go +++ b/models/migrations/v1_14/v158.go @@ -7,8 +7,8 @@ import ( "fmt" "strconv" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v159.go b/models/migrations/v1_14/v159.go index fdd7e12449..149ae0f6a8 100644 --- a/models/migrations/v1_14/v159.go +++ b/models/migrations/v1_14/v159.go @@ -4,8 +4,8 @@ package v1_14 //nolint import ( - "forgejo.org/models/migrations/base" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v161.go b/models/migrations/v1_14/v161.go index 6e904cfab6..ac7e821a80 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" - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v162.go b/models/migrations/v1_14/v162.go index 5d6d7c2e3f..2e4e0b8eb0 100644 --- a/models/migrations/v1_14/v162.go +++ b/models/migrations/v1_14/v162.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v163.go b/models/migrations/v1_14/v163.go index 60fc98c0a4..0cd8ba68c8 100644 --- a/models/migrations/v1_14/v163.go +++ b/models/migrations/v1_14/v163.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v165.go b/models/migrations/v1_14/v165.go index 9315e44197..5b1a779294 100644 --- a/models/migrations/v1_14/v165.go +++ b/models/migrations/v1_14/v165.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/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 d49b70f5ad..0f9bef902a 100644 --- a/models/migrations/v1_14/v172.go +++ b/models/migrations/v1_14/v172.go @@ -4,7 +4,7 @@ package v1_14 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v175.go b/models/migrations/v1_14/v175.go index 3cda5772a0..70d72b2600 100644 --- a/models/migrations/v1_14/v175.go +++ b/models/migrations/v1_14/v175.go @@ -7,8 +7,8 @@ import ( "fmt" "regexp" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_14/v176_test.go b/models/migrations/v1_14/v176_test.go index d88ff207e7..f5e644e501 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 199a71186a..cf5e745d39 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/timeutil" + migration_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/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 6c04d3f5ee..e4960658d3 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 b990583303..f6b142eb42 100644 --- a/models/migrations/v1_15/v179.go +++ b/models/migrations/v1_15/v179.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/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 02fbd57cdb..c71e771861 100644 --- a/models/migrations/v1_15/v180.go +++ b/models/migrations/v1_15/v180.go @@ -4,8 +4,8 @@ package v1_15 //nolint import ( - "forgejo.org/modules/json" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 4544ca6520..ead26f5fcf 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 6865cafac4..eb21311339 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 aaad64c220..effad1b467 100644 --- a/models/migrations/v1_15/v183.go +++ b/models/migrations/v1_15/v183.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v184.go b/models/migrations/v1_15/v184.go index 41b64d4743..871c9db18a 100644 --- a/models/migrations/v1_15/v184.go +++ b/models/migrations/v1_15/v184.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v186.go b/models/migrations/v1_15/v186.go index ad75822de5..01aab3add5 100644 --- a/models/migrations/v1_15/v186.go +++ b/models/migrations/v1_15/v186.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_15/v187.go b/models/migrations/v1_15/v187.go index b573fc52ef..21cd6772b7 100644 --- a/models/migrations/v1_15/v187.go +++ b/models/migrations/v1_15/v187.go @@ -4,7 +4,7 @@ package v1_15 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/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 6f891f3e94..49611776dd 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 1ee72d9c39..5649645051 100644 --- a/models/migrations/v1_16/v189.go +++ b/models/migrations/v1_16/v189.go @@ -7,8 +7,8 @@ import ( "encoding/binary" "fmt" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/json" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/json" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v189_test.go b/models/migrations/v1_16/v189_test.go index e72c385168..88c6ebd2b1 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/json" + migration_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/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 567f88d6d1..c618783c08 100644 --- a/models/migrations/v1_16/v191.go +++ b/models/migrations/v1_16/v191.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v192.go b/models/migrations/v1_16/v192.go index 731b9fb43a..2d5d158a09 100644 --- a/models/migrations/v1_16/v192.go +++ b/models/migrations/v1_16/v192.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/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 ab39bcd98c..0da670888b 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 71234a6fb3..9a62fc9649 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 8b3c73addc..115bb313a0 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_16/v205.go b/models/migrations/v1_16/v205.go index a064b9830d..d6c577083c 100644 --- a/models/migrations/v1_16/v205.go +++ b/models/migrations/v1_16/v205.go @@ -4,7 +4,7 @@ package v1_16 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/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 375a008e18..db45b11aed 100644 --- a/models/migrations/v1_16/v210.go +++ b/models/migrations/v1_16/v210.go @@ -10,7 +10,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/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 010cd8a770..7321350de2 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/timeutil" + migration_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/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 0a8e05ab5f..8a787f68b6 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 2337adcc80..e3f9437121 100644 --- a/models/migrations/v1_17/v212.go +++ b/models/migrations/v1_17/v212.go @@ -4,7 +4,7 @@ package v1_17 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v215.go b/models/migrations/v1_17/v215.go index 5aae798562..b338f85417 100644 --- a/models/migrations/v1_17/v215.go +++ b/models/migrations/v1_17/v215.go @@ -4,8 +4,8 @@ package v1_17 //nolint import ( - "forgejo.org/models/pull" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/pull" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v217.go b/models/migrations/v1_17/v217.go index 5f096d4824..3f970b68a5 100644 --- a/models/migrations/v1_17/v217.go +++ b/models/migrations/v1_17/v217.go @@ -4,7 +4,7 @@ package v1_17 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v218.go b/models/migrations/v1_17/v218.go index 5e3dcd0841..4c05a9b539 100644 --- a/models/migrations/v1_17/v218.go +++ b/models/migrations/v1_17/v218.go @@ -4,8 +4,8 @@ package v1_17 //nolint import ( - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 e90656090f..d266029fd9 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" - "forgejo.org/models/repo" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v220.go b/models/migrations/v1_17/v220.go index 61bbf19725..d4007163ab 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 "forgejo.org/models/packages" - container_module "forgejo.org/modules/packages/container" + packages_model "code.gitea.io/gitea/models/packages" + container_module "code.gitea.io/gitea/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 84e9a238af..9e159388bd 100644 --- a/models/migrations/v1_17/v221.go +++ b/models/migrations/v1_17/v221.go @@ -7,7 +7,7 @@ import ( "encoding/base32" "fmt" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v221_test.go b/models/migrations/v1_17/v221_test.go index 02607d6b32..0f6db2a54f 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 c9a33f007d..2ffb94eb1c 100644 --- a/models/migrations/v1_17/v222.go +++ b/models/migrations/v1_17/v222.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_17/v223.go b/models/migrations/v1_17/v223.go index 7d92dcf5ae..3592eb1be6 100644 --- a/models/migrations/v1_17/v223.go +++ b/models/migrations/v1_17/v223.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/main_test.go b/models/migrations/v1_18/main_test.go index 33f5c51222..329aa2003a 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 86bcb1323d..b0ac3777fc 100644 --- a/models/migrations/v1_18/v225.go +++ b/models/migrations/v1_18/v225.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v227.go b/models/migrations/v1_18/v227.go index b6250fb76c..5fe5dcd0c9 100644 --- a/models/migrations/v1_18/v227.go +++ b/models/migrations/v1_18/v227.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v228.go b/models/migrations/v1_18/v228.go index 1161c8a4c9..3e7a36de15 100644 --- a/models/migrations/v1_18/v228.go +++ b/models/migrations/v1_18/v228.go @@ -4,7 +4,7 @@ package v1_18 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_18/v229.go b/models/migrations/v1_18/v229.go index f96dde9840..10d9f35097 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" - "forgejo.org/models/issues" + "code.gitea.io/gitea/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 ac5e726a79..b20d0ff3a2 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" - "forgejo.org/models/issues" - migration_tests "forgejo.org/models/migrations/test" + "code.gitea.io/gitea/models/issues" + migration_tests "code.gitea.io/gitea/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 7dd6675673..82b3b8f2b0 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 7c56926f4c..18696a7f69 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 7fb4a5ac8d..9caf587c1e 100644 --- a/models/migrations/v1_19/v232.go +++ b/models/migrations/v1_19/v232.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v233.go b/models/migrations/v1_19/v233.go index 191afd4868..ba4cd8e20b 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" - "forgejo.org/modules/json" - "forgejo.org/modules/secret" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" + "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" "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 de025ca2b7..94e9bc3a11 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/json" - "forgejo.org/modules/secret" - "forgejo.org/modules/setting" - webhook_module "forgejo.org/modules/webhook" + 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" "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 c610a423dd..728a580807 100644 --- a/models/migrations/v1_19/v234.go +++ b/models/migrations/v1_19/v234.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v236.go b/models/migrations/v1_19/v236.go index fa01a6ab80..f172a85b1f 100644 --- a/models/migrations/v1_19/v236.go +++ b/models/migrations/v1_19/v236.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v238.go b/models/migrations/v1_19/v238.go index 7c912a8341..266e6cea58 100644 --- a/models/migrations/v1_19/v238.go +++ b/models/migrations/v1_19/v238.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v240.go b/models/migrations/v1_19/v240.go index 4ca5becede..4505f86299 100644 --- a/models/migrations/v1_19/v240.go +++ b/models/migrations/v1_19/v240.go @@ -4,8 +4,8 @@ package v1_19 //nolint import ( - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_19/v242.go b/models/migrations/v1_19/v242.go index bbf227ef77..4470835214 100644 --- a/models/migrations/v1_19/v242.go +++ b/models/migrations/v1_19/v242.go @@ -4,7 +4,7 @@ package v1_19 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/main_test.go b/models/migrations/v1_20/main_test.go index f870dca429..e8d95b0e1e 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 7e6585388b..b0d4c21502 100644 --- a/models/migrations/v1_20/v245.go +++ b/models/migrations/v1_20/v245.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v247.go b/models/migrations/v1_20/v247.go index 9ed810a623..59fc5c46b5 100644 --- a/models/migrations/v1_20/v247.go +++ b/models/migrations/v1_20/v247.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v249.go b/models/migrations/v1_20/v249.go index d2b096bf58..02951a74d6 100644 --- a/models/migrations/v1_20/v249.go +++ b/models/migrations/v1_20/v249.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/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 cfcde2fc9b..86388ef0b8 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" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v251.go b/models/migrations/v1_20/v251.go index c8665ba7eb..7743248a3f 100644 --- a/models/migrations/v1_20/v251.go +++ b/models/migrations/v1_20/v251.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v252.go b/models/migrations/v1_20/v252.go index bb85c78309..ab61cd9b8b 100644 --- a/models/migrations/v1_20/v252.go +++ b/models/migrations/v1_20/v252.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v253.go b/models/migrations/v1_20/v253.go index 5f4057e9d9..96c494bd8d 100644 --- a/models/migrations/v1_20/v253.go +++ b/models/migrations/v1_20/v253.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v255.go b/models/migrations/v1_20/v255.go index 49b0ecf220..14b70f8f96 100644 --- a/models/migrations/v1_20/v255.go +++ b/models/migrations/v1_20/v255.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v257.go b/models/migrations/v1_20/v257.go index 70f229d73f..6c6ca4c748 100644 --- a/models/migrations/v1_20/v257.go +++ b/models/migrations/v1_20/v257.go @@ -4,7 +4,7 @@ package v1_20 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v259.go b/models/migrations/v1_20/v259.go index f10b94fa9c..5b8ced4ad7 100644 --- a/models/migrations/v1_20/v259.go +++ b/models/migrations/v1_20/v259.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "xorm.io/xorm" ) diff --git a/models/migrations/v1_20/v259_test.go b/models/migrations/v1_20/v259_test.go index d67cc9dd81..ae219ea814 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 7104887afb..0148170458 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 245f3011ab..6ca52c5998 100644 --- a/models/migrations/v1_21/v260.go +++ b/models/migrations/v1_21/v260.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v261.go b/models/migrations/v1_21/v261.go index 743bef152d..4ec1160d0b 100644 --- a/models/migrations/v1_21/v261.go +++ b/models/migrations/v1_21/v261.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v264.go b/models/migrations/v1_21/v264.go index 88eaf0d918..e81a17ad6d 100644 --- a/models/migrations/v1_21/v264.go +++ b/models/migrations/v1_21/v264.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v267.go b/models/migrations/v1_21/v267.go index f94696a22b..bc0e954bdc 100644 --- a/models/migrations/v1_21/v267.go +++ b/models/migrations/v1_21/v267.go @@ -4,7 +4,7 @@ package v1_21 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v271.go b/models/migrations/v1_21/v271.go index f45c113c1f..098f6499d5 100644 --- a/models/migrations/v1_21/v271.go +++ b/models/migrations/v1_21/v271.go @@ -3,7 +3,7 @@ package v1_21 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v273.go b/models/migrations/v1_21/v273.go index 1ec6ade566..61c79f4a76 100644 --- a/models/migrations/v1_21/v273.go +++ b/models/migrations/v1_21/v273.go @@ -3,7 +3,7 @@ package v1_21 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v274.go b/models/migrations/v1_21/v274.go index b74e5fed51..df5994f159 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_21/v276.go b/models/migrations/v1_21/v276.go index 0830c3bd92..67e950177d 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 "forgejo.org/models/repo" - "forgejo.org/modules/setting" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/main_test.go b/models/migrations/v1_22/main_test.go index dc991b78fe..2005789b6d 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 5271c786be..fc1866aa83 100644 --- a/models/migrations/v1_22/v281.go +++ b/models/migrations/v1_22/v281.go @@ -4,7 +4,7 @@ package v1_22 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v283_test.go b/models/migrations/v1_22/v283_test.go index d8e147a131..5f6c04a881 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 d0489e7aeb..97ff649dca 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" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v286_test.go b/models/migrations/v1_22/v286_test.go index e6f8d4096e..76b00e5b14 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 44e4991851..7c93bfcc66 100644 --- a/models/migrations/v1_22/v288.go +++ b/models/migrations/v1_22/v288.go @@ -4,7 +4,7 @@ package v1_22 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v290.go b/models/migrations/v1_22/v290.go index 594e417644..e3c58b0515 100644 --- a/models/migrations/v1_22/v290.go +++ b/models/migrations/v1_22/v290.go @@ -4,8 +4,8 @@ package v1_22 //nolint import ( - "forgejo.org/modules/timeutil" - webhook_module "forgejo.org/modules/webhook" + "code.gitea.io/gitea/modules/timeutil" + webhook_module "code.gitea.io/gitea/modules/webhook" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v290_test.go b/models/migrations/v1_22/v290_test.go index 569d77bc16..ced200f83f 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 "forgejo.org/models/migrations/test" - "forgejo.org/modules/timeutil" - webhook_module "forgejo.org/modules/webhook" + migration_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/modules/timeutil" + webhook_module "code.gitea.io/gitea/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 9f38c3db56..53cc719294 100644 --- a/models/migrations/v1_22/v293.go +++ b/models/migrations/v1_22/v293.go @@ -4,8 +4,8 @@ package v1_22 //nolint import ( - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_22/v293_test.go b/models/migrations/v1_22/v293_test.go index 444146737d..85bb46421b 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" - "forgejo.org/models/db" - migration_tests "forgejo.org/models/migrations/test" - "forgejo.org/models/project" + "code.gitea.io/gitea/models/db" + migration_tests "code.gitea.io/gitea/models/migrations/test" + "code.gitea.io/gitea/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 ef7b67ca5b..c465d53738 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 0fd90a4a67..e3425e4625 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 "forgejo.org/models/migrations/test" + migration_tests "code.gitea.io/gitea/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 c8ed786d63..d7ea03eb3d 100644 --- a/models/migrations/v1_23/v302.go +++ b/models/migrations/v1_23/v302.go @@ -4,7 +4,7 @@ package v1_23 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_23/v303.go b/models/migrations/v1_23/v303.go deleted file mode 100644 index fae0131bdd..0000000000 --- a/models/migrations/v1_23/v303.go +++ /dev/null @@ -1,60 +0,0 @@ -// 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 deleted file mode 100644 index f105d11830..0000000000 --- a/models/migrations/v1_23/v303_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// 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 ec6bd09bb5..74434a84a1 100644 --- a/models/migrations/v1_6/v70.go +++ b/models/migrations/v1_6/v70.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_6/v71.go b/models/migrations/v1_6/v71.go index 3706ad4406..586187228b 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" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/xorm" ) diff --git a/models/migrations/v1_6/v72.go b/models/migrations/v1_6/v72.go index 4df2a0f6e9..04cef9a170 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v76.go b/models/migrations/v1_8/v76.go index 61ad006a47..d3fbd94deb 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" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v78.go b/models/migrations/v1_8/v78.go index 8102b19335..8f041c1484 100644 --- a/models/migrations/v1_8/v78.go +++ b/models/migrations/v1_8/v78.go @@ -4,7 +4,7 @@ package v1_8 //nolint import ( - "forgejo.org/models/migrations/base" + "code.gitea.io/gitea/models/migrations/base" "xorm.io/xorm" ) diff --git a/models/migrations/v1_8/v79.go b/models/migrations/v1_8/v79.go index f7d2d68f96..eb3a9ed0f4 100644 --- a/models/migrations/v1_8/v79.go +++ b/models/migrations/v1_8/v79.go @@ -4,7 +4,7 @@ package v1_8 //nolint import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v82.go b/models/migrations/v1_9/v82.go index 78a90bdde9..26806dd645 100644 --- a/models/migrations/v1_9/v82.go +++ b/models/migrations/v1_9/v82.go @@ -8,8 +8,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v83.go b/models/migrations/v1_9/v83.go index fa24a92d28..10e6c45875 100644 --- a/models/migrations/v1_9/v83.go +++ b/models/migrations/v1_9/v83.go @@ -4,7 +4,7 @@ package v1_9 //nolint import ( - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/xorm" ) diff --git a/models/migrations/v1_9/v85.go b/models/migrations/v1_9/v85.go index d8e9d91840..a23d7c5d6e 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" - "forgejo.org/models/migrations/base" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/xorm" ) diff --git a/models/org.go b/models/org.go index 6e191acff0..5f61f05b16 100644 --- a/models/org.go +++ b/models/org.go @@ -8,10 +8,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" + "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" ) // RemoveOrgUser removes user from given organization. diff --git a/models/org_team.go b/models/org_team.go index ecda43f0a9..1a452436c3 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -9,16 +9,16 @@ import ( "fmt" "strings" - "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" + "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" "xorm.io/builder" ) diff --git a/models/org_team_test.go b/models/org_team_test.go index dc1fdb4b3b..2819607e12 100644 --- a/models/org_team_test.go +++ b/models/org_team_test.go @@ -7,13 +7,13 @@ import ( "strings" "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/org_test.go b/models/org_test.go index 45e21da0e0..bb5e524ec9 100644 --- a/models/org_test.go +++ b/models/org_test.go @@ -6,10 +6,10 @@ package models import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "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 deleted file mode 100644 index 79b6fc613e..0000000000 --- a/models/organization/TestFindOrgs/org_user.yml +++ /dev/null @@ -1,5 +0,0 @@ -- - id: 1000 - uid: 4 - org_id: 22 - is_public: true diff --git a/models/organization/main_test.go b/models/organization/main_test.go index dd10b60d30..c35898a465 100644 --- a/models/organization/main_test.go +++ b/models/organization/main_test.go @@ -6,15 +6,14 @@ package organization_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "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" + _ "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" ) func TestMain(m *testing.M) { diff --git a/models/organization/mini_org.go b/models/organization/mini_org.go new file mode 100644 index 0000000000..b1b24624c5 --- /dev/null +++ b/models/organization/mini_org.go @@ -0,0 +1,78 @@ +// 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 1339f7415d..379c30b5bc 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -9,21 +9,28 @@ import ( "fmt" "strings" - 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" + 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" "xorm.io/builder" ) +// ________ .__ __ .__ +// \_____ \_______ _________ ____ |__|____________ _/ |_|__| ____ ____ +// / | \_ __ \/ ___\__ \ / \| \___ /\__ \\ __\ |/ _ \ / \ +// / | \ | \/ /_/ > __ \| | \ |/ / / __ \| | | ( <_> ) | \ +// \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / +// \/ /_____/ \/ \/ \/ \/ \/ + // ErrOrgNotExist represents a "OrgNotExist" kind of error. type ErrOrgNotExist struct { ID int64 @@ -134,9 +141,8 @@ func (org *Organization) LoadTeams(ctx context.Context) ([]*Team, error) { } // GetMembers returns all members of organization. -func (org *Organization) GetMembers(ctx context.Context, doer *user_model.User) (user_model.UserList, map[int64]bool, error) { +func (org *Organization) GetMembers(ctx context.Context) (user_model.UserList, map[int64]bool, error) { return FindOrgMembers(ctx, &FindOrgMembersOpts{ - Doer: doer, OrgID: org.ID, }) } @@ -189,22 +195,16 @@ func (org *Organization) CanCreateRepo() bool { // FindOrgMembersOpts represensts find org members conditions type FindOrgMembersOpts struct { db.ListOptions - Doer *user_model.User - IsDoerMember bool - OrgID int64 -} - -func (opts FindOrgMembersOpts) PublicOnly() bool { - return opts.Doer == nil || !(opts.IsDoerMember || opts.Doer.IsAdmin) + OrgID int64 + PublicOnly bool } // 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)) } @@ -439,6 +439,42 @@ 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. @@ -471,13 +507,26 @@ 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 deleted file mode 100644 index e387936473..0000000000 --- a/models/organization/org_list.go +++ /dev/null @@ -1,144 +0,0 @@ -// 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 deleted file mode 100644 index 619427a719..0000000000 --- a/models/organization/org_list_test.go +++ /dev/null @@ -1,105 +0,0 @@ -// 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 f190a38bda..f7e59928f4 100644 --- a/models/organization/org_repo.go +++ b/models/organization/org_repo.go @@ -6,8 +6,8 @@ package organization import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/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 212b893a42..21d954b884 100644 --- a/models/organization/org_test.go +++ b/models/organization/org_test.go @@ -4,17 +4,16 @@ package organization_test import ( - "sort" "testing" - "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" + "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" + "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/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -107,7 +106,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, &user_model.User{IsAdmin: true}) + members, _, err := org.GetMembers(db.DefaultContext) require.NoError(t, err) if assert.Len(t, members, 3) { assert.Equal(t, int64(2), members[0].ID) @@ -131,6 +130,15 @@ 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) { @@ -175,45 +183,67 @@ 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()) - 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 + orgUsers, err := organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ + ListOptions: db.ListOptions{}, + OrgID: 3, + PublicOnly: false, }) - 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) + 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]) + } orgUsers, err = organization.GetOrgUsersByOrgID(db.DefaultContext, &organization.FindOrgMembersOpts{ ListOptions: db.ListOptions{}, OrgID: unittest.NonexistentID, + PublicOnly: false, }) require.NoError(t, err) assert.Empty(t, orgUsers) diff --git a/models/organization/org_user.go b/models/organization/org_user.go index 81671c5cf5..5fe3a178d2 100644 --- a/models/organization/org_user.go +++ b/models/organization/org_user.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" + "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" "xorm.io/builder" ) diff --git a/models/organization/org_user_test.go b/models/organization/org_user_test.go index 3f6799e8a1..07d07ce3b8 100644 --- a/models/organization/org_user_test.go +++ b/models/organization/org_user_test.go @@ -7,11 +7,11 @@ import ( "fmt" "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "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" "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, &user_model.User{IsAdmin: true}) + _, membersIsPublic, err := org.GetMembers(db.DefaultContext) 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, &user_model.User{IsAdmin: true}) + members, _, err := org.GetMembers(db.DefaultContext) 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 c78eff39fb..ddff32cb8c 100644 --- a/models/organization/team.go +++ b/models/organization/team.go @@ -9,13 +9,13 @@ import ( "fmt" "strings" - "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" + "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" "xorm.io/builder" ) @@ -247,6 +247,22 @@ 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)) @@ -292,11 +308,3 @@ func FixInconsistentOwnerTeams(ctx context.Context) (int64, error) { 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 45be6c4c64..17f6c59610 100644 --- a/models/organization/team_invite.go +++ b/models/organization/team_invite.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/builder" ) diff --git a/models/organization/team_invite_test.go b/models/organization/team_invite_test.go index 8d55864237..cbabf79b49 100644 --- a/models/organization/team_invite_test.go +++ b/models/organization/team_invite_test.go @@ -6,10 +6,10 @@ package organization_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "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 573fd4ef96..5b45429acf 100644 --- a/models/organization/team_list.go +++ b/models/organization/team_list.go @@ -7,10 +7,10 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" + "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" "xorm.io/builder" ) diff --git a/models/organization/team_repo.go b/models/organization/team_repo.go index 334b139808..1184e39263 100644 --- a/models/organization/team_repo.go +++ b/models/organization/team_repo.go @@ -6,9 +6,9 @@ package organization import ( "context" - "forgejo.org/models/db" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + repo_model "code.gitea.io/gitea/models/repo" "xorm.io/builder" ) diff --git a/models/organization/team_test.go b/models/organization/team_test.go index 1be96b6a01..601d136d87 100644 --- a/models/organization/team_test.go +++ b/models/organization/team_test.go @@ -4,12 +4,14 @@ package organization_test import ( + "path/filepath" "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -186,8 +188,28 @@ func TestHasTeamRepo(t *testing.T) { test(2, 5, false) } +func TestUsersInTeamsCount(t *testing.T) { + 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) + } + + 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 +} + func TestInconsistentOwnerTeam(t *testing.T) { - defer unittest.OverrideFixtures("models/organization/TestInconsistentOwnerTeam")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"models/organization/TestInconsistentOwnerTeam/"}, + }, + )() require.NoError(t, unittest.PrepareTestDatabase()) unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{ID: 1000, TeamID: 1000, AccessMode: perm.AccessModeNone}) diff --git a/models/organization/team_unit.go b/models/organization/team_unit.go index b45ac2fc07..3087b70770 100644 --- a/models/organization/team_unit.go +++ b/models/organization/team_unit.go @@ -6,9 +6,9 @@ package organization import ( "context" - "forgejo.org/models/db" - "forgejo.org/models/perm" - "forgejo.org/models/unit" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/unit" ) // TeamUnit describes all units of a repository @@ -28,3 +28,24 @@ 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 a954e94767..ab767db200 100644 --- a/models/organization/team_user.go +++ b/models/organization/team_user.go @@ -6,8 +6,8 @@ package organization import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" "xorm.io/builder" ) @@ -76,3 +76,14 @@ 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 1cc808d18d..77eccb90ed 100644 --- a/models/packages/alpine/search.go +++ b/models/packages/alpine/search.go @@ -6,8 +6,8 @@ package alpine import ( "context" - packages_model "forgejo.org/models/packages" - alpine_module "forgejo.org/modules/packages/alpine" + packages_model "code.gitea.io/gitea/models/packages" + alpine_module "code.gitea.io/gitea/modules/packages/alpine" ) // GetBranches gets all available branches diff --git a/models/packages/alt/search.go b/models/packages/alt/search.go deleted file mode 100644 index 0bfba77e0e..0000000000 --- a/models/packages/alt/search.go +++ /dev/null @@ -1,29 +0,0 @@ -// 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 5e09c4b63f..0d888a1ec8 100644 --- a/models/packages/conan/references.go +++ b/models/packages/conan/references.go @@ -8,11 +8,11 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - "forgejo.org/models/packages" - conan_module "forgejo.org/modules/packages/conan" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" "xorm.io/builder" ) diff --git a/models/packages/conan/search.go b/models/packages/conan/search.go index 3ef8b4cceb..ab0bff5968 100644 --- a/models/packages/conan/search.go +++ b/models/packages/conan/search.go @@ -9,10 +9,10 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/modules/container" - conan_module "forgejo.org/modules/packages/conan" + "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" "xorm.io/builder" ) diff --git a/models/packages/conda/search.go b/models/packages/conda/search.go index 147de1aa02..887441e3b2 100644 --- a/models/packages/conda/search.go +++ b/models/packages/conda/search.go @@ -7,9 +7,9 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/models/packages" - conda_module "forgejo.org/modules/packages/conda" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + conda_module "code.gitea.io/gitea/modules/packages/conda" "xorm.io/builder" ) diff --git a/models/packages/container/search.go b/models/packages/container/search.go index 1dab7c7b79..5df35117ce 100644 --- a/models/packages/container/search.go +++ b/models/packages/container/search.go @@ -8,11 +8,11 @@ import ( "strings" "time" - "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" + "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" "xorm.io/builder" ) diff --git a/models/packages/cran/search.go b/models/packages/cran/search.go index 35525dfd55..8a8b52a35e 100644 --- a/models/packages/cran/search.go +++ b/models/packages/cran/search.go @@ -8,9 +8,9 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - "forgejo.org/models/packages" - cran_module "forgejo.org/modules/packages/cran" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + cran_module "code.gitea.io/gitea/modules/packages/cran" "xorm.io/builder" ) diff --git a/models/packages/debian/search.go b/models/packages/debian/search.go index a434a06d2a..abf23e42f6 100644 --- a/models/packages/debian/search.go +++ b/models/packages/debian/search.go @@ -7,10 +7,10 @@ import ( "context" "strconv" - "forgejo.org/models/db" - "forgejo.org/models/packages" - debian_module "forgejo.org/modules/packages/debian" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + debian_module "code.gitea.io/gitea/modules/packages/debian" + "code.gitea.io/gitea/modules/setting" "xorm.io/builder" ) diff --git a/models/packages/debian/search_test.go b/models/packages/debian/search_test.go index b8ed98d8fa..104a01498b 100644 --- a/models/packages/debian/search_test.go +++ b/models/packages/debian/search_test.go @@ -7,19 +7,18 @@ 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" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + packages_service "code.gitea.io/gitea/services/packages" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/packages/descriptor.go b/models/packages/descriptor.go index 19e0e8f5d5..803b73c968 100644 --- a/models/packages/descriptor.go +++ b/models/packages/descriptor.go @@ -9,30 +9,30 @@ import ( "fmt" "net/url" - 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" + 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" "github.com/hashicorp/go-version" ) @@ -110,12 +110,9 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc if err != nil { 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 - } + 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 { @@ -190,8 +187,6 @@ 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 deleted file mode 100644 index f9083d705d..0000000000 --- a/models/packages/main_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 af83c27c66..7a505ff08f 100644 --- a/models/packages/nuget/search.go +++ b/models/packages/nuget/search.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" "xorm.io/builder" ) diff --git a/models/packages/package.go b/models/packages/package.go index 3b01d0b1ea..364cc2e7cc 100644 --- a/models/packages/package.go +++ b/models/packages/package.go @@ -9,8 +9,8 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" "xorm.io/xorm" @@ -51,7 +51,6 @@ const ( TypePub Type = "pub" TypePyPI Type = "pypi" TypeRpm Type = "rpm" - TypeAlt Type = "alt" TypeRubyGems Type = "rubygems" TypeSwift Type = "swift" TypeVagrant Type = "vagrant" @@ -77,7 +76,6 @@ var TypeList = []Type{ TypePub, TypePyPI, TypeRpm, - TypeAlt, TypeRubyGems, TypeSwift, TypeVagrant, @@ -124,8 +122,6 @@ func (pt Type) Name() string { return "PyPI" case TypeRpm: return "RPM" - case TypeAlt: - return "Alt" case TypeRubyGems: return "RubyGems" case TypeSwift: @@ -177,8 +173,6 @@ 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: @@ -242,11 +236,6 @@ 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 0de4434ef8..d9c30b6533 100644 --- a/models/packages/package_blob.go +++ b/models/packages/package_blob.go @@ -8,13 +8,13 @@ import ( "strconv" "time" - "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" + "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" "xorm.io/builder" ) @@ -34,7 +34,6 @@ 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"` } @@ -44,19 +43,13 @@ func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool, existing := &PackageBlob{} - 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) + 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) if err != nil { return nil, false, err } diff --git a/models/packages/package_blob_test.go b/models/packages/package_blob_test.go deleted file mode 100644 index 664dfa4d81..0000000000 --- a/models/packages/package_blob_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// 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 ddffb6c305..4b0e789221 100644 --- a/models/packages/package_blob_upload.go +++ b/models/packages/package_blob_upload.go @@ -8,9 +8,9 @@ import ( "strings" "time" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/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 d0765c8492..fa12dec406 100644 --- a/models/packages/package_cleanup_rule.go +++ b/models/packages/package_cleanup_rule.go @@ -8,9 +8,9 @@ import ( "fmt" "regexp" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/packages/package_file.go b/models/packages/package_file.go index d4bcc2859a..1bb6b57a34 100644 --- a/models/packages/package_file.go +++ b/models/packages/package_file.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/packages/package_property.go b/models/packages/package_property.go index c4e7be342b..e0170016cf 100644 --- a/models/packages/package_property.go +++ b/models/packages/package_property.go @@ -6,7 +6,7 @@ package packages import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "xorm.io/builder" ) diff --git a/models/packages/package_test.go b/models/packages/package_test.go index 3c1ec413fd..1c96e08f0c 100644 --- a/models/packages/package_test.go +++ b/models/packages/package_test.go @@ -7,15 +7,23 @@ package packages_test import ( "testing" - "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" + "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" "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 79086ff1ad..278e8e3a86 100644 --- a/models/packages/package_version.go +++ b/models/packages/package_version.go @@ -8,10 +8,10 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/optional" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/packages/rpm/search.go b/models/packages/rpm/search.go index d4f065a89e..e697421b49 100644 --- a/models/packages/rpm/search.go +++ b/models/packages/rpm/search.go @@ -6,8 +6,8 @@ package rpm import ( "context" - packages_model "forgejo.org/models/packages" - rpm_module "forgejo.org/modules/packages/rpm" + packages_model "code.gitea.io/gitea/models/packages" + rpm_module "code.gitea.io/gitea/modules/packages/rpm" ) // GetGroups gets all available groups diff --git a/models/perm/access/access.go b/models/perm/access/access.go index 76b547f772..3e2568b4b4 100644 --- a/models/perm/access/access.go +++ b/models/perm/access/access.go @@ -8,11 +8,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" + "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" "xorm.io/builder" ) diff --git a/models/perm/access/access_test.go b/models/perm/access/access_test.go index 00939bced6..556f51311c 100644 --- a/models/perm/access/access_test.go +++ b/models/perm/access/access_test.go @@ -6,12 +6,12 @@ package access_test import ( "testing" - "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" + "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" "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 0c27d022e0..0a350dc41e 100644 --- a/models/perm/access/main_test.go +++ b/models/perm/access/main_test.go @@ -6,14 +6,13 @@ package access_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/repo" - _ "forgejo.org/models/user" + _ "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" ) func TestMain(m *testing.M) { diff --git a/models/perm/access/repo_permission.go b/models/perm/access/repo_permission.go index ce9963b83a..7e39627a75 100644 --- a/models/perm/access/repo_permission.go +++ b/models/perm/access/repo_permission.go @@ -7,13 +7,13 @@ import ( "context" "fmt" - "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" + "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" ) // 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 52917cb9fd..222f448599 100644 --- a/models/project/column.go +++ b/models/project/column.go @@ -9,10 +9,10 @@ import ( "fmt" "regexp" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) @@ -57,6 +57,20 @@ 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). @@ -291,11 +305,22 @@ 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 2ef27de3b5..b02a5b540f 100644 --- a/models/project/column_test.go +++ b/models/project/column_test.go @@ -5,10 +5,11 @@ package project import ( "fmt" + "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -123,5 +124,5 @@ func Test_NewColumn(t *testing.T) { ProjectID: project1.ID, }) require.Error(t, err) - assert.Contains(t, err.Error(), "maximum number of columns reached") + assert.True(t, strings.Contains(err.Error(), "maximum number of columns reached")) } diff --git a/models/project/issue.go b/models/project/issue.go index 9e9db19004..3361b533b9 100644 --- a/models/project/issue.go +++ b/models/project/issue.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // ProjectIssue saves relation from issue to a project @@ -34,6 +34,20 @@ 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 eaa13bf309..f4b2d6feda 100644 --- a/models/project/main_test.go +++ b/models/project/main_test.go @@ -6,9 +6,9 @@ package project import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/repo" + _ "code.gitea.io/gitea/models/repo" ) func TestMain(m *testing.M) { diff --git a/models/project/project.go b/models/project/project.go index b9813fda91..8cebf34b5e 100644 --- a/models/project/project.go +++ b/models/project/project.go @@ -8,14 +8,14 @@ import ( "fmt" "html/template" - "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" + "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" "xorm.io/builder" ) @@ -126,14 +126,6 @@ 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 { @@ -142,7 +134,7 @@ func (p *Project) Link(ctx context.Context) string { log.Error("LoadOwner: %v", err) return "" } - return ProjectLinkForOrg(p.Owner, p.ID) + return fmt.Sprintf("%s/-/projects/%d", p.Owner.HomeLink(), p.ID) } if p.RepoID > 0 { err := p.LoadRepo(ctx) @@ -150,7 +142,7 @@ func (p *Project) Link(ctx context.Context) string { log.Error("LoadRepo: %v", err) return "" } - return ProjectLinkForRepo(p.Repo, p.ID) + return fmt.Sprintf("%s/projects/%d", p.Repo.Link(), p.ID) } return "" } @@ -250,7 +242,6 @@ 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 @@ -264,8 +255,6 @@ 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 @@ -313,7 +302,6 @@ 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", @@ -368,6 +356,21 @@ 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 ee9fdaa2e2..8c660b929a 100644 --- a/models/project/project_test.go +++ b/models/project/project_test.go @@ -6,9 +6,9 @@ package project import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/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, ChangeProjectStatusByRepoIDAndID(db.DefaultContext, project.RepoID, project.ID, true)) + require.NoError(t, ChangeProjectStatus(db.DefaultContext, project, 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 63f572309b..f31159a8d8 100644 --- a/models/pull/automerge.go +++ b/models/pull/automerge.go @@ -7,22 +7,21 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "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" ) // 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"` - DeleteBranchAfterMerge bool `xorm:"NOT NULL DEFAULT false"` - 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"` + CreatedUnix timeutil.TimeStamp `xorm:"created"` } // TableName return database table name for xorm @@ -50,7 +49,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, deleteBranch bool) error { +func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error { // Check if we already have a merge scheduled for that pull request if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { return err @@ -59,11 +58,10 @@ 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, - DeleteBranchAfterMerge: deleteBranch, + DoerID: doer.ID, + PullID: pullID, + MergeStyle: style, + Message: message, }) return err } diff --git a/models/pull/review_state.go b/models/pull/review_state.go index 2702d5d5a1..e46a22a49d 100644 --- a/models/pull/review_state.go +++ b/models/pull/review_state.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 9f655d7847..6b553d6f71 100644 --- a/models/quota/default.go +++ b/models/quota/default.go @@ -4,10 +4,10 @@ package quota import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) -func EvaluateDefault(used Used, forSubject LimitSubject) (bool, int64) { +func EvaluateDefault(used Used, forSubject LimitSubject) bool { groups := GroupList{ &Group{ Name: "builtin-default-group", diff --git a/models/quota/group.go b/models/quota/group.go index 7ddc20b2d6..0acb5b255e 100644 --- a/models/quota/group.go +++ b/models/quota/group.go @@ -5,11 +5,10 @@ package quota import ( "context" - "math" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" "xorm.io/builder" ) @@ -200,20 +199,15 @@ var affectsMap = map[LimitSubject]LimitSubjects{ }, } -// 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) { +func (g *Group) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { var found bool - foundLimit := int64(math.MaxInt64) for _, rule := range g.Rules { ok, has := rule.Evaluate(used, forSubject) if has { - if !ok { - return false, true, rule.Limit - } found = true - foundLimit = min(foundLimit, rule.Limit) + if !ok { + return false, true + } } } @@ -222,35 +216,32 @@ func (g *Group) Evaluate(used Used, forSubject LimitSubject) (bool, bool, int64) // subjects below for _, subject := range affectsMap[forSubject] { - ok, has, limit := g.Evaluate(used, subject) + ok, has := g.Evaluate(used, subject) if has { - if !ok { - return false, true, limit - } found = true - foundLimit = min(foundLimit, limit) + if !ok { + return false, true + } } } } - return true, found, foundLimit + return true, found } -// 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) { +func (gl *GroupList) Evaluate(used Used, forSubject LimitSubject) bool { // 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, limit := group.Evaluate(used, forSubject) + ok, has := group.Evaluate(used, forSubject) if has && ok { - return true, limit + return true } } - return false, 0 + return false } func GetGroupByName(ctx context.Context, name string) (*Group, error) { diff --git a/models/quota/main_test.go b/models/quota/main_test.go deleted file mode 100644 index ec0a0e0013..0000000000 --- a/models/quota/main_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 9f1c3ca949..d38bfab3cc 100644 --- a/models/quota/quota.go +++ b/models/quota/quota.go @@ -6,8 +6,8 @@ package quota import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" ) func init() { @@ -32,6 +32,5 @@ func EvaluateForUser(ctx context.Context, userID int64, subject LimitSubject) (b return false, err } - acceptable, _ := groups.Evaluate(*used, subject) - return acceptable, nil + return groups.Evaluate(*used, subject), nil } diff --git a/models/quota/quota_group_test.go b/models/quota/quota_group_test.go index 7f693b391b..bc258588f9 100644 --- a/models/quota/quota_group_test.go +++ b/models/quota/quota_group_test.go @@ -4,10 +4,9 @@ package quota_test import ( - "math" "testing" - quota_model "forgejo.org/models/quota" + quota_model "code.gitea.io/gitea/models/quota" "github.com/stretchr/testify/assert" ) @@ -37,10 +36,9 @@ 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, limit := group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has := group.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, has) assert.False(t, ok) - assert.EqualValues(t, 0, limit) } func TestQuotaGroupRuleScenario1(t *testing.T) { @@ -68,25 +66,21 @@ func TestQuotaGroupRuleScenario1(t *testing.T) { used.Size.Assets.Packages.All = 256 used.Size.Git.LFS = 16 - ok, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeAssetsAttachmentsReleases) + ok, has := 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, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) + ok, has = 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, limit = group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) + ok, has = 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, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has = 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) { @@ -115,27 +109,23 @@ func TestQuotaGroupRuleCombination(t *testing.T) { } // Git LFS isn't covered by any rule - _, has, limit := group.Evaluate(used, quota_model.LimitSubjectSizeGitLFS) + _, has := 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, limit := group.Evaluate(used, quota_model.LimitSubjectSizeReposAll) + ok, has := 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, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAssetsPackagesAll) + ok, has = 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, limit = group.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok, has = 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) { @@ -169,9 +159,8 @@ func TestQuotaGroupListsRequireOnlyOnePassing(t *testing.T) { used.Size.Repos.Public = 1024 // In a group list, if any group passes, the entire evaluation passes. - ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.True(t, ok) - assert.EqualValues(t, -1, limit) } func TestQuotaGroupListAllFailing(t *testing.T) { @@ -204,9 +193,8 @@ func TestQuotaGroupListAllFailing(t *testing.T) { used := quota_model.Used{} used.Size.Repos.Public = 2048 - ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) assert.False(t, ok) - assert.EqualValues(t, 0, limit) } func TestQuotaGroupListEmpty(t *testing.T) { @@ -215,7 +203,6 @@ func TestQuotaGroupListEmpty(t *testing.T) { used := quota_model.Used{} used.Size.Repos.Public = 2048 - ok, limit := groups.Evaluate(used, quota_model.LimitSubjectSizeAll) + ok := 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 59c05563f0..1e1daf4c4a 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 "forgejo.org/models/quota" + quota_model "code.gitea.io/gitea/models/quota" "github.com/stretchr/testify/assert" ) diff --git a/models/quota/rule.go b/models/quota/rule.go index 89cb57cace..b0c6c0f4b6 100644 --- a/models/quota/rule.go +++ b/models/quota/rule.go @@ -7,7 +7,7 @@ import ( "context" "slices" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) type Rule struct { @@ -20,22 +20,6 @@ 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 { @@ -47,7 +31,11 @@ func (r Rule) Evaluate(used Used, forSubject LimitSubject) (bool, bool) { return false, false } - return r.Sum(used) <= r.Limit, true + var sum int64 + for _, subject := range r.Subjects { + sum += used.CalculateFor(subject) + } + return sum <= 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 22815165f6..ff84ac20f8 100644 --- a/models/quota/used.go +++ b/models/quota/used.go @@ -6,10 +6,10 @@ package quota import ( "context" - action_model "forgejo.org/models/actions" - "forgejo.org/models/db" - package_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" + 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" "xorm.io/builder" ) @@ -131,8 +131,7 @@ 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"). - Where("`action_artifact`.status != ?", action_model.ArtifactStatusExpired) + Join("INNER", "`repository`", "`action_artifact`.repo_id = `repository`.id") case "packages": session = session. Table("package_version"). diff --git a/models/quota/used_test.go b/models/quota/used_test.go deleted file mode 100644 index 82cc5b9bcc..0000000000 --- a/models/quota/used_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// 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 6f7ae25615..0dc8ee5df3 100644 --- a/models/repo.go +++ b/models/repo.go @@ -11,16 +11,14 @@ import ( _ "image/jpeg" // Needed for jpeg support - 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" + 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" ) // Init initialize model @@ -29,7 +27,7 @@ func Init(ctx context.Context) error { } type repoChecker struct { - querySQL func(ctx context.Context) ([]int64, error) + querySQL func(ctx context.Context) ([]map[string][]byte, error) correctSQL func(ctx context.Context, id int64) error desc string } @@ -40,7 +38,8 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) { log.Error("Select %s: %v", checker.desc, err) return } - for _, id := range results { + for _, result := range results { + id, _ := strconv.ParseInt(string(result["id"]), 10, 64) select { case <-ctx.Done(): log.Warn("CheckRepoStats: Cancelled before checking %s for with id=%d", checker.desc, id) @@ -55,23 +54,21 @@ func repoStatsCheck(ctx context.Context, checker *repoChecker) { } } -func StatsCorrectSQL(ctx context.Context, sql any, ids ...any) error { - args := []any{sql} - args = append(args, ids...) - _, err := db.GetEngine(ctx).Exec(args...) +func StatsCorrectSQL(ctx context.Context, sql string, id int64) error { + _, err := db.GetEngine(ctx).Exec(sql, id, id) 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, id) + return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=? AND mode<>2) WHERE 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, id) + return StatsCorrectSQL(ctx, "UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE 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, id) + return StatsCorrectSQL(ctx, "UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", id) } func labelStatsCorrectNumIssuesRepo(ctx context.Context, id int64) error { @@ -108,11 +105,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, id) + return StatsCorrectSQL(ctx, "UPDATE `user` SET num_repos=(SELECT COUNT(*) FROM `repository` WHERE owner_id=?) WHERE id=?", id) } func repoStatsCorrectIssueNumComments(ctx context.Context, id int64) error { - return StatsCorrectSQL(ctx, issues_model.UpdateIssueNumCommentsBuilder(id)) + return StatsCorrectSQL(ctx, "UPDATE `issue` SET num_comments=(SELECT COUNT(*) FROM `comment` WHERE issue_id=? AND type=0) WHERE id=?", id) } func repoStatsCorrectNumIssues(ctx context.Context, id int64) error { @@ -131,12 +128,9 @@ func repoStatsCorrectNumClosedPulls(ctx context.Context, id int64) error { return repo_model.UpdateRepoIssueNumbers(ctx, id, true, true) } -// 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) +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...) } } @@ -207,16 +201,7 @@ func CheckRepoStats(ctx context.Context) error { }, // Issue.NumComments { - 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()), - ), - ), - }, - ), - ), + statsQuery("SELECT `issue`.id FROM `issue` WHERE `issue`.num_comments!=(SELECT COUNT(*) FROM `comment` WHERE issue_id=`issue`.id AND type=0)"), repoStatsCorrectIssueNumComments, "issue count 'num_comments'", }, diff --git a/models/repo/archive_download_count.go b/models/repo/archive_download_count.go index 8e2df21198..31f0399d53 100644 --- a/models/repo/archive_download_count.go +++ b/models/repo/archive_download_count.go @@ -6,9 +6,9 @@ package repo import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/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 given archive +// CountArchiveDownload adds one download the 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 0faf515284..ffc6cdf6df 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" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/archiver.go b/models/repo/archiver.go index 2d0172a163..3f05fcf752 100644 --- a/models/repo/archiver.go +++ b/models/repo/archiver.go @@ -10,10 +10,10 @@ import ( "strings" "time" - "forgejo.org/models/db" - "forgejo.org/modules/git" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/repo/attachment.go b/models/repo/attachment.go index 3bf51e80ca..128bcebb60 100644 --- a/models/repo/attachment.go +++ b/models/repo/attachment.go @@ -9,12 +9,12 @@ import ( "net/url" "path" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "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" ) // Attachment represent a attachment of issue/comment/release. @@ -219,6 +219,16 @@ 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 23f4b3799f..23945ba1d3 100644 --- a/models/repo/attachment_test.go +++ b/models/repo/attachment_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -46,7 +46,11 @@ func TestGetByCommentOrIssueID(t *testing.T) { func TestDeleteAttachments(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) - count, err := repo_model.DeleteAttachmentsByComment(db.DefaultContext, 2, false) + 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) require.NoError(t, err) assert.Equal(t, 2, count) diff --git a/models/repo/avatar.go b/models/repo/avatar.go index a108fda62d..72ee938ada 100644 --- a/models/repo/avatar.go +++ b/models/repo/avatar.go @@ -11,11 +11,11 @@ import ( "net/url" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/avatar" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" + "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" ) // CustomAvatarRelativePath returns repository custom avatar file path. diff --git a/models/repo/collaboration.go b/models/repo/collaboration.go index 16d10d38b6..cb66cb56a6 100644 --- a/models/repo/collaboration.go +++ b/models/repo/collaboration.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/perm" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "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" "xorm.io/builder" ) diff --git a/models/repo/collaboration_test.go b/models/repo/collaboration_test.go index 783091ba9e..5adedfe442 100644 --- a/models/repo/collaboration_test.go +++ b/models/repo/collaboration_test.go @@ -6,12 +6,12 @@ package repo_test import ( "testing" - "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" + "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" "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 f9b9bf5e5e..85b96aa147 100644 --- a/models/repo/following_repo.go +++ b/models/repo/following_repo.go @@ -4,7 +4,7 @@ package repo import ( - "forgejo.org/modules/validation" + "code.gitea.io/gitea/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 cff125dabe..d0dd0a31a7 100644 --- a/models/repo/following_repo_test.go +++ b/models/repo/following_repo_test.go @@ -6,7 +6,7 @@ package repo import ( "testing" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" ) func Test_FollowingRepoValidation(t *testing.T) { diff --git a/models/repo/fork.go b/models/repo/fork.go index ed8b488738..632e91c2bb 100644 --- a/models/repo/fork.go +++ b/models/repo/fork.go @@ -6,9 +6,9 @@ package repo import ( "context" - "forgejo.org/models/db" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" "xorm.io/builder" ) diff --git a/models/repo/fork_test.go b/models/repo/fork_test.go index d567081ee6..dd12429cc4 100644 --- a/models/repo/fork_test.go +++ b/models/repo/fork_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 692176c8f6..388bf86522 100644 --- a/models/repo/git.go +++ b/models/repo/git.go @@ -6,7 +6,7 @@ package repo import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // MergeStyle represents the approach to merge commits into base branch. @@ -29,15 +29,6 @@ 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 35453f109f..0dd4fd5ed4 100644 --- a/models/repo/issue.go +++ b/models/repo/issue.go @@ -6,9 +6,9 @@ package repo import ( "context" - "forgejo.org/models/unit" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // ___________.__ ___________ __ diff --git a/models/repo/language_stats.go b/models/repo/language_stats.go index 1b619c80cc..0bc0f1fb40 100644 --- a/models/repo/language_stats.go +++ b/models/repo/language_stats.go @@ -4,14 +4,13 @@ package repo import ( - "cmp" "context" "math" - "slices" + "sort" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" "github.com/go-enry/go-enry/v2" ) @@ -68,37 +67,34 @@ func (stats LanguageStatList) getLanguagePercentages() map[string]float32 { return langPerc } -// Use the quota method to round the percentages to one decimal place while -// keeping the sum of the percentages at 100%. +// Rounds to 1 decimal point, target should be the expected sum of percs func roundByLargestRemainder(percs map[string]float32, target float32) { - // Tracks the difference between the sum of percentage and 100%. leftToDistribute := int(target * 10) - type key struct { - language string - remainder float64 - } - keys := make([]key, 0, len(percs)) + keys := make([]string, 0, len(percs)) for k, v := range percs { - floored, frac := math.Modf(float64(v * 10)) - percs[k] = float32(floored) + percs[k] = v * 10 + floored := math.Floor(float64(percs[k])) leftToDistribute -= int(floored) - keys = append(keys, key{language: k, remainder: frac}) + keys = append(keys, k) } - // Sort the fractional part in an ascending order. - slices.SortFunc(keys, func(b, a key) int { - return cmp.Compare(a.remainder, b.remainder) + // 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 }) - // As long as the sum of 100% is not reached, add 0.1% percentage. + // Increment the values in order of largest remainder for _, k := range keys { + percs[k] = float32(math.Floor(float64(percs[k]))) if leftToDistribute > 0 { - percs[k.language]++ + percs[k]++ leftToDistribute-- } - percs[k.language] /= 10 + percs[k] /= 10 } } diff --git a/models/repo/language_stats_test.go b/models/repo/language_stats_test.go deleted file mode 100644 index dcfaeee6c9..0000000000 --- a/models/repo/language_stats_test.go +++ /dev/null @@ -1,66 +0,0 @@ -// 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 9fd1cacc97..b49855f2c8 100644 --- a/models/repo/main_test.go +++ b/models/repo/main_test.go @@ -6,15 +6,14 @@ package repo_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "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 + _ "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 ) func TestMain(m *testing.M) { diff --git a/models/repo/mirror.go b/models/repo/mirror.go index 1fe9afd8e9..be7b785612 100644 --- a/models/repo/mirror.go +++ b/models/repo/mirror.go @@ -8,10 +8,10 @@ import ( "context" "time" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" ) // ErrMirrorNotExist mirror does not exist error diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index d6d0d1135a..68fb504fdc 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -10,14 +10,14 @@ import ( "strings" "time" - "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" + "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" "xorm.io/builder" ) diff --git a/models/repo/pushmirror_test.go b/models/repo/pushmirror_test.go index de6c9b0a41..c3368ccafe 100644 --- a/models/repo/pushmirror_test.go +++ b/models/repo/pushmirror_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/redirect.go b/models/repo/redirect.go index 9c44a255d0..61789ebefa 100644 --- a/models/repo/redirect.go +++ b/models/repo/redirect.go @@ -8,8 +8,8 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" ) // ErrRedirectNotExist represents a "RedirectNotExist" kind of error. diff --git a/models/repo/redirect_test.go b/models/repo/redirect_test.go index d84cbbed54..2016784aed 100644 --- a/models/repo/redirect_test.go +++ b/models/repo/redirect_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 10e9bb259f..e2cd7d7ed3 100644 --- a/models/repo/release.go +++ b/models/repo/release.go @@ -13,13 +13,13 @@ import ( "strconv" "strings" - "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" + "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" "xorm.io/builder" ) @@ -97,11 +97,13 @@ func init() { // LoadAttributes load repo and publisher attributes for a release func (r *Release) LoadAttributes(ctx context.Context) error { - err := r.LoadRepo(ctx) - if err != nil { - return err + var err error + if r.Repo == nil { + r.Repo, err = GetRepositoryByID(ctx, r.RepoID) + if err != nil { + return err + } } - if r.Publisher == nil { r.Publisher, err = user_model.GetUserByID(ctx, r.PublisherID) if err != nil { @@ -121,18 +123,6 @@ 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 @@ -140,25 +130,6 @@ 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) @@ -189,20 +160,6 @@ 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 { @@ -214,7 +171,6 @@ 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 } @@ -293,7 +249,6 @@ 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 { @@ -321,15 +276,6 @@ 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 deleted file mode 100644 index 4ec955adf3..0000000000 --- a/models/repo/release_list.go +++ /dev/null @@ -1,45 +0,0 @@ -// 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 deleted file mode 100644 index 2b494cb179..0000000000 --- a/models/repo/release_list_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// 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 94dbd6d9d5..4e61a2805d 100644 --- a/models/repo/release_test.go +++ b/models/repo/release_test.go @@ -6,10 +6,9 @@ package repo import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -26,26 +25,3 @@ 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 8d204d5594..cd6be48b90 100644 --- a/models/repo/repo.go +++ b/models/repo/repo.go @@ -14,18 +14,18 @@ import ( "strconv" "strings" - "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" + "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" "xorm.io/builder" ) @@ -327,11 +327,6 @@ 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) { @@ -529,6 +524,7 @@ 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 247a588cdf..de76ed2b37 100644 --- a/models/repo/repo_flags.go +++ b/models/repo/repo_flags.go @@ -6,7 +6,7 @@ package repo import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "xorm.io/builder" ) diff --git a/models/repo/repo_flags_test.go b/models/repo/repo_flags_test.go index bd92b18208..bccefcf72b 100644 --- a/models/repo/repo_flags_test.go +++ b/models/repo/repo_flags_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 e95517bb07..6e19d8f937 100644 --- a/models/repo/repo_indexer.go +++ b/models/repo/repo_indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" "xorm.io/builder" ) diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go index ac7d2b69e3..fc51f64f6a 100644 --- a/models/repo/repo_list.go +++ b/models/repo/repo_list.go @@ -8,19 +8,24 @@ import ( "fmt" "strings" - "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" + "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" "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. @@ -31,6 +36,18 @@ 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 { diff --git a/models/repo/repo_list_test.go b/models/repo/repo_list_test.go index c654d1b602..8c13f387ba 100644 --- a/models/repo/repo_list_test.go +++ b/models/repo/repo_list_test.go @@ -4,16 +4,18 @@ package repo_test import ( + "path/filepath" "slices" "strings" "testing" - "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" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -408,7 +410,13 @@ func TestSearchRepositoryByTopicName(t *testing.T) { } func TestSearchRepositoryIDsByCondition(t *testing.T) { - defer unittest.OverrideFixtures("models/repo/TestSearchRepositoryIDsByCondition")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"models/repo/TestSearchRepositoryIDsByCondition/"}, + }, + )() require.NoError(t, unittest.PrepareTestDatabase()) // Sanity check of the database limitedUser := unittest.AssertExistsAndLoadBean(t, &user.User{ID: 33, Visibility: structs.VisibleTypeLimited}) diff --git a/models/repo/repo_repository.go b/models/repo/repo_repository.go index 0ba50e6614..6780165a38 100644 --- a/models/repo/repo_repository.go +++ b/models/repo/repo_repository.go @@ -5,8 +5,8 @@ package repo import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/validation" ) func init() { diff --git a/models/repo/repo_test.go b/models/repo/repo_test.go index a9591a357b..56b84798d7 100644 --- a/models/repo/repo_test.go +++ b/models/repo/repo_test.go @@ -7,15 +7,15 @@ package repo_test import ( "testing" - "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" + "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" "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 c11ad70627..ed553844fc 100644 --- a/models/repo/repo_unit.go +++ b/models/repo/repo_unit.go @@ -9,13 +9,13 @@ import ( "slices" "strings" - "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" + "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" "xorm.io/xorm" "xorm.io/xorm/convert" @@ -159,7 +159,6 @@ type PullRequestsConfig struct { AllowRebaseUpdate bool DefaultDeleteBranchAfterMerge bool DefaultMergeStyle MergeStyle - DefaultUpdateStyle UpdateStyle DefaultAllowMaintainerEdit bool } @@ -198,25 +197,6 @@ 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 210b830d02..deee1a7472 100644 --- a/models/repo/repo_unit_test.go +++ b/models/repo/repo_unit_test.go @@ -6,9 +6,7 @@ package repo import ( "testing" - "forgejo.org/models/perm" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/models/perm" "github.com/stretchr/testify/assert" ) @@ -39,50 +37,3 @@ 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 c16bfa4922..ffb8e26745 100644 --- a/models/repo/search.go +++ b/models/repo/search.go @@ -3,7 +3,7 @@ package repo -import "forgejo.org/models/db" +import "code.gitea.io/gitea/models/db" // OrderByMap represents all possible search order var OrderByMap = map[string]map[string]db.SearchOrderBy{ diff --git a/models/repo/star.go b/models/repo/star.go index 25c039a50b..60737149da 100644 --- a/models/repo/star.go +++ b/models/repo/star.go @@ -6,9 +6,9 @@ package repo import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/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 cbaa21db64..73b362c68c 100644 --- a/models/repo/star_test.go +++ b/models/repo/star_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/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 4a3bdc7d8c..6db6c8aef8 100644 --- a/models/repo/topic.go +++ b/models/repo/topic.go @@ -5,12 +5,14 @@ package repo import ( "context" + "fmt" "regexp" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) @@ -37,6 +39,26 @@ 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) @@ -69,6 +91,17 @@ 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 26ad27896e..45cee524b6 100644 --- a/models/repo/topic_test.go +++ b/models/repo/topic_test.go @@ -6,9 +6,9 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -52,7 +52,8 @@ func TestAddTopic(t *testing.T) { require.NoError(t, repo_model.SaveTopics(db.DefaultContext, 2, "golang", "gitea")) repo2NrOfTopics = 2 totalNrOfTopics++ - topic := unittest.AssertExistsAndLoadBean(t, &repo_model.Topic{Name: "gitea"}) + topic, err := repo_model.GetTopicByName(db.DefaultContext, "gitea") + require.NoError(t, err) 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 0222d09de5..e7ca224028 100644 --- a/models/repo/update.go +++ b/models/repo/update.go @@ -8,10 +8,10 @@ import ( "fmt" "time" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "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" ) // 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 49152db7fd..18834f6b83 100644 --- a/models/repo/upload.go +++ b/models/repo/upload.go @@ -12,10 +12,10 @@ import ( "os" "path" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" gouuid "github.com/google/uuid" ) diff --git a/models/repo/user_repo.go b/models/repo/user_repo.go index 309bfee18f..6790ee1da9 100644 --- a/models/repo/user_repo.go +++ b/models/repo/user_repo.go @@ -6,12 +6,12 @@ package repo import ( "context" - "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" + "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" "xorm.io/builder" ) @@ -75,28 +75,26 @@ 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...) - - 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...) - } + 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(uniqueUserIDs) > 0 { + if len(userIDs) > 0 { if err = e.In("id", uniqueUserIDs.Values()). Where(builder.Eq{"`user`.is_active": true}). OrderBy(user_model.GetOrderByName()). @@ -166,9 +164,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) - prefixCond := db.BuildCaseInsensitiveLike("name", search+"%") + var prefixCond builder.Cond = builder.Like{"name", search + "%"} if isShowFullName { - prefixCond = db.BuildCaseInsensitiveLike("full_name", "%"+search+"%") + prefixCond = prefixCond.Or(builder.Like{"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 2912986cd1..c784a5565d 100644 --- a/models/repo/user_repo_test.go +++ b/models/repo/user_repo_test.go @@ -6,10 +6,10 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/watch.go b/models/repo/watch.go index 3fd915e1e7..6974d893df 100644 --- a/models/repo/watch.go +++ b/models/repo/watch.go @@ -6,10 +6,10 @@ package repo import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "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" ) // 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 059489afbf..dbf15050cf 100644 --- a/models/repo/watch_test.go +++ b/models/repo/watch_test.go @@ -6,10 +6,10 @@ package repo_test import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/models/repo/wiki.go b/models/repo/wiki.go index f0dd945a72..b378666a20 100644 --- a/models/repo/wiki.go +++ b/models/repo/wiki.go @@ -9,9 +9,9 @@ import ( "path/filepath" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // ErrWikiAlreadyExist represents a "WikiAlreadyExist" kind of error. diff --git a/models/repo/wiki_test.go b/models/repo/wiki_test.go index bf35a4c610..28495a4b7d 100644 --- a/models/repo/wiki_test.go +++ b/models/repo/wiki_test.go @@ -7,9 +7,9 @@ import ( "path/filepath" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/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 6fbef8edf6..958725fe53 100644 --- a/models/repo_test.go +++ b/models/repo_test.go @@ -6,11 +6,9 @@ package models import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -24,16 +22,3 @@ 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 f515f1bcf0..0c23d759f9 100644 --- a/models/repo_transfer.go +++ b/models/repo_transfer.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - "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" + "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" ) // RepoTransfer is used to manage repository transfers diff --git a/models/repo_transfer_test.go b/models/repo_transfer_test.go index 6449e40fce..6b6d5a8098 100644 --- a/models/repo_transfer_test.go +++ b/models/repo_transfer_test.go @@ -6,9 +6,9 @@ package models import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 7be7f454a1..ce0ad65a79 100644 --- a/models/secret/secret.go +++ b/models/secret/secret.go @@ -8,14 +8,14 @@ import ( "fmt" "strings" - 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" + 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" "xorm.io/builder" ) @@ -135,10 +135,9 @@ 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, GITEA_TOKEN and FORGEJO_TOKEN which are automatically generated. + // ignore secrets for fork pull request, except GITHUB_TOKEN and GITEA_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 62ca1bb9cc..a1d46c986f 100644 --- a/models/shared/types/ownertype.go +++ b/models/shared/types/ownertype.go @@ -3,7 +3,7 @@ package types -import "forgejo.org/modules/translation" +import "code.gitea.io/gitea/modules/translation" type OwnerType string diff --git a/models/system/appstate.go b/models/system/appstate.go index 31274b4c34..01faa1a5be 100644 --- a/models/system/appstate.go +++ b/models/system/appstate.go @@ -6,7 +6,7 @@ package system import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // AppState represents a state record in database diff --git a/models/system/main_test.go b/models/system/main_test.go index ca2846527a..6bc27a7cff 100644 --- a/models/system/main_test.go +++ b/models/system/main_test.go @@ -6,13 +6,12 @@ package system_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "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 + _ "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 ) func TestMain(m *testing.M) { diff --git a/models/system/notice.go b/models/system/notice.go index b1fdd2e4f2..e7ec6a9693 100644 --- a/models/system/notice.go +++ b/models/system/notice.go @@ -8,11 +8,11 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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" ) // NoticeType describes the notice type diff --git a/models/system/notice_test.go b/models/system/notice_test.go index 4862160755..bfb7862fd7 100644 --- a/models/system/notice_test.go +++ b/models/system/notice_test.go @@ -6,9 +6,9 @@ package system_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/system" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/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 a57602688a..4472b4c228 100644 --- a/models/system/setting.go +++ b/models/system/setting.go @@ -9,19 +9,19 @@ import ( "sync" "time" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting/config" - "forgejo.org/modules/timeutil" + "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" "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 + ID int64 `xorm:"pk autoincr"` + SettingKey string `xorm:"varchar(255) unique"` // key should be lowercase + SettingValue string `xorm:"text"` + Version int `xorm:"version"` 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 1abaf2f16b..7a7fa02b01 100644 --- a/models/system/setting_test.go +++ b/models/system/setting_test.go @@ -6,9 +6,9 @@ package system_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/system" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/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 6251d44c9b..5a8b9114f2 100644 --- a/models/unit/unit.go +++ b/models/unit/unit.go @@ -9,10 +9,10 @@ import ( "strings" "sync/atomic" - "forgejo.org/models/perm" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // Type is Unit's Type diff --git a/models/unit/unit_test.go b/models/unit/unit_test.go index efcad4a405..a73967742f 100644 --- a/models/unit/unit_test.go +++ b/models/unit/unit_test.go @@ -6,7 +6,7 @@ package unit import ( "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 fd2d4b7d75..4e26de7503 100644 --- a/models/unittest/consistency.go +++ b/models/unittest/consistency.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/models/db" + "code.gitea.io/gitea/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 deleted file mode 100644 index 67ef1b28df..0000000000 --- a/models/unittest/fixture_loader.go +++ /dev/null @@ -1,198 +0,0 @@ -// 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 495f9a2aac..63b26a0af7 100644 --- a/models/unittest/fixtures.go +++ b/models/unittest/fixtures.go @@ -6,18 +6,20 @@ package unittest import ( "fmt" + "os" "path/filepath" "time" - "forgejo.org/models/db" - "forgejo.org/modules/auth/password/hash" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/auth/password/hash" + "code.gitea.io/gitea/modules/setting" + "github.com/go-testfixtures/testfixtures/v3" "xorm.io/xorm" "xorm.io/xorm/schemas" ) -var fixturesLoader *loader +var fixturesLoader *testfixtures.Loader // GetXORMEngine gets the XORM engine func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) { @@ -27,18 +29,11 @@ func GetXORMEngine(engine ...*xorm.Engine) (x *xorm.Engine) { return db.DefaultContext.(*db.Context).Engine().(*xorm.Engine) } -func OverrideFixtures(dir string) func() { +func OverrideFixtures(opts FixturesOptions, engine ...*xorm.Engine) func() { old := fixturesLoader - - opts := FixturesOptions{ - Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), - Base: setting.AppWorkPath, - Dirs: []string{dir}, - } - if err := InitFixtures(opts); err != nil { + if err := InitFixtures(opts, engine...); err != nil { panic(err) } - return func() { fixturesLoader = old } @@ -47,19 +42,19 @@ func OverrideFixtures(dir string) func() { // InitFixtures initialize test fixtures for a test database func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) { e := GetXORMEngine(engine...) - fixturePaths := []string{} + var fixtureOptionFiles func(*testfixtures.Loader) error if opts.Dir != "" { - fixturePaths = append(fixturePaths, opts.Dir) + fixtureOptionFiles = testfixtures.Directory(opts.Dir) } else { - fixturePaths = append(fixturePaths, opts.Files...) + fixtureOptionFiles = testfixtures.Files(opts.Files...) } + var fixtureOptionDirs []func(*testfixtures.Loader) error if opts.Dirs != nil { for _, dir := range opts.Dirs { - fixturePaths = append(fixturePaths, filepath.Join(opts.Base, dir)) + fixtureOptionDirs = append(fixtureOptionDirs, testfixtures.Directory(filepath.Join(opts.Base, dir))) } } - - var dialect string + dialect := "unknown" switch e.Dialect().URI().DBType { case schemas.POSTGRES: dialect = "postgres" @@ -68,10 +63,22 @@ func InitFixtures(opts FixturesOptions, engine ...*xorm.Engine) (err error) { case schemas.SQLITE: dialect = "sqlite3" default: - panic("Unsupported RDBMS for test") + 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()) } - fixturesLoader, err = newFixtureLoader(e.DB().DB, dialect, fixturePaths) + fixturesLoader, err = testfixtures.New(loaderOptions...) if err != nil { return err } diff --git a/models/unittest/fscopy.go b/models/unittest/fscopy.go index 5cd871ced6..74b12d5057 100644 --- a/models/unittest/fscopy.go +++ b/models/unittest/fscopy.go @@ -4,12 +4,99 @@ 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) error { - return os.CopyFS(destPath, os.DirFS(srcPath)) +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 } diff --git a/models/unittest/mock_http.go b/models/unittest/mock_http.go index e749275282..aea2489d2a 100644 --- a/models/unittest/mock_http.go +++ b/models/unittest/mock_http.go @@ -15,7 +15,7 @@ import ( "strings" "testing" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,11 +33,6 @@ 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)) @@ -91,10 +86,6 @@ 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 d34c9e9a0a..94a3253644 100644 --- a/models/unittest/testdb.go +++ b/models/unittest/testdb.go @@ -12,15 +12,15 @@ import ( "strings" "testing" - "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" + "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" "github.com/stretchr/testify/require" "xorm.io/xorm" @@ -59,13 +59,6 @@ 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 a7c8e9c2fa..157c676d09 100644 --- a/models/unittest/unit_tests.go +++ b/models/unittest/unit_tests.go @@ -7,7 +7,7 @@ import ( "math" "testing" - "forgejo.org/models/db" + "code.gitea.io/gitea/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 27af7f774d..c6937d7b51 100644 --- a/models/user/avatar.go +++ b/models/user/avatar.go @@ -11,12 +11,12 @@ import ( "io" "strings" - "forgejo.org/models/avatars" - "forgejo.org/models/db" - "forgejo.org/modules/avatar" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" + "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" ) // CustomAvatarRelativePath returns user custom avatar relative path. @@ -38,18 +38,14 @@ func GenerateRandomAvatar(ctx context.Context, u *User) error { u.Avatar = avatars.HashEmail(seed) - _, 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) + // 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 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 deleted file mode 100644 index d3a164142d..0000000000 --- a/models/user/avatar_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// 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 e54c993a37..ee52b44cf5 100644 --- a/models/user/badge.go +++ b/models/user/badge.go @@ -6,7 +6,7 @@ package user import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // Badge represents a user badge diff --git a/models/user/block.go b/models/user/block.go index 2e3cfc2fa3..189cacc2a2 100644 --- a/models/user/block.go +++ b/models/user/block.go @@ -7,8 +7,8 @@ import ( "context" "errors" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 b1674bf2ff..a795ef345e 100644 --- a/models/user/block_test.go +++ b/models/user/block_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 f9eaec56c9..011c3edfa6 100644 --- a/models/user/email_address.go +++ b/models/user/email_address.go @@ -7,17 +7,62 @@ package user import ( "context" "fmt" + "net/mail" + "regexp" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "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" "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 @@ -109,6 +154,22 @@ 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 { @@ -139,38 +200,6 @@ 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) @@ -414,3 +443,41 @@ 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 1801f57a23..b918f21018 100644 --- a/models/user/email_address_test.go +++ b/models/user/email_address_test.go @@ -7,10 +7,10 @@ import ( "fmt" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -130,6 +130,63 @@ 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()) @@ -163,21 +220,3 @@ 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 a0fc1af2bd..cbf19998d1 100644 --- a/models/user/error.go +++ b/models/user/error.go @@ -6,7 +6,7 @@ package user import ( "fmt" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // ErrUserAlreadyExist represents a "user already exists" error. @@ -71,6 +71,27 @@ 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 f13454c38a..965b7a5ed1 100644 --- a/models/user/external_login_user.go +++ b/models/user/external_login_user.go @@ -8,8 +8,8 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/user/federated_user.go b/models/user/federated_user.go index fc07836408..1fc42c3c32 100644 --- a/models/user/federated_user.go +++ b/models/user/federated_user.go @@ -4,7 +4,7 @@ package user import ( - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" ) type FederatedUser struct { diff --git a/models/user/federated_user_test.go b/models/user/federated_user_test.go index 374236f6d3..6a2112666f 100644 --- a/models/user/federated_user_test.go +++ b/models/user/federated_user_test.go @@ -6,7 +6,7 @@ package user import ( "testing" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" ) func Test_FederatedUserValidation(t *testing.T) { diff --git a/models/user/follow.go b/models/user/follow.go index 5be0f73c35..9c3283b888 100644 --- a/models/user/follow.go +++ b/models/user/follow.go @@ -6,8 +6,8 @@ package user import ( "context" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 976225a4a8..8c56164ee3 100644 --- a/models/user/follow_test.go +++ b/models/user/follow_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 71c96c8565..ca589d1e02 100644 --- a/models/user/list.go +++ b/models/user/list.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/auth" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" ) // UserList is a list of user. diff --git a/models/user/main_test.go b/models/user/main_test.go index f0dae086e0..a626d323a7 100644 --- a/models/user/main_test.go +++ b/models/user/main_test.go @@ -6,13 +6,12 @@ package user_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/user" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" + _ "code.gitea.io/gitea/models/user" ) func TestMain(m *testing.M) { diff --git a/models/user/must_change_password.go b/models/user/must_change_password.go index 5503f503b5..7eab08de89 100644 --- a/models/user/must_change_password.go +++ b/models/user/must_change_password.go @@ -7,8 +7,8 @@ import ( "context" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/models/user/openid.go b/models/user/openid.go index 96b00255a3..ee4ecabae0 100644 --- a/models/user/openid.go +++ b/models/user/openid.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" ) // ErrOpenIDNotExist openid is not known diff --git a/models/user/openid_test.go b/models/user/openid_test.go index 3c55891c1f..c2857aac98 100644 --- a/models/user/openid_test.go +++ b/models/user/openid_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 75876f17d2..5a40d4df3b 100644 --- a/models/user/redirect.go +++ b/models/user/redirect.go @@ -6,17 +6,10 @@ package user import ( "context" "fmt" - "slices" - "strconv" "strings" - "time" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - - "xorm.io/builder" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/util" ) // ErrUserRedirectNotExist represents a "UserRedirectNotExist" kind of error. @@ -38,25 +31,11 @@ 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 - CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL DEFAULT 0"` + ID int64 `xorm:"pk autoincr"` + LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"` + RedirectUserID int64 // userID to redirect to } // TableName provides the real table name @@ -68,24 +47,14 @@ func init() { db.RegisterModel(new(Redirect)) } -// GetUserRedirect returns the redirect for a given username, this is a -// case-insensitive operation. -func GetUserRedirect(ctx context.Context, userName string) (*Redirect, error) { +// LookupUserRedirect look up userID if a user has a redirect name +func LookupUserRedirect(ctx context.Context, userName string) (int64, error) { userName = strings.ToLower(userName) redirect := &Redirect{LowerName: userName} if has, err := db.GetEngine(ctx).Get(redirect); err != nil { - return nil, err - } else if !has { - 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 + } else if !has { + return 0, ErrUserRedirectNotExist{Name: userName} } return redirect.RedirectUserID, nil } @@ -109,19 +78,6 @@ 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 { @@ -129,46 +85,3 @@ 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 c598fb045f..35fd29aa5d 100644 --- a/models/user/redirect_test.go +++ b/models/user/redirect_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 d2b9901823..04c434e4fa 100644 --- a/models/user/search.go +++ b/models/user/search.go @@ -8,10 +8,10 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/container" - "forgejo.org/modules/optional" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/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 optional.Option[int64] // this option should be used only for admin user + LoginName string // this option should be used only for admin user + SourceID int64 // this option should be used only for admin user OrderBy db.SearchOrderBy Visible []structs.VisibleType Actor *User // The user doing the search @@ -40,7 +40,6 @@ type SearchUserOptions struct { IsProhibitLogin optional.Option[bool] IncludeReserved bool - Load2FAStatus bool ExtraParamStrings map[string]string } @@ -70,19 +69,7 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess builder.Like{"LOWER(full_name)", lowerKeyword}, ) if opts.SearchByEmail { - 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) + keywordCond = keywordCond.Or(builder.Like{"LOWER(email)", lowerKeyword}) } cond = cond.And(keywordCond) @@ -99,8 +86,8 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess cond = cond.And(builder.Eq{"id": opts.UID}) } - if opts.SourceID.Has() { - cond = cond.And(builder.Eq{"login_source": opts.SourceID.Value()}) + if opts.SourceID > 0 { + cond = cond.And(builder.Eq{"login_source": opts.SourceID}) } if opts.LoginName != "" { cond = cond.And(builder.Eq{"login_name": opts.LoginName}) @@ -127,15 +114,17 @@ func (opts *SearchUserOptions) toSearchQueryBase(ctx context.Context) *xorm.Sess return e.Where(cond) } - // Check if the user has two factor enabled, which is TOTP or Webauthn. + // 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) if opts.IsTwoFactorEnabled.Value() { - cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL OR webauthn_credential.user_id IS NOT NULL")) + cond = cond.And(builder.Expr("two_factor.uid IS NOT NULL")) } else { - cond = cond.And(builder.Expr("two_factor.uid IS NULL AND webauthn_credential.user_id IS NULL")) + cond = cond.And(builder.Expr("two_factor.uid 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 a915119ad2..b4af0e5ccd 100644 --- a/models/user/setting.go +++ b/models/user/setting.go @@ -8,10 +8,10 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/cache" - setting_module "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" "xorm.io/builder" ) diff --git a/models/user/setting_test.go b/models/user/setting_test.go index 7b6658041f..0b05c54ee6 100644 --- a/models/user/setting_test.go +++ b/models/user/setting_test.go @@ -6,9 +6,9 @@ package user_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/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 a0ee1e81b4..3f12f8e83f 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -21,20 +21,20 @@ import ( _ "image/jpeg" // Needed for jpeg support - "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" + "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" "golang.org/x/text/runes" "golang.org/x/text/transform" @@ -154,7 +154,6 @@ 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"` } @@ -340,7 +339,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) @@ -362,7 +361,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) @@ -501,16 +500,6 @@ 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)) } @@ -576,7 +565,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", "ß", "ss") + customCharsReplacement = strings.NewReplacer("Æ", "AE") removeCharsRE = regexp.MustCompile(`['´\x60]`) removeDiacriticsTransform = transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) replaceCharsHyphenRE = regexp.MustCompile(`[\s~+]`) @@ -597,48 +586,45 @@ var ( reservedUsernames = []string{ ".", "..", - "-", // used by certain web routes ".well-known", - - "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", - - "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", + "api", + "assets", + "attachments", + "avatar", + "avatars", + "captcha", + "commits", + "debug", "devtest", + "error", "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 + "ghost", + "issues", + "login", + "manifest.json", + "metrics", + "milestones", + "new", + "notifications", + "org", + "pulls", + "raw", + "repo", + "repo-avatars", + "robots.txt", + "search", + "serviceworker.js", + "ssh_info", "swagger.v1.json", - - "ghost", // reserved name for deleted users (id: -1) - "gitea-actions", // gitea builtin user (id: -2) - "forgejo-actions", // forgejo builtin user (id: -2) + "user", + "v2", + "gitea-actions", + "forgejo-actions", } - // 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. + // DON'T ADD ANY NEW STUFF, WE SOLVE THIS WITH `/user/{obj}` PATHS! reservedUserPatterns = []string{"*.keys", "*.gpg", "*.rss", "*.atom", "*.png"} ) @@ -680,18 +666,6 @@ 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 @@ -742,11 +716,11 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa } if createdByAdmin { - if err := validation.ValidateEmailForAdmin(u.Email); err != nil { + if err := ValidateEmailForAdmin(u.Email); err != nil { return err } } else { - if err := validation.ValidateEmail(u.Email); err != nil { + if err := ValidateEmail(u.Email); err != nil { return err } } @@ -865,46 +839,48 @@ func countUsers(ctx context.Context, opts *CountUserFilter) int64 { // 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) { +func VerifyUserAuthorizationToken(ctx context.Context, code string, purpose auth.AuthorizationPurpose, delete bool) (*User, error) { lookupKey, validator, found := strings.Cut(code, ":") if !found { - return nil, nil, nil + return nil, nil } authToken, err := auth.FindAuthToken(ctx, lookupKey, purpose) if err != nil { if errors.Is(err, util.ErrNotExist) { - return nil, nil, nil + return nil, nil } - return nil, nil, err + return nil, err } if authToken.IsExpired() { - return nil, nil, auth.DeleteAuthToken(ctx, authToken) + return nil, auth.DeleteAuthToken(ctx, authToken) } rawValidator, err := hex.DecodeString(validator) if err != nil { - return nil, nil, err + return nil, err } if subtle.ConstantTimeCompare([]byte(authToken.HashedValidator), []byte(auth.HashValidator(rawValidator))) == 0 { - return nil, nil, errors.New("validator doesn't match") + return 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 } - return nil, nil, err + return nil, err } - deleteToken = func() error { - return auth.DeleteAuthToken(ctx, authToken) + if delete { + if err := auth.DeleteAuthToken(ctx, authToken); err != nil { + return nil, err + } } - return u, deleteToken, nil + return u, nil } // ValidateUser check if user is valid to insert / update into database @@ -923,7 +899,7 @@ func (u User) Validate() []string { if err := ValidateUser(&u); err != nil { result = append(result, err.Error()) } - if err := validation.ValidateEmail(u.Email); err != nil { + if err := ValidateEmail(u.Email); err != nil { result = append(result, err.Error()) } return result @@ -1052,6 +1028,22 @@ 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 { @@ -1078,6 +1070,17 @@ 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 172bf7c8b4..c06441b5c8 100644 --- a/models/user/user_repository.go +++ b/models/user/user_repository.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/modules/optional" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/validation" ) func init() { diff --git a/models/user/user_system.go b/models/user/user_system.go index f1585b512a..ba9a2131b2 100644 --- a/models/user/user_system.go +++ b/models/user/user_system.go @@ -1,5 +1,4 @@ // Copyright 2022 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package user @@ -8,8 +7,8 @@ import ( "net/url" "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" ) const ( @@ -96,7 +95,3 @@ 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 7c89337510..f0b7e16824 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -5,6 +5,7 @@ package user_test import ( + "context" "crypto/rand" "encoding/hex" "fmt" @@ -12,19 +13,19 @@ import ( "testing" "time" - "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" + "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/test" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -72,7 +73,7 @@ func TestGetUserFromMap(t *testing.T) { } func TestGetUserByName(t *testing.T) { - defer unittest.OverrideFixtures("models/user/fixtures")() + defer tests.AddFixtures("models/user/fixtures/")() require.NoError(t, unittest.PrepareTestDatabase()) { @@ -100,6 +101,16 @@ 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()) @@ -119,7 +130,7 @@ func TestCanCreateOrganization(t *testing.T) { } func TestGetAllUsers(t *testing.T) { - defer unittest.OverrideFixtures("models/user/fixtures")() + defer tests.AddFixtures("models/user/fixtures/")() require.NoError(t, unittest.PrepareTestDatabase()) users, err := user_model.GetAllUsers(db.DefaultContext) @@ -144,7 +155,7 @@ func TestAPActorID(t *testing.T) { } func TestSearchUsers(t *testing.T) { - defer unittest.OverrideFixtures("models/user/fixtures")() + defer tests.AddFixtures("models/user/fixtures/")() require.NoError(t, unittest.PrepareTestDatabase()) testSuccess := func(opts *user_model.SearchUserOptions, expectedUserOrOrgIDs []int64) { users, _, err := user_model.SearchUsers(db.DefaultContext, opts) @@ -210,7 +221,7 @@ func TestSearchUsers(t *testing.T) { []int64{1041, 37}) testUserSuccess(&user_model.SearchUserOptions{ListOptions: db.ListOptions{Page: 1}, IsTwoFactorEnabled: optional.Some(true)}, - []int64{24, 32}) + []int64{24}) } func TestEmailNotificationPreferences(t *testing.T) { @@ -312,7 +323,7 @@ func TestCreateUserInvalidEmail(t *testing.T) { err := user_model.CreateUser(db.DefaultContext, user) require.Error(t, err) - assert.True(t, validation.IsErrEmailCharIsNotSupported(err)) + assert.True(t, user_model.IsErrEmailCharIsNotSupported(err)) } func TestCreateUserEmailAlreadyUsed(t *testing.T) { @@ -344,7 +355,7 @@ func TestCreateUserCustomTimestamps(t *testing.T) { err := user_model.CreateUser(db.DefaultContext, user) require.NoError(t, err) - fetched, err := user_model.GetUserByID(t.Context(), user.ID) + fetched, err := user_model.GetUserByID(context.Background(), user.ID) require.NoError(t, err) assert.Equal(t, creationTimestamp, fetched.CreatedUnix) assert.Equal(t, creationTimestamp, fetched.UpdatedUnix) @@ -371,7 +382,7 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) { timestampEnd := time.Now().Unix() - fetched, err := user_model.GetUserByID(t.Context(), user.ID) + fetched, err := user_model.GetUserByID(context.Background(), user.ID) require.NoError(t, err) assert.LessOrEqual(t, timestampStart, fetched.CreatedUnix) @@ -381,31 +392,6 @@ 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()) @@ -633,7 +619,6 @@ 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}, @@ -664,7 +649,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" `}, @@ -704,7 +689,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.Seq() { + for _, f := range testValues.Values() { assert.False(t, user_model.IsFeatureDisabledWithLoginType(user, f)) } @@ -713,7 +698,7 @@ func TestDisabledUserFeatures(t *testing.T) { // all features should be disabled assert.NotEmpty(t, user_model.DisabledFeaturesWithLoginType(user).Values()) - for f := range testValues.Seq() { + for _, f := range testValues.Values() { assert.True(t, user_model.IsFeatureDisabledWithLoginType(user, f)) } } @@ -755,13 +740,13 @@ func TestVerifyUserAuthorizationToken(t *testing.T) { assert.True(t, ok) t.Run("Wrong purpose", func(t *testing.T) { - u, _, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset) + u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.PasswordReset, false) 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) + u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, false) require.NoError(t, err) assert.EqualValues(t, user.ID, u.ID) @@ -771,10 +756,9 @@ func TestVerifyUserAuthorizationToken(t *testing.T) { }) t.Run("Delete", func(t *testing.T) { - u, deleteToken, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation) + u, err := user_model.VerifyUserAuthorizationToken(db.DefaultContext, code, auth.UserActivation, true) 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) @@ -786,51 +770,12 @@ func TestGetInactiveUsers(t *testing.T) { require.NoError(t, unittest.PrepareTestDatabase()) // all inactive users - // user1's createdunix is 1672578000 + // user1's createdunix is 1730468968 users, err := user_model.GetInactiveUsers(db.DefaultContext, 0) require.NoError(t, err) assert.Len(t, users, 1) - interval := time.Now().Unix() - 1672578000 + 3600*24 + interval := time.Now().Unix() - 1730468968 + 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 bf258811e4..66702e2a14 100644 --- a/models/user/user_update.go +++ b/models/user/user_update.go @@ -6,7 +6,7 @@ package user import ( "context" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) func IncrUserRepoNum(ctx context.Context, userID int64) error { diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index 58600cb8bf..8734feb2e1 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -8,12 +8,12 @@ import ( "errors" "time" - "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" + "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" gouuid "github.com/google/uuid" "xorm.io/builder" diff --git a/models/webhook/main_test.go b/models/webhook/main_test.go index fac998e8cd..f19465d505 100644 --- a/models/webhook/main_test.go +++ b/models/webhook/main_test.go @@ -6,7 +6,7 @@ package webhook import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/models/webhook/webhook.go b/models/webhook/webhook.go index 0691f231b2..f3370f3db5 100644 --- a/models/webhook/webhook.go +++ b/models/webhook/webhook.go @@ -9,15 +9,15 @@ import ( "fmt" "strings" - "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" + "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" "xorm.io/builder" ) diff --git a/models/webhook/webhook_system.go b/models/webhook/webhook_system.go index b63346635c..62e8286205 100644 --- a/models/webhook/webhook_system.go +++ b/models/webhook/webhook_system.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/models/db" + "code.gitea.io/gitea/models/db" ) // GetDefaultWebhooks returns all admin-default webhooks. diff --git a/models/webhook/webhook_test.go b/models/webhook/webhook_test.go index 7f0abbd8bb..848440b84a 100644 --- a/models/webhook/webhook_test.go +++ b/models/webhook/webhook_test.go @@ -4,15 +4,16 @@ package webhook import ( + "context" "testing" "time" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -261,7 +262,7 @@ func TestCleanupHookTaskTable_PerWebhook_DeletesDelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) unittest.AssertNotExistsBean(t, hookTask) } @@ -277,7 +278,7 @@ func TestCleanupHookTaskTable_PerWebhook_LeavesUndelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -294,7 +295,7 @@ func TestCleanupHookTaskTable_PerWebhook_LeavesMostRecentTask(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), PerWebhook, 168*time.Hour, 1)) + require.NoError(t, CleanupHookTaskTable(context.Background(), PerWebhook, 168*time.Hour, 1)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -311,7 +312,7 @@ func TestCleanupHookTaskTable_OlderThan_DeletesDelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) unittest.AssertNotExistsBean(t, hookTask) } @@ -327,7 +328,7 @@ func TestCleanupHookTaskTable_OlderThan_LeavesUndelivered(t *testing.T) { require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } @@ -344,6 +345,6 @@ func TestCleanupHookTaskTable_OlderThan_LeavesTaskEarlierThanAgeToDelete(t *test require.NoError(t, err) unittest.AssertExistsAndLoadBean(t, hookTask) - require.NoError(t, CleanupHookTaskTable(t.Context(), OlderThan, 168*time.Hour, 0)) + require.NoError(t, CleanupHookTaskTable(context.Background(), OlderThan, 168*time.Hour, 0)) unittest.AssertExistsAndLoadBean(t, hookTask) } diff --git a/modules/actions/github.go b/modules/actions/github.go index 111537c913..c27d4edf53 100644 --- a/modules/actions/github.go +++ b/modules/actions/github.go @@ -4,7 +4,7 @@ package actions import ( - webhook_module "forgejo.org/modules/webhook" + webhook_module "code.gitea.io/gitea/modules/webhook" ) const ( diff --git a/modules/actions/github_test.go b/modules/actions/github_test.go index 2a5d8a19b8..6652ff6eac 100644 --- a/modules/actions/github_test.go +++ b/modules/actions/github_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - webhook_module "forgejo.org/modules/webhook" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" ) diff --git a/modules/actions/log.go b/modules/actions/log.go index 78b1196f87..5a1425e031 100644 --- a/modules/actions/log.go +++ b/modules/actions/log.go @@ -12,10 +12,10 @@ import ( "strings" "time" - "forgejo.org/models/dbfs" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" - "forgejo.org/modules/zstd" + "code.gitea.io/gitea/models/dbfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/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 77bfc747ee..1f36e021a5 100644 --- a/modules/actions/task_state.go +++ b/modules/actions/task_state.go @@ -4,7 +4,7 @@ package actions import ( - actions_model "forgejo.org/models/actions" + actions_model "code.gitea.io/gitea/models/actions" ) const ( diff --git a/modules/actions/task_state_test.go b/modules/actions/task_state_test.go index e18de4573f..ff0fd57195 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 "forgejo.org/models/actions" + actions_model "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" ) diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go index 43948cce5c..94c221ee7b 100644 --- a/modules/actions/workflows.go +++ b/modules/actions/workflows.go @@ -8,10 +8,10 @@ import ( "io" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + "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" "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 b85ed7fd56..965d01f134 100644 --- a/modules/actions/workflows_test.go +++ b/modules/actions/workflows_test.go @@ -6,9 +6,9 @@ package actions import ( "testing" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/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 d43e9c2bb0..064d8984c1 100644 --- a/modules/activitypub/client.go +++ b/modules/activitypub/client.go @@ -17,12 +17,12 @@ import ( "strings" "time" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/proxy" - "forgejo.org/modules/setting" + 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" - "github.com/42wim/httpsig" + "github.com/go-fed/httpsig" ) const ( diff --git a/modules/activitypub/client_test.go b/modules/activitypub/client_test.go index e63d4859be..647a0a59d0 100644 --- a/modules/activitypub/client_test.go +++ b/modules/activitypub/client_test.go @@ -9,14 +9,15 @@ import ( "io" "net/http" "net/http/httptest" + "regexp" "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -118,7 +119,7 @@ func TestActivityPubSignedPost(t *testing.T) { expected := "BODY" srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - assert.Regexp(t, "^"+setting.Federation.DigestAlgorithm, r.Header.Get("Digest")) + assert.Regexp(t, regexp.MustCompile("^"+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 4895c85d6b..4591f1fa55 100644 --- a/modules/activitypub/main_test.go +++ b/modules/activitypub/main_test.go @@ -6,12 +6,11 @@ package activitypub import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/modules/activitypub/user_settings.go b/modules/activitypub/user_settings.go index 77c11d5ae3..7f939af352 100644 --- a/modules/activitypub/user_settings.go +++ b/modules/activitypub/user_settings.go @@ -6,8 +6,8 @@ package activitypub import ( "context" - user_model "forgejo.org/models/user" - "forgejo.org/modules/util" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/util" ) const rsaBits = 3072 diff --git a/modules/activitypub/user_settings_test.go b/modules/activitypub/user_settings_test.go index f1a779855c..f510e7a6ac 100644 --- a/modules/activitypub/user_settings_test.go +++ b/modules/activitypub/user_settings_test.go @@ -6,11 +6,11 @@ package activitypub import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" - _ "forgejo.org/models" // https://forum.gitea.com/t/testfixtures-could-not-clean-table-access-no-such-table-access/4137/4 + _ "code.gitea.io/gitea/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 index 52c6134d72..7b499fe3f1 100644 --- a/modules/annex/annex.go +++ b/modules/annex/annex.go @@ -10,39 +10,22 @@ package annex import ( - "bytes" - "context" "errors" "fmt" - "io" + "io/fs" "os" "path" "path/filepath" + "regexp" "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 + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" ) // 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 { @@ -52,42 +35,6 @@ func LookupKey(blob *git.Blob) (string, error) { 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 { @@ -140,55 +87,42 @@ func IsAnnexed(blob *git.Blob) (bool, error) { 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) +var repoConfigFileRe = regexp.MustCompile("[^/]+/[^/]+.git/config$") -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 -} +var ( + uuid2repoPathCache = make(map[string]string) + repoPath2uuidCache = make(map[string]string) +) 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 + return filepath.WalkDir(setting.RepoRootPath, func(path string, d fs.DirEntry, err error) error { + if err == nil && repoConfigFileRe.MatchString(path) { + thisRepoPath := strings.TrimSuffix(path, "/config") + _, ok := repoPath2uuidCache[thisRepoPath] + if ok { + return nil + } + stdout, _, err := git.NewCommand(git.DefaultContext, "config", "annex.uuid").RunStdString(&git.RunOpts{Dir: thisRepoPath}) + if err != nil { + return nil + } + repoUUID := strings.TrimSpace(stdout) + if repoUUID != "" { + uuid2repoPathCache[repoUUID] = thisRepoPath + repoPath2uuidCache[thisRepoPath] = repoUUID + } } - repoUUID := config.Section("annex").Key("uuid").Value() - if repoUUID != "" { - uuid2repoPathCache[repoUUID] = repoPath - } - } - return nil + return nil + }) } -func repoPathFromUUIDCache(uuid string) (string, error) { +func UUID2RepoPath(uuid string) (string, error) { if repoPath, ok := uuid2repoPathCache[uuid]; ok { return repoPath, nil } @@ -201,40 +135,3 @@ func repoPathFromUUIDCache(uuid string) (string, error) { } 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 8d54ae5e4a..9678d23ad6 100644 --- a/modules/assetfs/layered.go +++ b/modules/assetfs/layered.go @@ -11,13 +11,13 @@ import ( "net/http" "os" "path/filepath" - "slices" + "sort" "time" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/util" "github.com/fsnotify/fsnotify" ) @@ -143,7 +143,8 @@ func (l *LayeredFS) ListFiles(name string, fileMode ...bool) ([]string, error) { } } } - files := slices.Sorted(fileSet.Seq()) + files := fileSet.Values() + sort.Strings(files) return files, nil } @@ -183,7 +184,8 @@ func listAllFiles(layers []*Layer, name string, fileMode ...bool) ([]string, err if err := list(name); err != nil { return nil, err } - files := slices.Sorted(fileSet.Seq()) + files := fileSet.Values() + sort.Strings(files) return files, nil } diff --git a/modules/auth/common.go b/modules/auth/common.go index 0f36fd942f..77361f6561 100644 --- a/modules/auth/common.go +++ b/modules/auth/common.go @@ -4,8 +4,8 @@ package auth import ( - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 a8b608e6be..cca1482b1d 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/v2" + "github.com/msteinert/pam" ) // Supported is true when built with PAM @@ -28,7 +28,6 @@ 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 0f65d60c66..0cd6472fa1 100644 --- a/modules/auth/password/hash/argon2.go +++ b/modules/auth/password/hash/argon2.go @@ -7,7 +7,7 @@ import ( "encoding/hex" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "golang.org/x/crypto/argon2" ) diff --git a/modules/auth/password/hash/common.go b/modules/auth/password/hash/common.go index 618ebfd15b..487c0738f4 100644 --- a/modules/auth/password/hash/common.go +++ b/modules/auth/password/hash/common.go @@ -6,7 +6,7 @@ package hash import ( "strconv" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 eb79db1b9e..459320e1b0 100644 --- a/modules/auth/password/hash/hash.go +++ b/modules/auth/password/hash/hash.go @@ -10,7 +10,7 @@ import ( "strings" "sync/atomic" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 0dff5e5134..27382fedb8 100644 --- a/modules/auth/password/hash/pbkdf2.go +++ b/modules/auth/password/hash/pbkdf2.go @@ -8,7 +8,7 @@ import ( "encoding/hex" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "golang.org/x/crypto/pbkdf2" ) diff --git a/modules/auth/password/hash/scrypt.go b/modules/auth/password/hash/scrypt.go index 668b69cb9e..f3d38f751a 100644 --- a/modules/auth/password/hash/scrypt.go +++ b/modules/auth/password/hash/scrypt.go @@ -7,7 +7,7 @@ import ( "encoding/hex" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "golang.org/x/crypto/scrypt" ) diff --git a/modules/auth/password/password.go b/modules/auth/password/password.go index fdbc4ff291..85f9780709 100644 --- a/modules/auth/password/password.go +++ b/modules/auth/password/password.go @@ -13,8 +13,8 @@ import ( "strings" "sync" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" ) var ( diff --git a/modules/auth/password/pwn.go b/modules/auth/password/pwn.go index 239a25f11c..e00205ea19 100644 --- a/modules/auth/password/pwn.go +++ b/modules/auth/password/pwn.go @@ -8,8 +8,8 @@ import ( "errors" "fmt" - "forgejo.org/modules/auth/password/pwn" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/auth/password/pwn" + "code.gitea.io/gitea/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 10693ec663..f77ce9f40b 100644 --- a/modules/auth/password/pwn/pwn.go +++ b/modules/auth/password/pwn/pwn.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 bdfc0f6a51..e5108150ae 100644 --- a/modules/auth/password/pwn/pwn_test.go +++ b/modules/auth/password/pwn/pwn_test.go @@ -4,80 +4,47 @@ 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, - Transport: mockTransport{}, + Timeout: time.Second * 2, })) 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 a26dc89545..189d197333 100644 --- a/modules/auth/webauthn/webauthn.go +++ b/modules/auth/webauthn/webauthn.go @@ -7,10 +7,10 @@ import ( "encoding/binary" "encoding/gob" - "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "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" "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 552b698984..15a8d71828 100644 --- a/modules/auth/webauthn/webauthn_test.go +++ b/modules/auth/webauthn/webauthn_test.go @@ -6,7 +6,7 @@ package webauthn import ( "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 33af60a3b8..106215ec0b 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 - "forgejo.org/modules/avatar/identicon" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/avatar/identicon" + "code.gitea.io/gitea/modules/setting" "golang.org/x/image/draw" diff --git a/modules/avatar/avatar_test.go b/modules/avatar/avatar_test.go index 2166ca51b0..824a38e15b 100644 --- a/modules/avatar/avatar_test.go +++ b/modules/avatar/avatar_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 0a2db53ad4..1b8249c696 100644 --- a/modules/avatar/hash_test.go +++ b/modules/avatar/hash_test.go @@ -9,7 +9,7 @@ import ( "image/png" "testing" - "forgejo.org/modules/avatar" + "code.gitea.io/gitea/modules/avatar" "github.com/stretchr/testify/assert" ) diff --git a/modules/base/tool.go b/modules/base/tool.go index 38201c5919..a885546fde 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -16,9 +16,9 @@ import ( "strings" "unicode/utf8" - "forgejo.org/modules/annex" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/annex" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" "github.com/dustin/go-humanize" ) diff --git a/modules/cache/cache.go b/modules/cache/cache.go index 9ad4b5cd90..2148e028d5 100644 --- a/modules/cache/cache.go +++ b/modules/cache/cache.go @@ -8,7 +8,7 @@ import ( "strconv" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" mc "code.forgejo.org/go-chi/cache" diff --git a/modules/cache/cache_redis.go b/modules/cache/cache_redis.go index 489a585b04..4c243b2426 100644 --- a/modules/cache/cache_redis.go +++ b/modules/cache/cache_redis.go @@ -8,8 +8,8 @@ import ( "strconv" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/nosql" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/nosql" "code.forgejo.org/go-chi/cache" ) diff --git a/modules/cache/cache_test.go b/modules/cache/cache_test.go index 8e931d5b2c..8bc986f1a7 100644 --- a/modules/cache/cache_test.go +++ b/modules/cache/cache_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 08efe703c6..c15ed52da1 100644 --- a/modules/cache/cache_twoqueue.go +++ b/modules/cache/cache_twoqueue.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 457c5c1258..f9bdf52044 100644 --- a/modules/cache/context.go +++ b/modules/cache/context.go @@ -8,7 +8,7 @@ import ( "sync" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 4f0f06f535..072c39440f 100644 --- a/modules/cache/context_test.go +++ b/modules/cache/context_test.go @@ -4,6 +4,7 @@ package cache import ( + "context" "testing" "time" @@ -12,7 +13,7 @@ import ( ) func TestWithCacheContext(t *testing.T) { - ctx := WithCacheContext(t.Context()) + ctx := WithCacheContext(context.Background()) v := GetContextData(ctx, "empty_field", "my_config1") assert.Nil(t, v) @@ -52,7 +53,7 @@ func TestWithCacheContext(t *testing.T) { } func TestWithNoCacheContext(t *testing.T) { - ctx := t.Context() + ctx := context.Background() const field = "system_setting" diff --git a/modules/card/card.go b/modules/card/card.go deleted file mode 100644 index 087cd4ec05..0000000000 --- a/modules/card/card.go +++ /dev/null @@ -1,343 +0,0 @@ -// 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 deleted file mode 100644 index ef695b4549..0000000000 --- a/modules/card/card_test.go +++ /dev/null @@ -1,244 +0,0 @@ -// 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 a8eacf26a0..96e0561e15 100644 --- a/modules/charset/ambiguous.go +++ b/modules/charset/ambiguous.go @@ -9,7 +9,7 @@ import ( "strings" "unicode" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/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 bf7c03a16c..e3fda5be98 100644 --- a/modules/charset/ambiguous/generate.go +++ b/modules/charset/ambiguous/generate.go @@ -13,7 +13,7 @@ import ( "text/template" "unicode" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" "golang.org/x/text/unicode/rangetable" ) diff --git a/modules/charset/breakwriter.go b/modules/charset/breakwriter.go new file mode 100644 index 0000000000..a87e846466 --- /dev/null +++ b/modules/charset/breakwriter.go @@ -0,0 +1,43 @@ +// 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 new file mode 100644 index 0000000000..5eeeedc4e2 --- /dev/null +++ b/modules/charset/breakwriter_test.go @@ -0,0 +1,68 @@ +// 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 cb03deb966..1855446a98 100644 --- a/modules/charset/charset.go +++ b/modules/charset/charset.go @@ -10,9 +10,9 @@ import ( "strings" "unicode/utf8" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 the incomplete character + // instead we walk backwards from the end to trim off a the incomplete character toValidate := content end := len(toValidate) - 1 diff --git a/modules/charset/charset_test.go b/modules/charset/charset_test.go index ef0d1565d6..42c8415376 100644 --- a/modules/charset/charset_test.go +++ b/modules/charset/charset_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,12 +41,14 @@ 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 57b13c1f18..ba0eb73a3a 100644 --- a/modules/charset/escape.go +++ b/modules/charset/escape.go @@ -13,9 +13,9 @@ import ( "slices" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" ) // RuneNBSP is the codepoint for NBSP diff --git a/modules/charset/escape_stream.go b/modules/charset/escape_stream.go index 01ebf52a15..29943eb858 100644 --- a/modules/charset/escape_stream.go +++ b/modules/charset/escape_stream.go @@ -10,7 +10,7 @@ import ( "unicode" "unicode/utf8" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/translation" "golang.org/x/net/html" ) diff --git a/modules/charset/escape_test.go b/modules/charset/escape_test.go index eec6f102cb..2ca76f88d5 100644 --- a/modules/charset/escape_test.go +++ b/modules/charset/escape_test.go @@ -8,9 +8,9 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/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 70f837bc66..15779983fd 100644 --- a/modules/container/set.go +++ b/modules/container/set.go @@ -3,11 +3,6 @@ package container -import ( - "iter" - "maps" -) - type Set[T comparable] map[T]struct{} // SetOf creates a set and adds the specified elements to it. @@ -34,15 +29,6 @@ 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 { @@ -68,9 +54,3 @@ 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 e54e31a052..1502236034 100644 --- a/modules/container/set_test.go +++ b/modules/container/set_test.go @@ -4,7 +4,6 @@ package container import ( - "slices" "testing" "github.com/stretchr/testify/assert" @@ -30,21 +29,8 @@ 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 996a35bdeb..35c5d6ab67 100644 --- a/modules/csv/csv.go +++ b/modules/csv/csv.go @@ -11,9 +11,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/markup" - "forgejo.org/modules/translation" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/csv/csv_test.go b/modules/csv/csv_test.go index 6eb3b3056f..6ed6986629 100644 --- a/modules/csv/csv_test.go +++ b/modules/csv/csv_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "forgejo.org/modules/git" - "forgejo.org/modules/markup" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/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 0e4dbf6e9c..ebcca50903 100644 --- a/modules/eventsource/event.go +++ b/modules/eventsource/event.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 0eaee5dc3c..d4d95ae72a 100644 --- a/modules/eventsource/manager_run.go +++ b/modules/eventsource/manager_run.go @@ -7,15 +7,15 @@ import ( "context" "time" - 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" + 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" ) // Init starts this eventsource diff --git a/modules/forgefed/activity_like.go b/modules/forgefed/activity.go similarity index 91% rename from modules/forgefed/activity_like.go rename to modules/forgefed/activity.go index e52d0a9af6..247abd255a 100644 --- a/modules/forgefed/activity_like.go +++ b/modules/forgefed/activity.go @@ -6,7 +6,7 @@ package forgefed import ( "time" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/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) - result.Object = ap.IRI(objectIRI) + result.Actor = ap.IRI(actorIRI) // That's us, a User + result.Object = ap.IRI(objectIRI) // That's them, a Repository result.StartTime = startTime if valid, err := validation.IsValid(result); !valid { return ForgeLike{}, err @@ -46,23 +46,20 @@ 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")...) } - - 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")...) } + result = append(result, validation.ValidateNotEmpty(like.StartTime.String(), "startTime")...) + if like.StartTime.IsZero() { + result = append(result, "StartTime was invalid.") + } return result } diff --git a/modules/forgefed/activity_like_test.go b/modules/forgefed/activity_test.go similarity index 79% rename from modules/forgefed/activity_like_test.go rename to modules/forgefed/activity_test.go index 815b0e02f3..9a7979c4e6 100644 --- a/modules/forgefed/activity_like_test.go +++ b/modules/forgefed/activity_test.go @@ -10,17 +10,17 @@ import ( "testing" "time" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/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" - startTime, _ := time.Parse("2006-Jan-02", "2024-Mar-07") + 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") sut, err := NewForgeLike(actorIRI, objectIRI, startTime) if err != nil { t.Errorf("unexpected error: %v\n", err) @@ -84,6 +84,7 @@ 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"}`), @@ -99,9 +100,10 @@ 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) { @@ -118,9 +120,7 @@ func Test_LikeUnmarshalJSON(t *testing.T) { } } -func Test_ForgeLikeValidation(t *testing.T) { - // Successful - +func TestActivityValidation(t *testing.T) { sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", @@ -130,37 +130,35 @@ func Test_ForgeLikeValidation(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 err := validateAndCheckError(sut, "type should not be empty"); err != nil { - t.Error(err) + if sut.Validate()[0] != "type should not be empty" { + t.Errorf("validation error expected but was: %v\n", sut.Validate()[0]) } sut.UnmarshalJSON([]byte(`{"type":"bad-type", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", "object":"https://codeberg.org/api/activitypub/repository-id/1", "startTime": "2014-12-31T23:00:00-08:00"}`)) - if err := validateAndCheckError(sut, "Value bad-type is not contained in allowed values [Like]"); err != nil { - t.Error(err) + 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]) } sut.UnmarshalJSON([]byte(`{"type":"Like", "actor":"https://repo.prod.meissa.de/api/activitypub/user-id/1", - "object":"https://codeberg.org/api/activitypub/repository-id/1", - "startTime": "not a date"}`)) - if err := validateAndCheckError(sut, "StartTime was invalid."); err != nil { - t.Error(err) + "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()) } 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 err := validateAndCheckError(sut, "Value Wrong is not contained in allowed values [Like]"); err != nil { - t.Error(err) + "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()) } } @@ -168,6 +166,6 @@ func TestActivityValidation_Attack(t *testing.T) { sut := new(ForgeLike) sut.UnmarshalJSON([]byte(`{rubbish}`)) if len(sut.Validate()) != 5 { - t.Errorf("5 validation errors expected but was: %v\n", len(sut.Validate())) + t.Errorf("5 validateion 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 deleted file mode 100644 index 8b7df582ad..0000000000 --- a/modules/forgefed/activity_undo_like.go +++ /dev/null @@ -1,80 +0,0 @@ -// 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 deleted file mode 100644 index 1b77369b67..0000000000 --- a/modules/forgefed/activity_undo_like_test.go +++ /dev/null @@ -1,246 +0,0 @@ -// 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 deleted file mode 100644 index c1c9164fd2..0000000000 --- a/modules/forgefed/activity_validateandcheckerror_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// 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 c01175f0f6..0ef46185d1 100644 --- a/modules/forgefed/actor.go +++ b/modules/forgefed/actor.go @@ -8,7 +8,7 @@ import ( "net/url" "strings" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" ap "github.com/go-ap/activitypub" ) diff --git a/modules/forgefed/actor_test.go b/modules/forgefed/actor_test.go index e2157a96e4..a3c01eceb0 100644 --- a/modules/forgefed/actor_test.go +++ b/modules/forgefed/actor_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/validation" ap "github.com/go-ap/activitypub" ) diff --git a/modules/forgefed/repository_test.go b/modules/forgefed/repository_test.go index 5aebbbc08f..13a73c10f4 100644 --- a/modules/forgefed/repository_test.go +++ b/modules/forgefed/repository_test.go @@ -8,7 +8,7 @@ import ( "reflect" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ap "github.com/go-ap/activitypub" ) diff --git a/modules/generate/generate.go b/modules/generate/generate.go index 9738195da9..41a6aa2815 100644 --- a/modules/generate/generate.go +++ b/modules/generate/generate.go @@ -11,7 +11,7 @@ import ( "io" "time" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" "github.com/golang-jwt/jwt/v5" ) diff --git a/modules/git/batch_reader.go b/modules/git/batch_reader.go index 1297c7247f..3b1a466b2e 100644 --- a/modules/git/batch_reader.go +++ b/modules/git/batch_reader.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "github.com/djherbis/buffer" "github.com/djherbis/nio/v3" diff --git a/modules/git/blame.go b/modules/git/blame.go index 4ff347e31b..69e1b08f93 100644 --- a/modules/git/blame.go +++ b/modules/git/blame.go @@ -11,8 +11,8 @@ import ( "io" "os" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 - // This was not done in Gitea because it would not have been compatible with Windows. + // There is no equivalent on Windows. May be implemented if Gitea uses an external git backend. 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 c37f40775b..eeeeb9fdb5 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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) 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 b8fc59dd9e..65320c78c0 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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) 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 8f912189ed..bbfab7d005 100644 --- a/modules/git/blob.go +++ b/modules/git/blob.go @@ -10,9 +10,9 @@ import ( "encoding/base64" "io" - "forgejo.org/modules/log" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" ) // Blob represents a Git object. diff --git a/modules/git/command.go b/modules/git/command.go index fd29ac36e9..d3e6b7b8bc 100644 --- a/modules/git/command.go +++ b/modules/git/command.go @@ -12,14 +12,14 @@ import ( "io" "os" "os/exec" - "runtime/trace" + "runtime" "strings" "time" - "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" + "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" ) // TrustedCmdArgs returns the trusted arguments for git command. @@ -317,13 +317,12 @@ func (c *Command) Run(opts *RunOpts) error { var finished context.CancelFunc if opts.UseContextTimeout { - ctx, cancel, finished = process.GetManager().AddTypedContext(c.parentContext, desc, process.GitProcessType, true) + ctx, cancel, finished = process.GetManager().AddContext(c.parentContext, desc) } else { - ctx, cancel, finished = process.GetManager().AddTypedContextTimeout(c.parentContext, timeout, desc, process.GitProcessType, true) + ctx, cancel, finished = process.GetManager().AddContextTimeout(c.parentContext, timeout, desc) } defer finished() - trace.Log(ctx, "command", desc) startTime := time.Now() cmd := exec.CommandContext(ctx, c.prog, c.args...) @@ -358,6 +357,17 @@ 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 } diff --git a/modules/git/command_test.go b/modules/git/command_test.go index ace43598fc..d3b8338d02 100644 --- a/modules/git/command_test.go +++ b/modules/git/command_test.go @@ -4,6 +4,7 @@ package git import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -11,13 +12,13 @@ import ( ) func TestRunWithContextStd(t *testing.T) { - cmd := NewCommand(t.Context(), "--version") + cmd := NewCommand(context.Background(), "--version") stdout, stderr, err := cmd.RunStdString(&RunOpts{}) require.NoError(t, err) assert.Empty(t, stderr) assert.Contains(t, stdout, "git version") - cmd = NewCommand(t.Context(), "--no-such-arg") + cmd = NewCommand(context.Background(), "--no-such-arg") stdout, stderr, err = cmd.RunStdString(&RunOpts{}) if assert.Error(t, err) { assert.Equal(t, stderr, err.Stderr()) @@ -26,16 +27,16 @@ func TestRunWithContextStd(t *testing.T) { assert.Empty(t, stdout) } - cmd = NewCommand(t.Context()) + cmd = NewCommand(context.Background()) cmd.AddDynamicArguments("-test") require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand) - cmd = NewCommand(t.Context()) + cmd = NewCommand(context.Background()) cmd.AddDynamicArguments("--test") require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand) subCmd := "version" - cmd = NewCommand(t.Context()).AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production + cmd = NewCommand(context.Background()).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) @@ -54,15 +55,15 @@ func TestGitArgument(t *testing.T) { } func TestCommandString(t *testing.T) { - cmd := NewCommandContextNoGlobals(t.Context(), "a", "-m msg", "it's a test", `say "hello"`) + cmd := NewCommandContextNoGlobals(context.Background(), "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(t.Context(), "url: https://a:b@c/") + cmd = NewCommandContextNoGlobals(context.Background(), "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(t.Context(), "anything-but-grep") + cmd := NewCommand(context.Background(), "anything-but-grep") assert.Panics(t, func() { cmd.AddGitGrepExpression("whatever") }) diff --git a/modules/git/commit.go b/modules/git/commit.go index baefe3820d..78468b907f 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -15,8 +15,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" "github.com/go-git/go-git/v5/config" ) diff --git a/modules/git/commit_info.go b/modules/git/commit_info.go index 8d9142d362..39e30b127d 100644 --- a/modules/git/commit_info.go +++ b/modules/git/commit_info.go @@ -10,7 +10,7 @@ import ( "path" "sort" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // CommitInfo describes the first commit with the provided entry diff --git a/modules/git/commit_info_test.go b/modules/git/commit_info_test.go index 898ac6b13a..dbe9ab547d 100644 --- a/modules/git/commit_info_test.go +++ b/modules/git/commit_info_test.go @@ -4,6 +4,7 @@ package git import ( + "context" "path/filepath" "testing" "time" @@ -83,7 +84,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(t.Context(), commit, testCase.Path) + commitsInfo, treeCommit, err := entries.GetCommitsInfo(context.TODO(), 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() @@ -160,7 +161,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(b.Context(), commit, "") + _, _, err := entries.GetCommitsInfo(context.Background(), commit, "") if err != nil { b.Fatal(err) } diff --git a/modules/git/commit_reader.go b/modules/git/commit_reader.go index ec8989f5a7..8e2523d7fb 100644 --- a/modules/git/commit_reader.go +++ b/modules/git/commit_reader.go @@ -85,8 +85,6 @@ 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 6b3a364d22..6bb7d776f5 100644 --- a/modules/git/commit_test.go +++ b/modules/git/commit_test.go @@ -189,55 +189,6 @@ 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") diff --git a/modules/git/diff.go b/modules/git/diff.go index 0ba9c60912..d9f3f6dda9 100644 --- a/modules/git/diff.go +++ b/modules/git/diff.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // RawDiffType type of a raw diff. @@ -64,10 +64,7 @@ func GetRepoRawDiffForFile(repo *Repository, startCommit, endCommit string, diff } else if commit.ParentCount() == 0 { cmd.AddArguments("show").AddDynamicArguments(endCommit).AddDashesAndList(files...) } else { - c, err := commit.Parent(0) - if err != nil { - return err - } + c, _ := commit.Parent(0) cmd.AddArguments("diff", "-M").AddDynamicArguments(c.ID.String(), endCommit).AddDashesAndList(files...) } case RawDiffPatch: @@ -77,10 +74,7 @@ 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, err := commit.Parent(0) - if err != nil { - return err - } + c, _ := commit.Parent(0) query := fmt.Sprintf("%s...%s", endCommit, c.ID.String()) cmd.AddArguments("format-patch", "--no-signature", "--stdout").AddDynamicArguments(query).AddDashesAndList(files...) } diff --git a/modules/git/error.go b/modules/git/error.go index 427eb4a5b9..91d25eca69 100644 --- a/modules/git/error.go +++ b/modules/git/error.go @@ -4,14 +4,28 @@ package git import ( - "context" - "errors" "fmt" "strings" + "time" - "forgejo.org/modules/util" + "code.gitea.io/gitea/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 @@ -48,6 +62,21 @@ 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 @@ -156,10 +185,3 @@ 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 99b8207168..8ff239323c 100644 --- a/modules/git/foreachref/format_test.go +++ b/modules/git/foreachref/format_test.go @@ -6,7 +6,7 @@ package foreachref_test import ( "testing" - "forgejo.org/modules/git/foreachref" + "code.gitea.io/gitea/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 1febab80c7..7a37ced356 100644 --- a/modules/git/foreachref/parser_test.go +++ b/modules/git/foreachref/parser_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "forgejo.org/modules/git/foreachref" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/git/foreachref" + "code.gitea.io/gitea/modules/json" "github.com/stretchr/testify/require" ) diff --git a/modules/git/git.go b/modules/git/git.go index c7d5a31b31..f1174e67b9 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -16,8 +16,8 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "github.com/hashicorp/go-version" ) @@ -59,7 +59,15 @@ func loadGitVersion() error { return fmt.Errorf("invalid git version output: %s", stdout) } - versionString := fields[2] + 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] + } var err error gitVersion, err = version.NewVersion(versionString) @@ -272,11 +280,24 @@ 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, - // but 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 + // 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 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 bb07367e3b..cdbd2a1768 100644 --- a/modules/git/git_test.go +++ b/modules/git/git_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 117b09fc83..41466bf537 100644 --- a/modules/git/grep.go +++ b/modules/git/grep.go @@ -17,8 +17,8 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) type GrepResult struct { @@ -28,23 +28,13 @@ 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 // >= git 2.38 ContextLineNumber int - Mode GrepMode - Filename string + IsFuzzy bool + PathSpec []setting.Glob } func (opts *GrepOptions) ensureDefaults() { @@ -85,17 +75,8 @@ 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", - "--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") - } - + "-I", "--null", "--break", "--heading", "--column", + "--fixed-strings", "--line-number", "--ignore-case", "--full-name") cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber)) // --max-count requires at least git 2.38 @@ -106,7 +87,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO } words := []string{search} - if opts.Mode == FixedAnyGrepMode { + if opts.IsFuzzy { words = strings.Fields(search) } for _, word := range words { @@ -114,38 +95,12 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO } // pathspec - 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()) - } + 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()) } for _, expr := range setting.Indexer.ExcludePatterns { files = append(files, ":^"+expr.Pattern()) @@ -201,7 +156,6 @@ 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 534468e268..3ba7a6efcb 100644 --- a/modules/git/grep_test.go +++ b/modules/git/grep_test.go @@ -5,6 +5,7 @@ package git import ( "bytes" + "context" "os" "path" "path/filepath" @@ -19,7 +20,7 @@ func TestGrepSearch(t *testing.T) { require.NoError(t, err) defer repo.Close() - res, err := GrepSearch(t.Context(), repo, "public", GrepOptions{}) + res, err := GrepSearch(context.Background(), repo, "public", GrepOptions{}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -42,7 +43,7 @@ func TestGrepSearch(t *testing.T) { }, }, res) - res, err = GrepSearch(t.Context(), repo, "void", GrepOptions{MaxResultLimit: 1, ContextLineNumber: 2}) + res, err = GrepSearch(context.Background(), repo, "void", GrepOptions{MaxResultLimit: 1, ContextLineNumber: 2}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -59,7 +60,7 @@ func TestGrepSearch(t *testing.T) { }, }, res) - res, err = GrepSearch(t.Context(), repo, "world", GrepOptions{MatchesPerFile: 1}) + res, err = GrepSearch(context.Background(), repo, "world", GrepOptions{MatchesPerFile: 1}) require.NoError(t, err) assert.Equal(t, []*GrepResult{ { @@ -88,25 +89,11 @@ func TestGrepSearch(t *testing.T) { }, }, res) - 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{}) + res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{}) require.NoError(t, err) assert.Empty(t, res) - res, err = GrepSearch(t.Context(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{}) + res, err = GrepSearch(context.Background(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{}) require.Error(t, err) assert.Empty(t, res) } @@ -130,7 +117,7 @@ func TestGrepDashesAreFine(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Dashes are cool sometimes"}) require.NoError(t, err) - res, err := GrepSearch(t.Context(), gitRepo, "--", GrepOptions{}) + res, err := GrepSearch(context.Background(), gitRepo, "--", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Equal(t, "with-dashes", res[0].Filename) @@ -155,7 +142,7 @@ func TestGrepNoBinary(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Binary and text files"}) require.NoError(t, err) - res, err := GrepSearch(t.Context(), gitRepo, "BINARY", GrepOptions{}) + res, err := GrepSearch(context.Background(), gitRepo, "BINARY", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Equal(t, "TEXT", res[0].Filename) @@ -179,7 +166,7 @@ func TestGrepLongFiles(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Long file"}) require.NoError(t, err) - res, err := GrepSearch(t.Context(), gitRepo, "a", GrepOptions{}) + res, err := GrepSearch(context.Background(), gitRepo, "a", GrepOptions{}) require.NoError(t, err) assert.Len(t, res, 1) assert.Len(t, res[0].LineCodes[0], 65*1024) @@ -209,39 +196,8 @@ func TestGrepRefs(t *testing.T) { err = CommitChanges(tmpDir, CommitChangesOptions{Message: "add BCD"}) require.NoError(t, err) - res, err := GrepSearch(t.Context(), gitRepo, "a", GrepOptions{RefName: "v1"}) + res, err := GrepSearch(context.Background(), 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 bef4d024c8..46f93ce13e 100644 --- a/modules/git/hook.go +++ b/modules/git/hook.go @@ -11,8 +11,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 1d7e74a0d7..8c7ee5a933 100644 --- a/modules/git/last_commit_cache.go +++ b/modules/git/last_commit_cache.go @@ -8,8 +8,8 @@ import ( "crypto/sha256" "fmt" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // Cache represents a caching interface diff --git a/modules/git/log_name_status.go b/modules/git/log_name_status.go index e98e8c19a3..1fd58abfcd 100644 --- a/modules/git/log_name_status.go +++ b/modules/git/log_name_status.go @@ -13,7 +13,7 @@ import ( "sort" "strings" - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" "github.com/djherbis/buffer" "github.com/djherbis/nio/v3" diff --git a/modules/git/notes.go b/modules/git/notes.go index c36ab87fbd..ee628c0436 100644 --- a/modules/git/notes.go +++ b/modules/git/notes.go @@ -6,10 +6,9 @@ package git import ( "context" "io" - "os" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // NotesRef is the git ref where Gitea will look for git-notes data. @@ -98,41 +97,3 @@ 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 c7fb433ecf..bbb16ccb14 100644 --- a/modules/git/notes_test.go +++ b/modules/git/notes_test.go @@ -1,36 +1,25 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT -package git_test +package git 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 := git.Note{} - err = git.GetNote(t.Context(), bareRepo1, "95bb4d39648ee7e325106df01a621c530863a653", ¬e) + note := Note{} + err = GetNote(context.Background(), 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) @@ -42,11 +31,11 @@ func TestGetNestedNotes(t *testing.T) { require.NoError(t, err) defer repo.Close() - note := git.Note{} - err = git.GetNote(t.Context(), repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", ¬e) + note := Note{} + err = GetNote(context.Background(), repo, "3e668dbfac39cbc80a9ff9c61eb565d944453ba4", ¬e) require.NoError(t, err) assert.Equal(t, []byte("Note 2"), note.Message) - err = git.GetNote(t.Context(), repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", ¬e) + err = GetNote(context.Background(), repo, "ba0a96fa63532d6c5087ecef070b0250ed72fa47", ¬e) require.NoError(t, err) assert.Equal(t, []byte("Note 1"), note.Message) } @@ -57,46 +46,8 @@ func TestGetNonExistentNotes(t *testing.T) { require.NoError(t, err) defer bareRepo1.Close() - note := git.Note{} - err = git.GetNote(t.Context(), bareRepo1, "non_existent_sha", ¬e) + note := Note{} + err = GetNote(context.Background(), bareRepo1, "non_existent_sha", ¬e) require.Error(t, 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) + assert.IsType(t, ErrNotExist{}, err) } diff --git a/modules/git/parse.go b/modules/git/parse.go index 6bc32057a7..8c2c411db6 100644 --- a/modules/git/parse.go +++ b/modules/git/parse.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 6ada51ae82..4677218150 100644 --- a/modules/git/pipeline/catfile.go +++ b/modules/git/pipeline/catfile.go @@ -13,8 +13,8 @@ import ( "strings" "sync" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) // CatFileBatchCheck runs cat-file with --batch-check @@ -106,36 +106,3 @@ 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 4395e25bd7..3407eb9838 100644 --- a/modules/git/pipeline/lfs.go +++ b/modules/git/pipeline/lfs.go @@ -13,7 +13,7 @@ import ( "sync" "time" - "forgejo.org/modules/git" + "code.gitea.io/gitea/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 70840edf19..ad583a7479 100644 --- a/modules/git/pipeline/namerev.go +++ b/modules/git/pipeline/namerev.go @@ -11,7 +11,7 @@ import ( "strings" "sync" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) // NameRevStdin runs name-rev --stdin diff --git a/modules/git/pipeline/revlist.go b/modules/git/pipeline/revlist.go index f39b7113bb..d88ebe78ef 100644 --- a/modules/git/pipeline/revlist.go +++ b/modules/git/pipeline/revlist.go @@ -12,8 +12,8 @@ import ( "strings" "sync" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/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 1475d4dc5a..2db630e2ea 100644 --- a/modules/git/ref.go +++ b/modules/git/ref.go @@ -7,7 +7,7 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/git/ref_test.go b/modules/git/ref_test.go index 1fd33b5163..58f679b7d6 100644 --- a/modules/git/ref_test.go +++ b/modules/git/ref_test.go @@ -20,8 +20,6 @@ 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 fb66d76ff0..3585313f6a 100644 --- a/modules/git/remote.go +++ b/modules/git/remote.go @@ -5,9 +5,8 @@ package git import ( "context" - "strings" - giturl "forgejo.org/modules/git/url" + giturl "code.gitea.io/gitea/modules/git/url" ) // GetRemoteAddress returns remote url of git repository in the repoPath with special remote name @@ -38,12 +37,3 @@ 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 0f4d1f5afa..84db08d70c 100644 --- a/modules/git/repo.go +++ b/modules/git/repo.go @@ -18,9 +18,9 @@ import ( "strings" "time" - "forgejo.org/modules/proxy" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 2154467332..3ccc1b84a6 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -13,7 +13,7 @@ import ( "strings" "sync/atomic" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/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 && !IsErrCanceledOrKilled(err) { // decorate the returned error + if err != nil { // 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 ee89373b90..8b832e7221 100644 --- a/modules/git/repo_attribute_test.go +++ b/modules/git/repo_attribute_test.go @@ -15,7 +15,7 @@ import ( "testing" "time" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/git/repo_base.go b/modules/git/repo_base.go index a82d59af3c..5f17bc14f6 100644 --- a/modules/git/repo_base.go +++ b/modules/git/repo_base.go @@ -10,7 +10,7 @@ import ( "errors" "path/filepath" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Repository represents a Git repository. diff --git a/modules/git/repo_base_test.go b/modules/git/repo_base_test.go index c9ac6a8559..323b28f476 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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) 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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) 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 1992060351..7339c7db0d 100644 --- a/modules/git/repo_branch.go +++ b/modules/git/repo_branch.go @@ -13,7 +13,7 @@ import ( "io" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 65ab6fd3fd..1f3d64fe03 100644 --- a/modules/git/repo_commit.go +++ b/modules/git/repo_commit.go @@ -12,9 +12,9 @@ import ( "strconv" "strings" - "forgejo.org/modules/cache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // GetBranchCommitID returns last commit ID string of given branch. @@ -22,9 +22,7 @@ func (repo *Repository) GetBranchCommitID(name string) (string, error) { return repo.GetRefCommitID(BranchPrefix + name) } -// 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. +// GetTagCommitID returns last commit ID string of given tag. func (repo *Repository) GetTagCommitID(name string) (string, error) { return repo.GetRefCommitID(TagPrefix + name) } @@ -230,7 +228,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). + AddOptionFormat("--max-count=%d", setting.Git.CommitsRangeSize*opts.Page). 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 9cbc40eee7..e2a9f97fae 100644 --- a/modules/git/repo_commit_test.go +++ b/modules/git/repo_commit_test.go @@ -7,9 +7,6 @@ import ( "path/filepath" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -104,98 +101,3 @@ 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 373b5befb5..b6e9d2b44a 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -18,7 +18,7 @@ import ( "strings" "time" - logger "forgejo.org/modules/log" + logger "code.gitea.io/gitea/modules/log" ) // CompareInfo represents needed information for comparing references. diff --git a/modules/git/repo_gpg.go b/modules/git/repo_gpg.go index 2c94234017..e2b45064fd 100644 --- a/modules/git/repo_gpg.go +++ b/modules/git/repo_gpg.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/process" + "code.gitea.io/gitea/modules/process" ) // LoadPublicKeyContent will load the key from gpg diff --git a/modules/git/repo_index.go b/modules/git/repo_index.go index f58757a9a2..8390570098 100644 --- a/modules/git/repo_index.go +++ b/modules/git/repo_index.go @@ -10,8 +10,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // ReadTreeToIndex reads a treeish to the index @@ -50,35 +50,25 @@ func (repo *Repository) readTreeToIndex(id ObjectID, indexFilename ...string) er } // ReadTreeToTemporaryIndex reads a treeish to a temporary index file -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 - } - }() - - 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) - } - } - } - +func (repo *Repository) ReadTreeToTemporaryIndex(treeish string) (filename, tmpDir string, cancel context.CancelFunc, err error) { tmpDir, err = os.MkdirTemp("", "index") if err != nil { - 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 + 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) + } } - return tmpIndexFilename, tmpDir, cancel, err + err = repo.ReadTreeToIndex(treeish, filename) + if err != nil { + defer cancel() + return "", "", func() {}, err + } + return filename, tmpDir, cancel, err } // EmptyIndex empties the index diff --git a/modules/git/repo_language_stats.go b/modules/git/repo_language_stats.go index 7b76c7bcc7..37c23faf68 100644 --- a/modules/git/repo_language_stats.go +++ b/modules/git/repo_language_stats.go @@ -10,9 +10,9 @@ import ( "strings" "unicode" - "forgejo.org/modules/analyze" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/modules/analyze" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" "github.com/go-enry/go-enry/v2" ) @@ -204,13 +204,7 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err return nil, err } } - - // 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()) + if !isTrue(isGenerated) && enry.IsGenerated(f.Name(), content) { continue } diff --git a/modules/git/repo_language_stats_test.go b/modules/git/repo_language_stats_test.go index ccd7301f81..fd80e44a86 100644 --- a/modules/git/repo_language_stats_test.go +++ b/modules/git/repo_language_stats_test.go @@ -25,15 +25,6 @@ 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 3c8b863f75..550c653729 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -10,7 +10,7 @@ import ( "io" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // GetRefs returns all references of the repository. diff --git a/modules/git/repo_stats.go b/modules/git/repo_stats.go index ef0865e3d3..83220104bd 100644 --- a/modules/git/repo_stats.go +++ b/modules/git/repo_stats.go @@ -13,7 +13,7 @@ import ( "strings" "time" - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" ) // CodeActivityStats represents git statistics data diff --git a/modules/git/repo_tag.go b/modules/git/repo_tag.go index f7f04e1f10..12b0c022cb 100644 --- a/modules/git/repo_tag.go +++ b/modules/git/repo_tag.go @@ -5,20 +5,25 @@ package git import ( + "context" "errors" "fmt" "io" - "slices" "strings" - "forgejo.org/modules/git/foreachref" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/git/foreachref" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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}) @@ -148,9 +153,7 @@ func (repo *Repository) GetTagInfos(page, pageSize int) ([]*Tag, int, error) { return nil, 0, fmt.Errorf("GetTagInfos: parse output: %w", err) } - slices.SortFunc(tags, func(b, a *Tag) int { - return a.Tagger.When.Compare(b.Tagger.When) - }) + sortTagsByTime(tags) 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 a4b13bf03d..1cf420ad63 100644 --- a/modules/git/repo_tag_test.go +++ b/modules/git/repo_tag_test.go @@ -6,7 +6,6 @@ package git import ( "path/filepath" "testing" - "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -31,11 +30,9 @@ 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 c4ef9dbe96..8fb19a5043 100644 --- a/modules/git/repo_test.go +++ b/modules/git/repo_test.go @@ -4,6 +4,7 @@ package git import ( + "context" "path/filepath" "testing" @@ -33,21 +34,21 @@ func TestRepoIsEmpty(t *testing.T) { func TestRepoGetDivergingCommits(t *testing.T) { bareRepo1Path := filepath.Join(testReposDir, "repo1_bare") - do, err := GetDivergingCommits(t.Context(), bareRepo1Path, "master", "branch2") + do, err := GetDivergingCommits(context.Background(), bareRepo1Path, "master", "branch2") require.NoError(t, err) assert.Equal(t, DivergeObject{ Ahead: 1, Behind: 5, }, do) - do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "master") + do, err = GetDivergingCommits(context.Background(), bareRepo1Path, "master", "master") require.NoError(t, err) assert.Equal(t, DivergeObject{ Ahead: 0, Behind: 0, }, do) - do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "test") + do, err = GetDivergingCommits(context.Background(), 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 bd9aebbdd6..c368ce345c 100644 --- a/modules/git/signature.go +++ b/modules/git/signature.go @@ -10,8 +10,8 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // Signature represents the Author, Committer or Tagger information. diff --git a/modules/git/tag.go b/modules/git/tag.go index 64f1b952ad..04f50e8db8 100644 --- a/modules/git/tag.go +++ b/modules/git/tag.go @@ -5,10 +5,11 @@ package git import ( "bytes" + "sort" "strings" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" ) const ( @@ -106,3 +107,23 @@ 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 new file mode 100644 index 0000000000..e6c0223171 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/index differ diff --git a/modules/git/tests/repos/language_stats_repo/logs/HEAD b/modules/git/tests/repos/language_stats_repo/logs/HEAD new file mode 100644 index 0000000000..9cedbb66a9 --- /dev/null +++ b/modules/git/tests/repos/language_stats_repo/logs/HEAD @@ -0,0 +1,2 @@ +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 new file mode 100644 index 0000000000..9cedbb66a9 --- /dev/null +++ b/modules/git/tests/repos/language_stats_repo/logs/refs/heads/master @@ -0,0 +1,2 @@ +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 new file mode 100644 index 0000000000..3c55bab91e Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/1e/ea60592b55dcb45c36029cc1202132e9fb756c 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 new file mode 100644 index 0000000000..947feecea9 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/22/b6aa0588563508d8879f062470c8cbc7b2f2bb 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 new file mode 100644 index 0000000000..9ce337e070 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/34/1fca5b5ea3de596dc483e54c2db28633cd2f97 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 new file mode 100644 index 0000000000..ff3b642734 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/42/25ecfaf6bafbcfa31ea5cbd8121c36d9457085 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 new file mode 100644 index 0000000000..b71abc120c Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/4a/c803638e4b8995146e329a05e096fa2c77a03d 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 new file mode 100644 index 0000000000..5c2485d82f Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/64/4c37ad7fe64ac012df7e59d27a92e3137c640e 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 new file mode 100644 index 0000000000..873cb7187d Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/6c/633a0067b463e459ae952716b17ae36aa30adc 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 new file mode 100644 index 0000000000..f89ecb7d60 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/8e/b563dc106e3dfd3ad0fa81f7a0c5e2604f80cd 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 new file mode 100644 index 0000000000..0219c2d565 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/8f/ee858da5796dfb37704761701bb8e800ad9ef3 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 new file mode 100644 index 0000000000..adc50f2bce Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/aa/a21bf84c8b2304608d3fc83b747840f2456299 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 new file mode 100644 index 0000000000..9d4d4b1a04 Binary files /dev/null and b/modules/git/tests/repos/language_stats_repo/objects/da/a5abe3c5f42cae598e362e8a8db6284565d6bb 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 deleted file mode 100644 index 186136cb12..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.idx and /dev/null 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 deleted file mode 100644 index 046061c688..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.pack and /dev/null 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 deleted file mode 100644 index 7d8c6f3562..0000000000 Binary files a/modules/git/tests/repos/language_stats_repo/objects/pack/pack-371b1f6c24df14da4898b22c00ff8fb55303ac76.rev and /dev/null differ diff --git a/modules/git/tests/repos/language_stats_repo/packed-refs b/modules/git/tests/repos/language_stats_repo/packed-refs deleted file mode 100644 index 63e01583a4..0000000000 --- a/modules/git/tests/repos/language_stats_repo/packed-refs +++ /dev/null @@ -1,2 +0,0 @@ -# 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 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/modules/git/tests/repos/language_stats_repo/refs/heads/master b/modules/git/tests/repos/language_stats_repo/refs/heads/master new file mode 100644 index 0000000000..e89143e56b --- /dev/null +++ b/modules/git/tests/repos/language_stats_repo/refs/heads/master @@ -0,0 +1 @@ +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 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/modules/git/tree.go b/modules/git/tree.go index f6201f6cc9..5b06cbf359 100644 --- a/modules/git/tree.go +++ b/modules/git/tree.go @@ -176,14 +176,3 @@ 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 d51b7992fe..0d9cfd2258 100644 --- a/modules/git/tree_entry.go +++ b/modules/git/tree_entry.go @@ -9,7 +9,7 @@ import ( "sort" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // TreeEntry the leaf in the git tree diff --git a/modules/git/tree_test.go b/modules/git/tree_test.go index 7e439628f2..6e5d7f4415 100644 --- a/modules/git/tree_test.go +++ b/modules/git/tree_test.go @@ -26,18 +26,3 @@ 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 b84df47916..53211c6451 100644 --- a/modules/git/utils.go +++ b/modules/git/utils.go @@ -7,6 +7,7 @@ import ( "crypto/sha1" "encoding/hex" "fmt" + "io" "os" "strconv" "strings" @@ -104,6 +105,32 @@ 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/services/repository/gitgraph/graph.go b/modules/gitgraph/graph.go similarity index 96% rename from services/repository/gitgraph/graph.go rename to modules/gitgraph/graph.go index bf15baed2a..331ad6b218 100644 --- a/services/repository/gitgraph/graph.go +++ b/modules/gitgraph/graph.go @@ -10,13 +10,13 @@ import ( "os" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" ) // GetCommitGraph return a list of commit (GraphItems) from all branches func GetCommitGraph(r *git.Repository, page, maxAllowedColors int, hidePRRefs bool, branches, files []string) (*Graph, error) { - format := "DATA:%D|%H|%aD|%h|%s" + format := "DATA:%D|%H|%ad|%h|%s" if page == 0 { page = 1 diff --git a/services/repository/gitgraph/graph_models.go b/modules/gitgraph/graph_models.go similarity index 91% rename from services/repository/gitgraph/graph_models.go rename to modules/gitgraph/graph_models.go index 20107cc646..82f460ecf0 100644 --- a/services/repository/gitgraph/graph_models.go +++ b/modules/gitgraph/graph_models.go @@ -8,15 +8,14 @@ import ( "context" "fmt" "strings" - "time" - asymkey_model "forgejo.org/models/asymkey" - "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/git" - "forgejo.org/modules/log" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/git" + "code.gitea.io/gitea/modules/log" ) // NewGraph creates a basic graph @@ -199,11 +198,6 @@ func NewCommit(row, column int, line []byte) (*Commit, error) { if len(data) < 5 { return nil, fmt.Errorf("malformed data section on line %d with commit: %s", row, string(line)) } - // Format is a slight modification from RFC1123Z - t, err := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", string(data[2])) - if err != nil { - return nil, fmt.Errorf("could not parse date of commit: %w", err) - } return &Commit{ Row: row, Column: column, @@ -211,8 +205,8 @@ func NewCommit(row, column int, line []byte) (*Commit, error) { Refs: newRefsFromRefNames(data[0]), // 1 matches git log --pretty=format:%H => commit hash Rev: string(data[1]), - // 2 matches git log --pretty=format:%aD => author date, RFC2822 style - Date: t, + // 2 matches git log --pretty=format:%ad => author date (format respects --date= option) + Date: string(data[2]), // 3 matches git log --pretty=format:%h => abbreviated commit hash ShortRev: string(data[3]), // 4 matches git log --pretty=format:%s => subject @@ -251,7 +245,7 @@ type Commit struct { Column int Refs []git.Reference Rev string - Date time.Time + Date string ShortRev string Subject string } diff --git a/services/repository/gitgraph/graph_test.go b/modules/gitgraph/graph_test.go similarity index 99% rename from services/repository/gitgraph/graph_test.go rename to modules/gitgraph/graph_test.go index 374341b276..18d427acd9 100644 --- a/services/repository/gitgraph/graph_test.go +++ b/modules/gitgraph/graph_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) func BenchmarkGetCommitGraph(b *testing.B) { @@ -241,7 +241,7 @@ func TestParseGlyphs(t *testing.T) { } func TestCommitStringParsing(t *testing.T) { - dataFirstPart := "* DATA:|4e61bacab44e9b4730e44a6615d04098dd3a8eaf|Tue, 20 Dec 2016 21:10:41 +0100|4e61bac|" + dataFirstPart := "* DATA:|4e61bacab44e9b4730e44a6615d04098dd3a8eaf|2016-12-20 21:10:41 +0100|4e61bac|" tests := []struct { shouldPass bool testName string diff --git a/services/repository/gitgraph/parser.go b/modules/gitgraph/parser.go similarity index 100% rename from services/repository/gitgraph/parser.go rename to modules/gitgraph/parser.go diff --git a/modules/gitrepo/branch.go b/modules/gitrepo/branch.go index a46e2e6bb7..e13a4c82e1 100644 --- a/modules/gitrepo/branch.go +++ b/modules/gitrepo/branch.go @@ -6,7 +6,7 @@ package gitrepo import ( "context" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) // GetBranchesByPath returns a branch by its path diff --git a/modules/gitrepo/gitrepo.go b/modules/gitrepo/gitrepo.go index a9c920d564..d89f8f9c0c 100644 --- a/modules/gitrepo/gitrepo.go +++ b/modules/gitrepo/gitrepo.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" ) type Repository interface { diff --git a/modules/gitrepo/walk.go b/modules/gitrepo/walk.go index 8349835ff8..8c672ea78b 100644 --- a/modules/gitrepo/walk.go +++ b/modules/gitrepo/walk.go @@ -6,7 +6,7 @@ package gitrepo import ( "context" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) // WalkReferences walks all the references from the repository diff --git a/modules/graceful/manager.go b/modules/graceful/manager.go index db5738c94c..077eac64f3 100644 --- a/modules/graceful/manager.go +++ b/modules/graceful/manager.go @@ -9,9 +9,9 @@ import ( "sync" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" ) type state uint8 diff --git a/modules/graceful/manager_unix.go b/modules/graceful/manager_unix.go index 37edf79075..931b0f1b62 100644 --- a/modules/graceful/manager_unix.go +++ b/modules/graceful/manager_unix.go @@ -1,6 +1,8 @@ // Copyright 2019 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT +//go:build !windows + package graceful import ( @@ -13,10 +15,10 @@ import ( "syscall" "time" - "forgejo.org/modules/graceful/releasereopen" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" + "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" ) func pidMsg() systemdNotifyMsg { diff --git a/modules/graceful/manager_windows.go b/modules/graceful/manager_windows.go new file mode 100644 index 0000000000..bee44381db --- /dev/null +++ b/modules/graceful/manager_windows.go @@ -0,0 +1,190 @@ +// 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 dc38b02d82..796e00507c 100644 --- a/modules/graceful/net_unix.go +++ b/modules/graceful/net_unix.go @@ -3,21 +3,22 @@ // 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" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) const ( @@ -236,11 +237,9 @@ func GetListenerUnix(network string, address *net.UnixAddr) (*net.UnixListener, return nil, 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) - } + 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 deleted file mode 100644 index 144e5a4881..0000000000 --- a/modules/graceful/net_unix_linux_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// 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 new file mode 100644 index 0000000000..9667bd4d13 --- /dev/null +++ b/modules/graceful/net_windows.go @@ -0,0 +1,19 @@ +// 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 a0f3147ec6..98d5c5cc20 100644 --- a/modules/graceful/restart_unix.go +++ b/modules/graceful/restart_unix.go @@ -3,6 +3,8 @@ // 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 121bbed364..2525a83e77 100644 --- a/modules/graceful/server.go +++ b/modules/graceful/server.go @@ -15,9 +15,9 @@ import ( "syscall" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/proxyprotocol" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/proxyprotocol" + "code.gitea.io/gitea/modules/setting" ) // GetListener returns a net listener diff --git a/modules/graceful/server_hooks.go b/modules/graceful/server_hooks.go index 06be783361..9b67589571 100644 --- a/modules/graceful/server_hooks.go +++ b/modules/graceful/server_hooks.go @@ -7,7 +7,7 @@ import ( "os" "runtime" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // awaitShutdown waits for the shutdown signal from the Manager diff --git a/modules/hcaptcha/hcaptcha.go b/modules/hcaptcha/hcaptcha.go index 7f5df9af5a..b970d491c5 100644 --- a/modules/hcaptcha/hcaptcha.go +++ b/modules/hcaptcha/hcaptcha.go @@ -10,8 +10,8 @@ import ( "net/url" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" ) const verifyURL = "https://hcaptcha.com/siteverify" diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index ba3ba479d5..243aa2b566 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -15,10 +15,10 @@ import ( "strings" "sync" - "forgejo.org/modules/analyze" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/analyze" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/alecthomas/chroma/v2" "github.com/alecthomas/chroma/v2/formatters/html" @@ -137,8 +137,7 @@ func CodeFromLexer(lexer chroma.Lexer, code string) template.HTML { // 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", + "F#": "FSharp", } // File returns a slice of chroma syntax highlighted HTML lines of code and the matched lexer name diff --git a/modules/highlight/highlight_test.go b/modules/highlight/highlight_test.go index 6464999033..0127854c8e 100644 --- a/modules/highlight/highlight_test.go +++ b/modules/highlight/highlight_test.go @@ -121,12 +121,6 @@ c=2 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 7978fc38a1..30ce0a4a03 100644 --- a/modules/httpcache/httpcache.go +++ b/modules/httpcache/httpcache.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // SetCacheControlInHeader sets suitable cache-control headers in the response diff --git a/modules/httplib/serve.go b/modules/httplib/serve.go index cd35367bc9..2e3e6a7c42 100644 --- a/modules/httplib/serve.go +++ b/modules/httplib/serve.go @@ -16,13 +16,13 @@ import ( "strings" "time" - 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" + 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" "github.com/klauspost/compress/gzhttp" ) diff --git a/modules/httplib/url.go b/modules/httplib/url.go index 32a02e3277..14b95898f5 100644 --- a/modules/httplib/url.go +++ b/modules/httplib/url.go @@ -7,7 +7,7 @@ import ( "net/url" "strings" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 cd2ceac267..2842edd514 100644 --- a/modules/httplib/url_test.go +++ b/modules/httplib/url_test.go @@ -6,8 +6,8 @@ package httplib import ( "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" ) diff --git a/modules/indexer/code/bleve/bleve.go b/modules/indexer/code/bleve/bleve.go index 5428a9d313..cf9fcbd8b5 100644 --- a/modules/indexer/code/bleve/bleve.go +++ b/modules/indexer/code/bleve/bleve.go @@ -12,18 +12,17 @@ import ( "strings" "time" - 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" + 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" "github.com/blevesearch/bleve/v2" analyzer_custom "github.com/blevesearch/bleve/v2/analysis/analyzer/custom" @@ -40,6 +39,10 @@ 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 { @@ -53,7 +56,6 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { type RepoIndexerData struct { RepoID int64 CommitID string - Filename string Content string Language string UpdatedAt time.Time @@ -67,8 +69,7 @@ func (d *RepoIndexerData) Type() string { const ( repoIndexerAnalyzer = "repoIndexerAnalyzer" repoIndexerDocType = "repoIndexerDocType" - pathHierarchyAnalyzer = "pathHierarchyAnalyzer" - repoIndexerLatestVersion = 7 + repoIndexerLatestVersion = 6 ) // generateBleveIndexMapping generates a bleve index mapping for the repo indexer @@ -88,11 +89,6 @@ 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) @@ -107,13 +103,6 @@ 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) @@ -189,7 +178,6 @@ 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(), @@ -256,14 +244,12 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int keywordQuery query.Query ) - 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) + 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 len(opts.RepoIDs) > 0 { @@ -280,38 +266,28 @@ 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, - inner_bleve.MatchQuery(opts.Language, "Language", analyzer_keyword.Name, 0), + languageQuery, ) } from, pageSize := opts.GetSkipTake() searchRequest := bleve.NewSearchRequestOptions(indexerQuery, pageSize, from, false) - searchRequest.Fields = []string{"Content", "RepoID", "Filename", "Language", "CommitID", "UpdatedAt"} + searchRequest.Fields = []string{"Content", "RepoID", "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 @@ -323,16 +299,13 @@ 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 } } @@ -345,7 +318,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int RepoID: int64(hit.Fields["RepoID"].(float64)), StartIndex: startIndex, EndIndex: endIndex, - Filename: hit.Fields["Filename"].(string), + Filename: internal.FilenameOfIndexerID(hit.ID), Content: hit.Fields["Content"].(string), CommitID: hit.Fields["CommitID"].(string), UpdatedUnix: updatedUnix, @@ -358,7 +331,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", "Filename", "Language", "CommitID", "UpdatedAt"} + facetRequest.Fields = []string{"Content", "RepoID", "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 deleted file mode 100644 index c44aa78c46..0000000000 --- a/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy.go +++ /dev/null @@ -1,71 +0,0 @@ -// 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 deleted file mode 100644 index 0ca3c2941d..0000000000 --- a/modules/indexer/code/bleve/tokenizer/hierarchy/hierarchy_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 3903d77fe0..aee56684e1 100644 --- a/modules/indexer/code/elasticsearch/elasticsearch.go +++ b/modules/indexer/code/elasticsearch/elasticsearch.go @@ -11,30 +11,30 @@ import ( "strconv" "strings" - 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" + 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/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/typesniffer" "github.com/go-enry/go-enry/v2" "github.com/olivere/elastic/v7" ) const ( - esRepoIndexerLatestVersion = 2 + esRepoIndexerLatestVersion = 1 // 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" - esMultiMatchTypePhrase = "phrase" + esMultiMatchTypeBestFields = "best_fields" + esMultiMatchTypePhrasePrefix = "phrase_prefix" ) var _ internal.Indexer = &Indexer{} @@ -57,21 +57,6 @@ 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": { @@ -87,15 +72,6 @@ const ( "type": "keyword", "index": true }, - "filename": { - "type": "text", - "fields": { - "tree": { - "type": "text", - "analyzer": "custom_path_tree" - } - } - }, "language": { "type": "keyword", "index": true @@ -162,7 +138,6 @@ 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(), }), @@ -227,7 +202,7 @@ func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha st 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) + log.Warn("Deletion of entries of repo %v within index %v was erroneus. Trying to refresh index before trying again", repoID, b.inner.VersionedIndexName(), err) if err := b.refreshIndex(ctx); err != nil { return err } @@ -292,6 +267,7 @@ 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 @@ -300,8 +276,8 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int) language := res["language"].(string) hits = append(hits, &internal.SearchResult{ - RepoID: int64(res["repo_id"].(float64)), - Filename: res["filename"].(string), + RepoID: repoID, + Filename: fileName, CommitID: res["commit_id"].(string), Content: res["content"].(string), UpdatedUnix: timeutil.TimeStamp(res["updated_at"].(float64)), @@ -334,8 +310,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 := esMultiMatchTypePhrase - if opts.Mode == internal.CodeSearchModeUnion { + searchType := esMultiMatchTypePhrasePrefix + if opts.IsKeywordFuzzy { searchType = esMultiMatchTypeBestFields } @@ -350,9 +326,6 @@ 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() @@ -371,8 +344,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int NumOfFragments(0). // return all highting content on fragments HighlighterType("fvh"), ). - Sort("_score", false). - Sort("updated_at", true). + Sort("repo_id", true). From(start).Size(pageSize). Do(ctx) if err != nil { @@ -403,8 +375,7 @@ func (b *Indexer) Search(ctx context.Context, opts *internal.SearchOptions) (int NumOfFragments(0). // return all highting content on fragments HighlighterType("fvh"), ). - Sort("_score", false). - Sort("updated_at", true). + Sort("repo_id", 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 14a43cf3be..c7ffcfdd40 100644 --- a/modules/indexer/code/git.go +++ b/modules/indexer/code/git.go @@ -8,11 +8,11 @@ import ( "strconv" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/indexer/code/internal" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + 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" ) 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 c32b637ab4..0a8ce27907 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -11,16 +11,16 @@ import ( "sync/atomic" "time" - "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" + "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" ) var ( diff --git a/modules/indexer/code/indexer_test.go b/modules/indexer/code/indexer_test.go index 29b2936fa1..967aad1b54 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" - "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/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" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,11 +33,10 @@ 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 - Filename string + RepoIDs []int64 + Keyword string + IDs []int64 + Langs int }{ { RepoIDs: nil, @@ -51,20 +50,6 @@ 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", @@ -93,15 +78,14 @@ 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(t.Context(), &internal.SearchOptions{ + total, res, langs, err := indexer.Search(context.TODO(), &internal.SearchOptions{ RepoIDs: kw.RepoIDs, Keyword: kw.Keyword, Paginator: &db.ListOptions{ Page: 1, PageSize: 10, }, - Filename: kw.Filename, - Mode: SearchModeUnion, + IsKeywordFuzzy: true, }) require.NoError(t, err) assert.Len(t, kw.IDs, int(total)) @@ -116,7 +100,7 @@ func testIndexer(name string, t *testing.T, indexer internal.Indexer) { }) } - require.NoError(t, indexer.Delete(t.Context(), repoID)) + require.NoError(t, indexer.Delete(context.Background(), repoID)) }) } @@ -126,7 +110,7 @@ func TestBleveIndexAndSearch(t *testing.T) { dir := t.TempDir() idx := bleve.NewIndexer(dir) - _, err := idx.Init(t.Context()) + _, err := idx.Init(context.Background()) if err != nil { if idx != nil { idx.Close() @@ -148,7 +132,7 @@ func TestESIndexAndSearch(t *testing.T) { } indexer := elasticsearch.NewIndexer(u, "gitea_codes") - if _, err := indexer.Init(t.Context()); err != nil { + if _, err := indexer.Init(context.Background()); err != nil { if indexer != nil { indexer.Close() } diff --git a/modules/indexer/code/internal/indexer.go b/modules/indexer/code/internal/indexer.go index cc2c2aaf06..c259fcd26e 100644 --- a/modules/indexer/code/internal/indexer.go +++ b/modules/indexer/code/internal/indexer.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/indexer/internal" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/indexer/internal" ) // Indexer defines an interface to index and search code contents @@ -20,27 +20,12 @@ 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 - Mode CodeSearchMode + IsKeywordFuzzy bool db.Paginator } diff --git a/modules/indexer/code/internal/model.go b/modules/indexer/code/internal/model.go index ad0a7934d9..f75263c83c 100644 --- a/modules/indexer/code/internal/model.go +++ b/modules/indexer/code/internal/model.go @@ -3,7 +3,7 @@ package internal -import "forgejo.org/modules/timeutil" +import "code.gitea.io/gitea/modules/timeutil" type FileUpdate struct { Filename string diff --git a/modules/indexer/code/internal/util.go b/modules/indexer/code/internal/util.go index f5a4ec8e4e..689c4f4584 100644 --- a/modules/indexer/code/internal/util.go +++ b/modules/indexer/code/internal/util.go @@ -3,8 +3,30 @@ package internal -import "forgejo.org/modules/indexer/internal" +import ( + "strings" + + "code.gitea.io/gitea/modules/indexer/internal" + "code.gitea.io/gitea/modules/log" +) 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 adf51a76d7..f45907ad90 100644 --- a/modules/indexer/code/search.go +++ b/modules/indexer/code/search.go @@ -9,10 +9,10 @@ import ( "html/template" "strings" - "forgejo.org/modules/highlight" - "forgejo.org/modules/indexer/code/internal" - "forgejo.org/modules/timeutil" - "forgejo.org/services/gitdiff" + "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" ) // Result a search result to display @@ -35,15 +35,6 @@ 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 @@ -213,6 +204,7 @@ 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 4a61a80765..1435d2f519 100644 --- a/modules/indexer/internal/bleve/indexer.go +++ b/modules/indexer/internal/bleve/indexer.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/modules/indexer/internal" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/indexer/internal" + "code.gitea.io/gitea/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 08979d3e98..3c570ab4ba 100644 --- a/modules/indexer/internal/bleve/metadata.go +++ b/modules/indexer/internal/bleve/metadata.go @@ -9,7 +9,7 @@ import ( "os" "path/filepath" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) const metaFilename = "rupture_meta.json" diff --git a/modules/indexer/internal/bleve/query.go b/modules/indexer/internal/bleve/query.go index 7f411b516b..90626da4f1 100644 --- a/modules/indexer/internal/bleve/query.go +++ b/modules/indexer/internal/bleve/query.go @@ -4,7 +4,7 @@ package bleve import ( - "forgejo.org/modules/optional" + "code.gitea.io/gitea/modules/optional" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/search/query" @@ -13,27 +13,18 @@ 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 } -// 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 { +func MatchPhraseQuery(matchPhrase, field, analyzer string, fuzziness int) *query.MatchPhraseQuery { q := bleve.NewMatchPhraseQuery(matchPhrase) q.FieldVal = field q.Analyzer = analyzer - q.SetAutoFuzziness(autoFuzzy) + q.Fuzziness = fuzziness return q } diff --git a/modules/indexer/internal/bleve/util.go b/modules/indexer/internal/bleve/util.go index e7311aec6c..d05b679765 100644 --- a/modules/indexer/internal/bleve/util.go +++ b/modules/indexer/internal/bleve/util.go @@ -7,8 +7,8 @@ import ( "errors" "os" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 a1121db333..3deec836c4 100644 --- a/modules/indexer/internal/db/indexer.go +++ b/modules/indexer/internal/db/indexer.go @@ -6,7 +6,7 @@ package db import ( "context" - "forgejo.org/modules/indexer/internal" + "code.gitea.io/gitea/modules/indexer/internal" ) var _ internal.Indexer = &Indexer{} diff --git a/modules/indexer/internal/elasticsearch/indexer.go b/modules/indexer/internal/elasticsearch/indexer.go index 9cd29f3e49..395eea3bce 100644 --- a/modules/indexer/internal/elasticsearch/indexer.go +++ b/modules/indexer/internal/elasticsearch/indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/modules/indexer/internal" + "code.gitea.io/gitea/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 8458bd1326..18cb152d3c 100644 --- a/modules/indexer/internal/elasticsearch/util.go +++ b/modules/indexer/internal/elasticsearch/util.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "github.com/olivere/elastic/v7" ) diff --git a/modules/indexer/internal/meilisearch/util.go b/modules/indexer/internal/meilisearch/util.go index ff41b3a857..845bdb6e7f 100644 --- a/modules/indexer/internal/meilisearch/util.go +++ b/modules/indexer/internal/meilisearch/util.go @@ -6,7 +6,7 @@ package meilisearch import ( "fmt" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 3ef800c630..ee204bf047 100644 --- a/modules/indexer/internal/paginator.go +++ b/modules/indexer/internal/paginator.go @@ -6,7 +6,7 @@ package internal import ( "math" - "forgejo.org/models/db" + "code.gitea.io/gitea/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 64d3c8122e..b20fcc6f80 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 "forgejo.org/modules/indexer/internal" - inner_bleve "forgejo.org/modules/indexer/internal/bleve" - "forgejo.org/modules/indexer/issues/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/indexer/issues/internal" "github.com/blevesearch/bleve/v2" "github.com/blevesearch/bleve/v2/analysis/analyzer/custom" @@ -35,7 +35,13 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error { }) } -const maxBatchSize = 16 +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 +) // IndexerData an update to the issue indexer type IndexerData internal.IndexerData @@ -156,27 +162,16 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( var queries []query.Query if options.Keyword != "" { - tokens, err := options.Tokens() - if err != nil { - return nil, err + fuzziness := 0 + if options.IsFuzzyKeyword { + fuzziness = min(maxFuzziness, len(options.Keyword)/fuzzyDenominator) } - 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)) - 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) + 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), + }...)) } 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 ead57b572f..908514a01a 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" - "forgejo.org/modules/indexer/issues/internal/tests" + "code.gitea.io/gitea/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 9dd026e74f..05ec548435 100644 --- a/modules/indexer/issues/db/db.go +++ b/modules/indexer/issues/db/db.go @@ -6,11 +6,11 @@ package db import ( "context" - "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" + "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" "xorm.io/builder" ) diff --git a/modules/indexer/issues/db/options.go b/modules/indexer/issues/db/options.go index 4411cc1c37..875a4ca279 100644 --- a/modules/indexer/issues/db/options.go +++ b/modules/indexer/issues/db/options.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issue_model "forgejo.org/models/issues" - "forgejo.org/modules/container" - "forgejo.org/modules/indexer/issues/internal" - "forgejo.org/modules/optional" + "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" ) 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 d67dc68bfc..c1f454eeee 100644 --- a/modules/indexer/issues/dboptions.go +++ b/modules/indexer/issues/dboptions.go @@ -4,9 +4,9 @@ package issues import ( - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/optional" ) func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOptions { @@ -78,9 +78,7 @@ func ToSearchOptions(keyword string, opts *issues_model.IssuesOptions) *SearchOp searchOpt.Paginator = opts.Paginator switch opts.SortType { - case "", "relevance": - searchOpt.SortBy = SortByScore - case "latest": + 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 1bf0145796..42e709a5e8 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch.go @@ -9,10 +9,10 @@ import ( "strconv" "strings" - "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" + "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" "github.com/olivere/elastic/v7" ) @@ -23,10 +23,6 @@ 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{} @@ -149,30 +145,12 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( query := elastic.NewBoolQuery() if options.Keyword != "" { - q := elastic.NewBoolQuery() - tokens, err := options.Tokens() - if err != nil { - return nil, err + searchType := esMultiMatchTypePhrasePrefix + if options.IsFuzzyKeyword { + searchType = esMultiMatchTypeBestFields } - 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) - } - switch token.Kind { - case internal.BoolOptMust: - q.Must(innerQ) - case internal.BoolOptShould: - q.Should(innerQ) - case internal.BoolOptNot: - q.MustNot(innerQ) - } - } - query.Must(q) + query.Must(elastic.NewMultiMatchQuery(options.Keyword, "title", "content", "comments").Type(searchType)) } if len(options.RepoIDs) > 0 { @@ -258,7 +236,7 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( } if options.SortBy == "" { - options.SortBy = internal.SortByScore + options.SortBy = internal.SortByCreatedAsc } 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 f8cd4e02f6..4ed0b84442 100644 --- a/modules/indexer/issues/elasticsearch/elasticsearch_test.go +++ b/modules/indexer/issues/elasticsearch/elasticsearch_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "forgejo.org/modules/indexer/issues/internal/tests" + "code.gitea.io/gitea/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 446e714735..d7310529fc 100644 --- a/modules/indexer/issues/indexer.go +++ b/modules/indexer/issues/indexer.go @@ -8,23 +8,22 @@ import ( "fmt" "os" "runtime/pprof" - "strings" "sync/atomic" "time" - 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" + 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" ) // IndexerMetadata is used to send data to the queue, so it contains only the ids. @@ -270,7 +269,6 @@ func IsAvailable(ctx context.Context) bool { type SearchOptions = internal.SearchOptions const ( - SortByScore = internal.SortByScore SortByCreatedDesc = internal.SortByCreatedDesc SortByUpdatedDesc = internal.SortByUpdatedDesc SortByCommentsDesc = internal.SortByCommentsDesc @@ -281,33 +279,6 @@ 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 d3b3494672..a010218b72 100644 --- a/modules/indexer/issues/indexer_test.go +++ b/modules/indexer/issues/indexer_test.go @@ -4,19 +4,19 @@ package issues import ( + "context" "testing" - "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/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" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" "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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, _, err := SearchIssues(context.TODO(), &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(t.Context(), &test.opts) + issueIDs, total, err := SearchIssues(context.TODO(), &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 2f3b4029dc..95740bc598 100644 --- a/modules/indexer/issues/internal/indexer.go +++ b/modules/indexer/issues/internal/indexer.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/modules/indexer/internal" + "code.gitea.io/gitea/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 03f5595a5b..2dfee8b72e 100644 --- a/modules/indexer/issues/internal/model.go +++ b/modules/indexer/issues/internal/model.go @@ -4,9 +4,9 @@ package internal import ( - "forgejo.org/models/db" - "forgejo.org/modules/optional" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/timeutil" ) // IndexerData data stored in the issue indexer @@ -74,6 +74,8 @@ 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 @@ -125,7 +127,6 @@ 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 deleted file mode 100644 index fdb89b09e9..0000000000 --- a/modules/indexer/issues/internal/qstring.go +++ /dev/null @@ -1,112 +0,0 @@ -// 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 deleted file mode 100644 index a911b86e2f..0000000000 --- a/modules/indexer/issues/internal/qstring_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// 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 8308cb7f60..a93b2913e9 100644 --- a/modules/indexer/issues/internal/tests/tests.go +++ b/modules/indexer/issues/internal/tests/tests.go @@ -14,20 +14,20 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/modules/indexer/issues/internal" - "forgejo.org/modules/optional" - "forgejo.org/modules/timeutil" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestIndexer(t *testing.T, indexer internal.Indexer) { - _, err := indexer.Init(t.Context()) + _, err := indexer.Init(context.Background()) require.NoError(t, err) - require.NoError(t, indexer.Ping(t.Context())) + require.NoError(t, indexer.Ping(context.Background())) 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(t.Context(), d...)) + require.NoError(t, indexer.Index(context.Background(), d...)) require.NoError(t, waitData(indexer, int64(len(data)))) } defer func() { - require.NoError(t, indexer.Delete(t.Context(), ids...)) + require.NoError(t, indexer.Delete(context.Background(), ids...)) }() for _, c := range cases { t.Run(c.Name, func(t *testing.T) { if len(c.ExtraData) > 0 { - require.NoError(t, indexer.Index(t.Context(), c.ExtraData...)) + require.NoError(t, indexer.Index(context.Background(), 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(t.Context(), v.ID)) + require.NoError(t, indexer.Delete(context.Background(), v.ID)) delete(data, v.ID) } require.NoError(t, waitData(indexer, int64(len(data)))) }() } - result, err := indexer.Search(t.Context(), c.SearchOptions) + result, err := indexer.Search(context.Background(), 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(t.Context(), c.SearchOptions) + countResult, err := indexer.Search(context.Background(), c.SearchOptions) require.NoError(t, err) assert.Empty(t, countResult.Hits) assert.Equal(t, result.Total, countResult.Total) @@ -126,25 +126,10 @@ 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{ @@ -153,8 +138,8 @@ var cases = []*testIndexerCase{ {ID: 1002, Comments: []string{"hi", "hello world"}}, }, SearchOptions: &internal.SearchOptions{ - Keyword: "hello world", - SortBy: internal.SortByCreatedDesc, + Keyword: "hello world", + IsFuzzyKeyword: true, }, ExpectedIDs: []int64{1002, 1001, 1000}, ExpectedTotal: 3, @@ -172,7 +157,6 @@ var cases = []*testIndexerCase{ }, SearchOptions: &internal.SearchOptions{ Keyword: "hello", - SortBy: internal.SortByCreatedDesc, RepoIDs: []int64{1, 4}, }, ExpectedIDs: []int64{1006, 1002, 1001}, @@ -191,7 +175,6 @@ var cases = []*testIndexerCase{ }, SearchOptions: &internal.SearchOptions{ Keyword: "hello", - SortBy: internal.SortByCreatedDesc, RepoIDs: []int64{1, 4}, AllPublic: true, }, @@ -614,22 +597,6 @@ 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 17a8ba2452..7d18444e6c 100644 --- a/modules/indexer/issues/meilisearch/meilisearch.go +++ b/modules/indexer/issues/meilisearch/meilisearch.go @@ -10,9 +10,9 @@ import ( "strconv" "strings" - indexer_internal "forgejo.org/modules/indexer/internal" - inner_meilisearch "forgejo.org/modules/indexer/internal/meilisearch" - "forgejo.org/modules/indexer/issues/internal" + 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" "github.com/meilisearch/meilisearch-go" ) @@ -208,18 +208,12 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( query.And(inner_meilisearch.NewFilterLte("updated_unix", options.UpdatedBeforeUnix.Value())) } - 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", - } + if options.SortBy == "" { + options.SortBy = internal.SortByCreatedAsc + } + sortBy := []string{ + parseSortBy(options.SortBy), + "id:desc", } skip, limit := indexer_internal.ParsePaginator(options.Paginator, maxTotalHits) @@ -232,36 +226,20 @@ func (b *Indexer) Search(ctx context.Context, options *internal.SearchOptions) ( limit = 1 } - 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) - } + 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) } - 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, - }) + 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, + }) 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 01160a5240..349102b762 100644 --- a/modules/indexer/issues/meilisearch/meilisearch_test.go +++ b/modules/indexer/issues/meilisearch/meilisearch_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - "forgejo.org/modules/indexer/issues/internal" - "forgejo.org/modules/indexer/issues/internal/tests" + "code.gitea.io/gitea/modules/indexer/issues/internal" + "code.gitea.io/gitea/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 3e6c8babe4..e752ae6f24 100644 --- a/modules/indexer/issues/util.go +++ b/modules/indexer/issues/util.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - "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" + "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" ) // 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 0d25192e3c..98a977c700 100644 --- a/modules/indexer/stats/db.go +++ b/modules/indexer/stats/db.go @@ -6,13 +6,13 @@ package stats import ( "fmt" - 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" + 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" ) // 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 482c4b2ab4..7ec89e2afb 100644 --- a/modules/indexer/stats/indexer.go +++ b/modules/indexer/stats/indexer.go @@ -6,10 +6,10 @@ package stats import ( "context" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" + "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" ) // 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 a5899d2506..3ab2e58546 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" - "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/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" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" "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(t.Context(), 5*time.Second)) + require.NoError(t, queue.GetManager().FlushAll(context.Background(), 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 2403eb8dca..d002bd57cf 100644 --- a/modules/indexer/stats/queue.go +++ b/modules/indexer/stats/queue.go @@ -6,11 +6,11 @@ package stats import ( "fmt" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" + 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" ) // statsQueue represents a queue to handle repository stats updates diff --git a/modules/issue/template/template.go b/modules/issue/template/template.go index 8e07cbecd8..967bed0261 100644 --- a/modules/issue/template/template.go +++ b/modules/issue/template/template.go @@ -10,10 +10,10 @@ import ( "strconv" "strings" - "forgejo.org/modules/container" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/container" + api "code.gitea.io/gitea/modules/structs" - "code.forgejo.org/go-chi/binding" + "gitea.com/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 89e8924e95..349dbeabb0 100644 --- a/modules/issue/template/template_test.go +++ b/modules/issue/template/template_test.go @@ -7,8 +7,8 @@ import ( "net/url" "testing" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/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 8df71a3299..0fc13d7ddf 100644 --- a/modules/issue/template/unmarshal.go +++ b/modules/issue/template/unmarshal.go @@ -9,11 +9,11 @@ import ( "path" "strconv" - "forgejo.org/modules/git" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + "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" "gopkg.in/yaml.v3" ) diff --git a/modules/keying/keying.go b/modules/keying/keying.go index 30c664180c..7c595c7f92 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 deterministically generated -// from the same master key. It allows for domain separation to take place by +// 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 // 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,58 +16,50 @@ 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 - // The pseudorandom key generated by HKDF-Extract. - prk []byte -) - -const ( + aead = chacha20poly1305.NewX aeadKeySize = chacha20poly1305.KeySize aeadNonceSize = chacha20poly1305.NonceSizeX + // The pseudorandom key generated by HKDF-Extract. + prk []byte ) // 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. - var err error - prk, err = hkdf.Extract(hash, ikm, nil) - if err != nil { - panic(err) - } + prk = hkdf.Extract(hash, ikm, nil) } // 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 -var ( - // Used for the `push_mirror` table. - ContextPushMirror Context = "pushmirror" - // Used for the `two_factor` table. - ContextTOTP Context = "totp" -) +// Used for the `push_mirror` table. +var ContextPushMirror Context = "pushmirror" -// Derive *the* key for a given context, this is a deterministic function. -// The same key will be provided for the same context. +// Derive *the* key for a given context, this is a determistic function. The +// same key will be provided for the same context. func DeriveKey(context Context) *Key { - if len(prk) != sha256.Size { + if len(prk) == 0 { panic("keying: not initialized") } - key, err := hkdf.Expand(hash, prk, string(context), aeadKeySize) - if err != nil { + 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 { panic(err) } @@ -81,7 +73,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 derived; this allows for more granularity without deriving new keys. +// key was derrived this allows for more granuality 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 @@ -96,7 +88,7 @@ func (k *Key) Encrypt(plaintext, additionalData []byte) []byte { // Generate a random nonce. nonce := make([]byte, aeadNonceSize) - if n, err := rand.Read(nonce); err != nil || n != aeadNonceSize { + if _, err := rand.Read(nonce); err != nil { panic(err) } diff --git a/modules/keying/keying_test.go b/modules/keying/keying_test.go index 87dce0a566..8a6e8d5ab4 100644 --- a/modules/keying/keying_test.go +++ b/modules/keying/keying_test.go @@ -7,7 +7,7 @@ import ( "math" "testing" - "forgejo.org/modules/keying" + "code.gitea.io/gitea/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 initialized", func(t *testing.T) { + t.Run("Not initalized", 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 separation", func(t *testing.T) { + t.Run("Context seperation", 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 deterministic output. + // Ensure ciphertexts don't have an determistic output. assert.NotEqualValues(t, cipherText, cipherText2) }) t.Run("Decrypt", func(t *testing.T) { key := keying.DeriveKey(context) - t.Run("Successful", func(t *testing.T) { + t.Run("Succesful", func(t *testing.T) { convertedPlainText, err := key.Decrypt(cipherText, []byte{0x05, 0x06}) require.NoError(t, err) assert.EqualValues(t, plainText, convertedPlainText) }) - t.Run("Not enough additional data", func(t *testing.T) { + t.Run("Not enougn 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 558ae68def..511bac823f 100644 --- a/modules/label/parser.go +++ b/modules/label/parser.go @@ -8,7 +8,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/options" + "code.gitea.io/gitea/modules/options" "gopkg.in/yaml.v3" ) diff --git a/modules/lfs/content_store.go b/modules/lfs/content_store.go index ba23cec2be..0d9c0c98ac 100644 --- a/modules/lfs/content_store.go +++ b/modules/lfs/content_store.go @@ -11,8 +11,8 @@ import ( "io" "os" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/storage" ) var ( diff --git a/modules/lfs/endpoint.go b/modules/lfs/endpoint.go index b8df4be3ee..97bd7d4446 100644 --- a/modules/lfs/endpoint.go +++ b/modules/lfs/endpoint.go @@ -10,8 +10,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 164dfa0011..71bef5c899 100644 --- a/modules/lfs/filesystem_client.go +++ b/modules/lfs/filesystem_client.go @@ -10,7 +10,7 @@ import ( "os" "path/filepath" - "forgejo.org/modules/util" + "code.gitea.io/gitea/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 e531e2c1fe..4859fe61e1 100644 --- a/modules/lfs/http_client.go +++ b/modules/lfs/http_client.go @@ -13,14 +13,13 @@ import ( "net/url" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/proxy" - "forgejo.org/modules/setting" - - "golang.org/x/sync/errgroup" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/proxy" ) +const httpBatchSize = 20 + // HTTPClient is used to communicate with the LFS server // https://github.com/git-lfs/git-lfs/blob/main/docs/api/batch.md type HTTPClient struct { @@ -31,7 +30,7 @@ type HTTPClient struct { // BatchSize returns the preferred size of batchs to process func (c *HTTPClient) BatchSize() int { - return setting.LFSClient.BatchSize + return httpBatchSize } func newHTTPClient(endpoint *url.URL, httpTransport *http.Transport) *HTTPClient { @@ -72,14 +71,7 @@ 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 { @@ -122,7 +114,6 @@ 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 @@ -143,90 +134,71 @@ 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 { - errGroup.Go(func() error { - return performSingleOperation(groupCtx, object, dc, uc, transferAdapter) - }) - } + 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 + } - // 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 { + 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 { - // 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 { + 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 } } - // 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 } @@ -243,7 +215,6 @@ 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 f825d95951..534a445310 100644 --- a/modules/lfs/http_client_test.go +++ b/modules/lfs/http_client_test.go @@ -11,9 +11,7 @@ import ( "strings" "testing" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -186,84 +184,93 @@ 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: "", }, } - 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, - }, - } + for n, c := range cases { + 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) + err := client.Download(context.Background(), []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 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) + } } } @@ -290,73 +297,81 @@ 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'", }, } - 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, - }, - } + for n, c := range cases { + client := &HTTPClient{ + client: hc, + endpoint: c.endpoint, + transfers: map[string]TransferAdapter{ + "dummy": dummy, + }, + } - 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) - } + err := client.Upload(context.Background(), []Pointer{p}, func(p Pointer, objectError error) (io.ReadCloser, error) { + return io.NopCloser(new(bytes.Buffer)), objectError }) + 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 632ecd19ae..8bbf7a8692 100644 --- a/modules/lfs/pointer_scanner.go +++ b/modules/lfs/pointer_scanner.go @@ -11,8 +11,8 @@ import ( "strings" "sync" - "forgejo.org/modules/git" - "forgejo.org/modules/git/pipeline" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/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 504a726bce..a4326b57b2 100644 --- a/modules/lfs/shared.go +++ b/modules/lfs/shared.go @@ -8,18 +8,14 @@ import ( "fmt" "time" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) const ( // MediaType contains the media type for LFS server requests MediaType = "application/vnd.git-lfs+json" - // AcceptHeader Some LFS servers offer content with other types, so fallback to '*/*' if application/vnd.git-lfs+json cannot be served + // 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 98ac8b9a49..fbc3a3ad8c 100644 --- a/modules/lfs/transferadapter.go +++ b/modules/lfs/transferadapter.go @@ -9,8 +9,8 @@ import ( "io" "net/http" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 aa87d2e01a..0766e4a0a9 100644 --- a/modules/lfs/transferadapter_test.go +++ b/modules/lfs/transferadapter_test.go @@ -5,12 +5,13 @@ package lfs import ( "bytes" + "context" "io" "net/http" "strings" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -94,9 +95,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - _, err := a.Download(t.Context(), c.link) + _, err := a.Download(context.Background(), c.link) if len(c.expectederror) > 0 { - assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + 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) } @@ -127,9 +128,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - err := a.Upload(t.Context(), c.link, p, bytes.NewBufferString("dummy")) + err := a.Upload(context.Background(), c.link, p, bytes.NewBufferString("dummy")) if len(c.expectederror) > 0 { - assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + 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) } @@ -160,9 +161,9 @@ func TestBasicTransferAdapter(t *testing.T) { } for n, c := range cases { - err := a.Verify(t.Context(), c.link, p) + err := a.Verify(context.Background(), c.link, p) if len(c.expectederror) > 0 { - assert.Contains(t, err.Error(), c.expectederror, "case %d: '%s' should contain '%s'", n, err.Error(), c.expectederror) + 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/locale/utils.go b/modules/locale/utils.go deleted file mode 100644 index 726dc92adc..0000000000 --- a/modules/locale/utils.go +++ /dev/null @@ -1,74 +0,0 @@ -// 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 6573d093a5..c08b38c674 100644 --- a/modules/log/color_console_other.go +++ b/modules/log/color_console_other.go @@ -1,6 +1,8 @@ // 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 new file mode 100644 index 0000000000..3f59e934da --- /dev/null +++ b/modules/log/color_console_windows.go @@ -0,0 +1,42 @@ +// 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 deleted file mode 100644 index 28857c2189..0000000000 --- a/modules/log/event_writer_buffer.go +++ /dev/null @@ -1,22 +0,0 @@ -// 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 deleted file mode 100644 index ba9455ba69..0000000000 --- a/modules/log/event_writer_buffer_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// 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 0cf447149a..de8694f2c5 100644 --- a/modules/log/event_writer_conn_test.go +++ b/modules/log/event_writer_conn_test.go @@ -4,6 +4,7 @@ package log import ( + "context" "fmt" "io" "net" @@ -40,7 +41,7 @@ func TestConnLogger(t *testing.T) { level := INFO flags := LstdFlags | LUTC | Lfuncname - logger := NewLoggerWithWriters(t.Context(), "test", NewEventWriterConn("test-conn", WriterMode{ + logger := NewLoggerWithWriters(context.Background(), "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 fd7189e2df..fd73d7d30a 100644 --- a/modules/log/event_writer_file.go +++ b/modules/log/event_writer_file.go @@ -6,7 +6,7 @@ package log import ( "io" - "forgejo.org/modules/util/rotatingfilewriter" + "code.gitea.io/gitea/modules/util/rotatingfilewriter" ) type WriterFileOption struct { diff --git a/modules/log/flags.go b/modules/log/flags.go index afce30680d..cadf54fdd3 100644 --- a/modules/log/flags.go +++ b/modules/log/flags.go @@ -7,7 +7,7 @@ import ( "sort" "strings" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 1ee322c630..a101c42a78 100644 --- a/modules/log/flags_test.go +++ b/modules/log/flags_test.go @@ -6,7 +6,7 @@ package log import ( "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 cd5fb96d52..56d7af42da 100644 --- a/modules/log/groutinelabel.go +++ b/modules/log/groutinelabel.go @@ -1,5 +1,3 @@ -//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 deleted file mode 100644 index e849811bc2..0000000000 --- a/modules/log/groutinelabel_go1.24.go +++ /dev/null @@ -1,38 +0,0 @@ -//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 df8c1e9259..34e99653d6 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(t.Context(), pprof.Labels(), func(ctx context.Context) { + pprof.Do(context.Background(), 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 4c6b7b5f82..3fb5200ad7 100644 --- a/modules/log/init.go +++ b/modules/log/init.go @@ -8,8 +8,8 @@ import ( "runtime" "strings" - "forgejo.org/modules/process" - "forgejo.org/modules/util/rotatingfilewriter" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/util/rotatingfilewriter" ) var projectPackagePrefix string diff --git a/modules/log/level.go b/modules/log/level.go index 2ad1d67f1a..47f7b83f0b 100644 --- a/modules/log/level.go +++ b/modules/log/level.go @@ -7,7 +7,7 @@ import ( "bytes" "strings" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) // Level is the level of the logger diff --git a/modules/log/level_test.go b/modules/log/level_test.go index e6cacc723b..9831ca5650 100644 --- a/modules/log/level_test.go +++ b/modules/log/level_test.go @@ -7,7 +7,7 @@ import ( "fmt" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 b21e800f52..d38c6516ed 100644 --- a/modules/log/logger_impl.go +++ b/modules/log/logger_impl.go @@ -11,8 +11,8 @@ import ( "sync/atomic" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 = strings.TrimSuffix(fn.Name(), "[...]") + "()" + event.Caller = 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 deleted file mode 100644 index 59276a83f4..0000000000 --- a/modules/log/logger_impl_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// 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 e04c9da8b0..0de14eb411 100644 --- a/modules/log/logger_test.go +++ b/modules/log/logger_test.go @@ -4,6 +4,7 @@ package log import ( + "context" "sync" "testing" "time" @@ -52,7 +53,7 @@ func newDummyWriter(name string, level Level, delay time.Duration) *dummyWriter } func TestLogger(t *testing.T) { - logger := NewLoggerWithWriters(t.Context(), "test") + logger := NewLoggerWithWriters(context.Background(), "test") dump := logger.DumpWriters() assert.Empty(t, dump) @@ -87,7 +88,7 @@ func TestLogger(t *testing.T) { } func TestLoggerPause(t *testing.T) { - logger := NewLoggerWithWriters(t.Context(), "test") + logger := NewLoggerWithWriters(context.Background(), "test") w1 := newDummyWriter("dummy-1", DEBUG, 0) logger.AddWriters(w1) @@ -116,7 +117,7 @@ func (t testLogString) LogString() string { } func TestLoggerLogString(t *testing.T) { - logger := NewLoggerWithWriters(t.Context(), "test") + logger := NewLoggerWithWriters(context.Background(), "test") w1 := newDummyWriter("dummy-1", DEBUG, 0) w1.Mode.Colorize = true @@ -129,7 +130,7 @@ func TestLoggerLogString(t *testing.T) { } func TestLoggerExpressionFilter(t *testing.T) { - logger := NewLoggerWithWriters(t.Context(), "test") + logger := NewLoggerWithWriters(context.Background(), "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 739a035977..873029c1bd 100644 --- a/modules/markup/asciicast/asciicast.go +++ b/modules/markup/asciicast/asciicast.go @@ -9,8 +9,8 @@ import ( "net/url" "regexp" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" ) func init() { diff --git a/modules/markup/camo.go b/modules/markup/camo.go index 8380f79280..7e2583469d 100644 --- a/modules/markup/camo.go +++ b/modules/markup/camo.go @@ -10,8 +10,8 @@ import ( "net/url" "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // CamoEncode encodes a lnk to fit with the go-camo and camo proxy links. The purposes of camo-proxy are: diff --git a/modules/markup/camo_test.go b/modules/markup/camo_test.go index d5600996c9..3c5d40afa0 100644 --- a/modules/markup/camo_test.go +++ b/modules/markup/camo_test.go @@ -6,7 +6,7 @@ package markup import ( "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/markup/console/console.go b/modules/markup/console/console.go index c61b6495d3..f544ab218d 100644 --- a/modules/markup/console/console.go +++ b/modules/markup/console/console.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/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 11e0a54e5d..0d4a2bbeb9 100644 --- a/modules/markup/console/console_test.go +++ b/modules/markup/console/console_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "forgejo.org/modules/git" - "forgejo.org/modules/markup" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/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 6a05088ae1..092eec7098 100644 --- a/modules/markup/csv/csv.go +++ b/modules/markup/csv/csv.go @@ -10,11 +10,11 @@ import ( "regexp" "strconv" - "forgejo.org/modules/csv" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" - "forgejo.org/modules/util" + "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" ) func init() { diff --git a/modules/markup/csv/csv_test.go b/modules/markup/csv/csv_test.go index 008a899c05..383f134155 100644 --- a/modules/markup/csv/csv_test.go +++ b/modules/markup/csv/csv_test.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "forgejo.org/modules/git" - "forgejo.org/modules/markup" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/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 950da6e828..b9760772a1 100644 --- a/modules/markup/external/external.go +++ b/modules/markup/external/external.go @@ -9,15 +9,16 @@ import ( "io" "os" "os/exec" + "runtime" "strings" - "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" + "code.gitea.io/gitea/modules/annex" + "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" ) // RegisterRenderers registers all supported third part renderers according settings @@ -70,6 +71,9 @@ func (p *Renderer) DisplayInIFrame() bool { } func envMark(envName string) string { + if runtime.GOOS == "windows" { + return "%" + envName + "%" + } return "$" + envName } diff --git a/modules/markup/file_preview.go b/modules/markup/file_preview.go index 5499eff18c..49a5f1e8ba 100644 --- a/modules/markup/file_preview.go +++ b/modules/markup/file_preview.go @@ -8,17 +8,16 @@ import ( "bytes" "html/template" "io" - "net/url" "regexp" "slices" "strconv" "strings" - "forgejo.org/modules/charset" - "forgejo.org/modules/highlight" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "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" "golang.org/x/net/html" "golang.org/x/net/html/atom" @@ -78,16 +77,6 @@ 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] @@ -124,7 +113,7 @@ func newFilePreview(ctx *RenderContext, node *html.Node, locale translation.Loca titleBuffer.WriteString(" – ") } - err = html.Render(titleBuffer, createLink(urlFullSource, filePath, "muted")) + err = html.Render(titleBuffer, createLink(urlFull, 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 e7be453ea3..2e65827bf7 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup @@ -14,17 +13,17 @@ import ( "strings" "sync" - "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" + "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" "golang.org/x/net/html" "golang.org/x/net/html/atom" @@ -49,13 +48,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)[^\w\d]{0,2}([0-9a-f]{7,64})[^\w\d]{0,2}(?:\s|$)`) + hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,:](\s|$))`) // shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`) - // 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]+)?`) + // 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]+)?`) // 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]+)?`) @@ -473,7 +472,7 @@ func createInlineCode(content string) *html.Node { return code } -func createEmoji(content, class, name, alias string) *html.Node { +func createEmoji(content, class, name string) *html.Node { span := &html.Node{ Type: html.ElementNode, Data: atom.Span.String(), @@ -485,9 +484,6 @@ func createEmoji(content, class, name, alias 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, @@ -506,7 +502,6 @@ 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, @@ -760,6 +755,9 @@ 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 @@ -770,6 +768,9 @@ 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 { @@ -1146,7 +1147,7 @@ func emojiShortCodeProcessor(ctx *RenderContext, node *html.Node) { continue } - replaceContent(node, m[0], m[1], createEmoji(converted.Emoji, "emoji", converted.Description, alias)) + replaceContent(node, m[0], m[1], createEmoji(converted.Emoji, "emoji", converted.Description)) node = node.NextSibling.NextSibling start = 0 } @@ -1168,14 +1169,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, val.Aliases[0])) + replaceContent(node, m[0], m[1], createEmoji(codepoint, "emoji", val.Description)) node = node.NextSibling.NextSibling start = 0 } } } -// hashCurrentPatternProcessor renders SHA1/SHA256 strings to corresponding links that +// hashCurrentPatternProcessor renders SHA1 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 08b1fed505..a72be9f8cf 100644 --- a/modules/markup/html_internal_test.go +++ b/modules/markup/html_internal_test.go @@ -1,5 +1,4 @@ // Copyright 2018 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup @@ -10,9 +9,9 @@ import ( "strings" "testing" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -392,7 +391,7 @@ func TestRender_FullIssueURLs(t *testing.T) { `testOrg/testOrgRepo#2/commits`) } -func TestRegExp_hashCurrentPattern(t *testing.T) { +func TestRegExp_sha1CurrentPattern(t *testing.T) { trueTestCases := []string{ "d8a994ef243349f321568f9e36d5c3f444b99cae", "abcdefabcdefabcdefabcdefabcdefabcdefabcd", @@ -400,13 +399,6 @@ func TestRegExp_hashCurrentPattern(t *testing.T) { "[abcdefabcdefabcdefabcdefabcdefabcdefabcd]", "abcdefabcdefabcdefabcdefabcdefabcdefabcd.", "abcdefabcdefabcdefabcdefabcdefabcdefabcd:", - "d8a994ef243349f321568f9e36d5c3f444b99cae12424fa123391042fbae2319", - "abcdefd?", - "abcdefd!", - "!abcd3ef", - ":abcd3ef", - ".abcd3ef", - " (abcd3ef). ", } falseTestCases := []string{ "test", @@ -414,8 +406,6 @@ func TestRegExp_hashCurrentPattern(t *testing.T) { "e59ff077-2d03-4e6b-964d-63fbaea81f", "abcdefghijklmnopqrstuvwxyzabcdefghijklmn", "abcdefghijklmnopqrstuvwxyzabcdefghijklmO", - "commit/abcdefd", - "abcd3ef...defabcd", } for _, testCase := range trueTestCases { @@ -469,10 +459,6 @@ 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 d503796eb6..68d1ada5b3 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. // SPDX-License-Identifier: MIT package markup_test @@ -11,16 +10,16 @@ import ( "strings" "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -330,42 +329,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( @@ -417,7 +416,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 := "https://forgejo.org/favicon.ico" + favicon := "http://google.com/favicon.ico" test( "[[Link]]", @@ -425,28 +424,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

    `, @@ -473,16 +472,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]]

    `, @@ -602,10 +601,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)`) } @@ -680,7 +679,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(t.Context()) + translation.InitLocales(context.Background()) setting.AppURL = markup.TestAppURL markup.Init(&markup.ProcessorHelper{ @@ -1027,138 +1026,4 @@ 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 c2fbbe6692..7f0ac6a92c 100644 --- a/modules/markup/markdown/ast.go +++ b/modules/markup/markdown/ast.go @@ -34,6 +34,13 @@ 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 @@ -59,6 +66,13 @@ 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 @@ -89,6 +103,13 @@ 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 @@ -118,6 +139,13 @@ 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 49ad249696..9b8b611d18 100644 --- a/modules/markup/markdown/callout/github.go +++ b/modules/markup/markdown/callout/github.go @@ -7,7 +7,7 @@ package callout import ( "strings" - "forgejo.org/modules/svg" + "code.gitea.io/gitea/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.Value(reader.Source())) != "[" { + if !ok || string(firstTextNode.Text(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.Value(reader.Source()) + secondTextNodeText := secondTextNode.Text(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.Value(reader.Source())) != "]" { + if !ok || string(thirdTextNode.Text(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 e77da73dd9..96354b142b 100644 --- a/modules/markup/markdown/callout/github_legacy.go +++ b/modules/markup/markdown/callout/github_legacy.go @@ -7,8 +7,6 @@ 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" @@ -42,7 +40,7 @@ func (g *GitHubLegacyCalloutTransformer) Transform(node *ast.Document, reader te if !ok { return ast.WalkContinue, nil } - calloutText := string(util.Text(calloutNode, reader.Source())) + calloutText := string(calloutNode.Text(reader.Source())) calloutType := strings.ToLower(calloutText) // We only support "Note" and "Warning" callouts in legacy mode, // match only those. diff --git a/modules/markup/markdown/color_util.go b/modules/markup/markdown/color_util.go index efbde6b730..355fef3fc0 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,4}|[0-9a-f]{6}|[0-9a-f]{8})$`) + hexRGB = regexp.MustCompile(`^#([0-9a-f]{3}|[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 9f6448cf8c..c6e0555a35 100644 --- a/modules/markup/markdown/color_util_test.go +++ b/modules/markup/markdown/color_util_test.go @@ -17,7 +17,6 @@ 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 9a901a2287..0290e1312d 100644 --- a/modules/markup/markdown/goldmark.go +++ b/modules/markup/markdown/goldmark.go @@ -8,8 +8,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" "github.com/yuin/goldmark/ast" east "github.com/yuin/goldmark/extension/ast" @@ -203,7 +203,8 @@ func (r *HTMLRenderer) renderIcon(w util.BufWriter, source []byte, node ast.Node return ast.WalkContinue, nil } - _, err := w.WriteString(fmt.Sprintf(``, name)) + var err error + _, 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 db92631acc..d249d25014 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -11,13 +11,13 @@ import ( "strings" "sync" - "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" + "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" 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 e229ee4c65..cc2becad05 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -10,14 +10,14 @@ import ( "strings" "testing" - "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" + "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" "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
        -
      2. +images/1.png
      3. Perform a test run by hitting the Run! button.
        -
      4. +images/2.png

      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: t.Context(), Links: c.Links, IsWiki: c.IsWiki}, input) + result, err := markdown.RenderString(&markup.RenderContext{Ctx: context.Background(), 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) } diff --git a/modules/markup/markdown/math/math.go b/modules/markup/markdown/math/math.go index 4126dc9ad6..3d9f376bc6 100644 --- a/modules/markup/markdown/math/math.go +++ b/modules/markup/markdown/math/math.go @@ -39,6 +39,28 @@ 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 036481dc05..63d7fadc0a 100644 --- a/modules/markup/markdown/prefixed_id.go +++ b/modules/markup/markdown/prefixed_id.go @@ -7,9 +7,9 @@ import ( "bytes" "fmt" - "forgejo.org/modules/container" - "forgejo.org/modules/markup/common" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/markup/common" + "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/renderconfig.go b/modules/markup/markdown/renderconfig.go index 5c3eb1beec..f4c48d1b3d 100644 --- a/modules/markup/markdown/renderconfig.go +++ b/modules/markup/markdown/renderconfig.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/markup" + "code.gitea.io/gitea/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 dbfab3e9dc..38f744a25f 100644 --- a/modules/markup/markdown/toc.go +++ b/modules/markup/markdown/toc.go @@ -7,8 +7,8 @@ import ( "fmt" "net/url" - "forgejo.org/modules/markup" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/translation" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_codespan.go b/modules/markup/markdown/transform_codespan.go index 15c3a44f0a..a2cd4fb5ba 100644 --- a/modules/markup/markdown/transform_codespan.go +++ b/modules/markup/markdown/transform_codespan.go @@ -8,8 +8,7 @@ import ( "fmt" "strings" - "forgejo.org/modules/markup" - mdutil "forgejo.org/modules/markup/markdown/util" + "code.gitea.io/gitea/modules/markup" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/renderer/html" @@ -50,7 +49,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 := mdutil.Text(v, reader.Source()) + colorContent := v.Text(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 eedaf58556..6d48f34d93 100644 --- a/modules/markup/markdown/transform_heading.go +++ b/modules/markup/markdown/transform_heading.go @@ -6,9 +6,8 @@ package markdown import ( "fmt" - "forgejo.org/modules/markup" - mdutil "forgejo.org/modules/markup/markdown/util" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/text" @@ -20,7 +19,7 @@ func (g *ASTTransformer) transformHeading(_ *markup.RenderContext, v *ast.Headin v.SetAttribute(attr.Name, []byte(fmt.Sprintf("%v", attr.Value))) } } - txt := mdutil.Text(v, reader.Source()) + txt := v.Text(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 0f9c69cae6..b34a710fed 100644 --- a/modules/markup/markdown/transform_image.go +++ b/modules/markup/markdown/transform_image.go @@ -6,8 +6,8 @@ package markdown import ( "strings" - "forgejo.org/modules/markup" - giteautil "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/markup" + giteautil "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_link.go b/modules/markup/markdown/transform_link.go index 48e3479563..e6f3836412 100644 --- a/modules/markup/markdown/transform_link.go +++ b/modules/markup/markdown/transform_link.go @@ -7,9 +7,9 @@ import ( "bytes" "slices" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - giteautil "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + giteautil "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/markdown/transform_list.go b/modules/markup/markdown/transform_list.go index 03b3c4e89c..b982fd4a83 100644 --- a/modules/markup/markdown/transform_list.go +++ b/modules/markup/markdown/transform_list.go @@ -6,7 +6,7 @@ package markdown import ( "fmt" - "forgejo.org/modules/markup" + "code.gitea.io/gitea/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 deleted file mode 100644 index 8a42e5835b..0000000000 --- a/modules/markup/markdown/util/text.go +++ /dev/null @@ -1,26 +0,0 @@ -// 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 6a34ac81c4..2a69d95224 100644 --- a/modules/markup/mdstripper/mdstripper.go +++ b/modules/markup/mdstripper/mdstripper.go @@ -10,9 +10,9 @@ import ( "strings" "sync" - "forgejo.org/modules/log" - "forgejo.org/modules/markup/common" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup/common" + "code.gitea.io/gitea/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.Value(source), + v.Text(source), coalesce) if v.SoftLineBreak() { r.doubleSpace(w) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index b9d7b21db0..391ee6c12b 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -9,11 +9,11 @@ import ( "io" "strings" - "forgejo.org/modules/highlight" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" "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 cdaa9f18ce..f41d86a8a8 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -7,10 +7,10 @@ import ( "strings" "testing" - "forgejo.org/modules/git" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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 8eec764bbe..c00bd2b56e 100644 --- a/modules/markup/renderer.go +++ b/modules/markup/renderer.go @@ -14,9 +14,9 @@ import ( "strings" "sync" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/yuin/goldmark/ast" ) diff --git a/modules/markup/sanitizer.go b/modules/markup/sanitizer.go index 7ff11f0844..e63a6dd6f4 100644 --- a/modules/markup/sanitizer.go +++ b/modules/markup/sanitizer.go @@ -10,7 +10,7 @@ import ( "regexp" "sync" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/microcosm-cc/bluemonday" ) @@ -94,7 +94,7 @@ func createDefaultPolicy() *bluemonday.Policy { } // Allow classes for anchors - policy.AllowAttrs("class").Matching(regexp.MustCompile(`^(ref-issue( ref-external-issue)?|mention)$`)).OnElements("a") + policy.AllowAttrs("class").Matching(regexp.MustCompile(`^ref-issue( ref-external-issue)?$`)).OnElements("a") // Allow classes for task lists policy.AllowAttrs("class").Matching(regexp.MustCompile(`^task-list-item$`)).OnElements("li") @@ -110,7 +110,6 @@ func createDefaultPolicy() *bluemonday.Policy { // 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") diff --git a/modules/markup/sanitizer_test.go b/modules/markup/sanitizer_test.go index 9805a34910..4441a41544 100644 --- a/modules/markup/sanitizer_test.go +++ b/modules/markup/sanitizer_test.go @@ -68,13 +68,6 @@ 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 deleted file mode 100644 index 1ab268b76c..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec deleted file mode 100644 index c8b99f906b..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 deleted file mode 100644 index f799e8a988..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 deleted file mode 100644 index 7f4c451d00..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd deleted file mode 100644 index fc97712911..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 deleted file mode 100644 index e230df1343..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 deleted file mode 100644 index 1493caa3df..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 deleted file mode 100644 index 3e9c0c0d8b..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca deleted file mode 100644 index 78189a52f6..0000000000 --- a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index d781d4d248..0000000000 --- a/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100644 index 7b926dc0d8..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e deleted file mode 100644 index 0bbca73af2..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 deleted file mode 100644 index 0ea93376dc..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e deleted file mode 100644 index 394a7bb50d..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f deleted file mode 100644 index ab36311f6f..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 deleted file mode 100644 index 59afaebf4a..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf deleted file mode 100644 index 3de089bf6a..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 deleted file mode 100644 index af5b784773..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be deleted file mode 100644 index 9fc2b7c312..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 deleted file mode 100644 index ef73ed1791..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d deleted file mode 100644 index 5515b07d4a..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 deleted file mode 100644 index 2e15b4fb0a..0000000000 Binary files a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 and /dev/null differ diff --git a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master index 709cffca17..df25bf45f0 100644 --- a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master +++ b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master @@ -1 +1 @@ -eeb243c3395e1921c5d90e73bd739827251fc99d +4c1aaf56bcb9f39dcf65f3f250726850aed13cd6 diff --git a/modules/mcaptcha/mcaptcha.go b/modules/mcaptcha/mcaptcha.go index dbcafce29f..74142aa863 100644 --- a/modules/mcaptcha/mcaptcha.go +++ b/modules/mcaptcha/mcaptcha.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "codeberg.org/gusted/mcaptcha" ) diff --git a/modules/metrics/collector.go b/modules/metrics/collector.go index 5b6787d2f7..230260ff94 100755 --- a/modules/metrics/collector.go +++ b/modules/metrics/collector.go @@ -6,9 +6,9 @@ package metrics import ( "runtime" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/modules/setting" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" "github.com/prometheus/client_golang/prometheus" ) diff --git a/modules/migration/downloader.go b/modules/migration/downloader.go index 48bdf0456d..08dbbc29a9 100644 --- a/modules/migration/downloader.go +++ b/modules/migration/downloader.go @@ -7,7 +7,7 @@ package migration import ( "context" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/structs" ) // Downloader downloads the site repo information diff --git a/modules/migration/file_format.go b/modules/migration/file_format.go index 8851ad6de7..d29d24dd0b 100644 --- a/modules/migration/file_format.go +++ b/modules/migration/file_format.go @@ -9,8 +9,8 @@ import ( "strings" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 63bbe60758..234e72c295 100644 --- a/modules/migration/options.go +++ b/modules/migration/options.go @@ -4,7 +4,7 @@ package migration -import "forgejo.org/modules/structs" +import "code.gitea.io/gitea/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 0861ab24f1..1435991bd2 100644 --- a/modules/migration/pullrequest.go +++ b/modules/migration/pullrequest.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) // PullRequest defines a standard pull request information @@ -34,11 +34,9 @@ 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 a85d38084d..22c2cf6fb3 100644 --- a/modules/migration/repo.go +++ b/modules/migration/repo.go @@ -14,5 +14,4 @@ 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 7eea069e09..0ba21585fa 100644 --- a/modules/nosql/manager.go +++ b/modules/nosql/manager.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "forgejo.org/modules/process" + "code.gitea.io/gitea/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 087aac3e9a..4d2c90debc 100644 --- a/modules/nosql/manager_leveldb.go +++ b/modules/nosql/manager_leveldb.go @@ -10,7 +10,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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 bdaade1b47..79a533bd6b 100644 --- a/modules/nosql/manager_redis.go +++ b/modules/nosql/manager_redis.go @@ -11,7 +11,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "github.com/redis/go-redis/v9" ) diff --git a/modules/optional/option_test.go b/modules/optional/option_test.go index f6d22d2431..203e9221e3 100644 --- a/modules/optional/option_test.go +++ b/modules/optional/option_test.go @@ -6,7 +6,7 @@ package optional_test import ( "testing" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/modules/optional" "github.com/stretchr/testify/assert" ) diff --git a/modules/optional/serialization.go b/modules/optional/serialization.go index 86c1c97341..b120a0edf6 100644 --- a/modules/optional/serialization.go +++ b/modules/optional/serialization.go @@ -4,7 +4,7 @@ package optional import ( - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" "gopkg.in/yaml.v3" ) diff --git a/modules/optional/serialization_test.go b/modules/optional/serialization_test.go index 80fe1c9805..c852b8a70f 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" - "forgejo.org/modules/json" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 3ae8c56b79..6c6e3839f4 100644 --- a/modules/options/base.go +++ b/modules/options/base.go @@ -4,8 +4,8 @@ package options import ( - "forgejo.org/modules/assetfs" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/setting" ) func CustomAssets() *assetfs.Layer { diff --git a/modules/options/dynamic.go b/modules/options/dynamic.go index 8eed8516ab..085492d11c 100644 --- a/modules/options/dynamic.go +++ b/modules/options/dynamic.go @@ -6,8 +6,8 @@ package options import ( - "forgejo.org/modules/assetfs" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/options/static.go b/modules/options/static.go index 02091a2b1c..72b28e990e 100644 --- a/modules/options/static.go +++ b/modules/options/static.go @@ -6,7 +6,7 @@ package options import ( - "forgejo.org/modules/assetfs" + "code.gitea.io/gitea/modules/assetfs" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/packages/alpine/metadata.go b/modules/packages/alpine/metadata.go index 8562612206..582c42610d 100644 --- a/modules/packages/alpine/metadata.go +++ b/modules/packages/alpine/metadata.go @@ -13,8 +13,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" ) var ( diff --git a/modules/packages/arch/metadata.go b/modules/packages/arch/metadata.go index f967bd25a0..6cdde75cdc 100644 --- a/modules/packages/arch/metadata.go +++ b/modules/packages/arch/metadata.go @@ -4,7 +4,6 @@ package arch import ( - "archive/tar" "bufio" "bytes" "encoding/hex" @@ -15,9 +14,9 @@ import ( "strconv" "strings" - "forgejo.org/modules/packages" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "github.com/mholt/archiver/v3" ) @@ -26,9 +25,7 @@ import ( // https://man.archlinux.org/man/PKGBUILD.5 const ( - PropertyDescription = "arch.description" - PropertyFiles = "arch.files" - + PropertyDescription = "arch.description" PropertyArch = "arch.architecture" PropertyDistribution = "arch.distribution" @@ -88,13 +85,11 @@ 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 @@ -132,8 +127,6 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) { var pkg *Package var mTree bool - files := make([]string, 0) - for { f, err := tarball.Read() if err == io.EOF { @@ -142,11 +135,6 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) { if err != nil { return nil, err } - // 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) @@ -167,7 +155,7 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) { 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) @@ -351,12 +339,3 @@ 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 16c1c1637d..ddb35ca837 100644 --- a/modules/packages/arch/metadata_test.go +++ b/modules/packages/arch/metadata_test.go @@ -12,7 +12,7 @@ import ( "testing/fstest" "time" - "forgejo.org/modules/packages" + "code.gitea.io/gitea/modules/packages" "github.com/mholt/archiver/v3" "github.com/stretchr/testify/require" @@ -344,8 +344,8 @@ func TestValidatePackageSpec(t *testing.T) { }) } -func TestDescAndFileString(t *testing.T) { - const pkgDesc = `%FILENAME% +func TestDescString(t *testing.T) { + const pkgdesc = `%FILENAME% zstd-1.5.5-1-x86_64.pkg.tar.zst %NAME% @@ -415,12 +415,6 @@ ninja dummy5 dummy6 -` - - const pkgFiles = `%FILES% -usr/ -usr/bin/ -usr/bin/zstd ` md := &Package{ @@ -447,9 +441,7 @@ usr/bin/zstd 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, pkgFiles, md.Files()) + require.Equal(t, pkgdesc, md.Desc()) } diff --git a/modules/packages/cargo/parser.go b/modules/packages/cargo/parser.go index f2c75538b5..a09cfc1f73 100644 --- a/modules/packages/cargo/parser.go +++ b/modules/packages/cargo/parser.go @@ -9,8 +9,8 @@ import ( "io" "regexp" - "forgejo.org/modules/json" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/chef/metadata.go b/modules/packages/chef/metadata.go index 951606bbc5..a1c91870c2 100644 --- a/modules/packages/chef/metadata.go +++ b/modules/packages/chef/metadata.go @@ -10,9 +10,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" ) const ( diff --git a/modules/packages/composer/metadata.go b/modules/packages/composer/metadata.go index 940309b769..6035eae8ca 100644 --- a/modules/packages/composer/metadata.go +++ b/modules/packages/composer/metadata.go @@ -10,9 +10,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/composer/metadata_test.go b/modules/packages/composer/metadata_test.go index e2bbff4e58..2bdb23965b 100644 --- a/modules/packages/composer/metadata_test.go +++ b/modules/packages/composer/metadata_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 6027e51401..de11dbee45 100644 --- a/modules/packages/conan/conaninfo_parser.go +++ b/modules/packages/conan/conaninfo_parser.go @@ -8,7 +8,7 @@ import ( "io" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // Conaninfo represents infos of a Conan package diff --git a/modules/packages/conan/reference.go b/modules/packages/conan/reference.go index 0b863240cb..58f268bd48 100644 --- a/modules/packages/conan/reference.go +++ b/modules/packages/conan/reference.go @@ -8,8 +8,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/packages/conda/metadata.go b/modules/packages/conda/metadata.go index f61cc61c2a..76ba95eace 100644 --- a/modules/packages/conda/metadata.go +++ b/modules/packages/conda/metadata.go @@ -10,10 +10,10 @@ import ( "io" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/modules/zstd" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/modules/zstd" ) var ( diff --git a/modules/packages/conda/metadata_test.go b/modules/packages/conda/metadata_test.go index 959f9c4727..25b0295157 100644 --- a/modules/packages/conda/metadata_test.go +++ b/modules/packages/conda/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "forgejo.org/modules/zstd" + "code.gitea.io/gitea/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 ec9d834357..2a41fb9105 100644 --- a/modules/packages/container/metadata.go +++ b/modules/packages/container/metadata.go @@ -8,9 +8,9 @@ import ( "io" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/packages/container/helm" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/packages/container/helm" + "code.gitea.io/gitea/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 6c8c6ea5b9..930cf48f68 100644 --- a/modules/packages/container/metadata_test.go +++ b/modules/packages/container/metadata_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - "forgejo.org/modules/packages/container/helm" + "code.gitea.io/gitea/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 f4578d91e0..da93e6cf6b 100644 --- a/modules/packages/content_store.go +++ b/modules/packages/content_store.go @@ -9,9 +9,9 @@ import ( "path" "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/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, reqParams url.Values) (*url.URL, error) { - return s.store.URL(KeyToRelativePath(key), filename, reqParams) +func (s *ContentStore) GetServeDirectURL(key BlobHash256Key, filename string) (*url.URL, error) { + return s.store.URL(KeyToRelativePath(key), filename) } // FIXME: Workaround to be removed in v1.20 diff --git a/modules/packages/cran/metadata.go b/modules/packages/cran/metadata.go index 547fe87ccb..0b0bfb07c6 100644 --- a/modules/packages/cran/metadata.go +++ b/modules/packages/cran/metadata.go @@ -13,7 +13,7 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go index e44801654b..e76db63975 100644 --- a/modules/packages/debian/metadata.go +++ b/modules/packages/debian/metadata.go @@ -12,9 +12,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/modules/zstd" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/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 cfcbc57ee0..6f6c469989 100644 --- a/modules/packages/debian/metadata_test.go +++ b/modules/packages/debian/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "forgejo.org/modules/zstd" + "code.gitea.io/gitea/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 2dae4100e7..40f7d20508 100644 --- a/modules/packages/goproxy/metadata.go +++ b/modules/packages/goproxy/metadata.go @@ -10,7 +10,7 @@ import ( "path" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/packages/hashed_buffer.go b/modules/packages/hashed_buffer.go index 93c693efc9..4ab45edcec 100644 --- a/modules/packages/hashed_buffer.go +++ b/modules/packages/hashed_buffer.go @@ -6,7 +6,7 @@ package packages import ( "io" - "forgejo.org/modules/util/filebuffer" + "code.gitea.io/gitea/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, SHA512 and BLAKE2B checksums of the data -func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) { +// Sums gets the MD5, SHA1, SHA256 and SHA512 checksums of the data +func (b *HashedBuffer) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { return b.hash.Sums() } diff --git a/modules/packages/hashed_buffer_test.go b/modules/packages/hashed_buffer_test.go index 879038988f..ed5267cd6f 100644 --- a/modules/packages/hashed_buffer_test.go +++ b/modules/packages/hashed_buffer_test.go @@ -21,10 +21,9 @@ func TestHashedBuffer(t *testing.T) { HashSHA1 string HashSHA256 string HashSHA512 string - hashBlake2b string }{ - {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff", "a71079d42853dea26e453004338670a53814b78137ffbed07603a41d76a483aa9bc33b582f77d30a65e6f29a896c0411f38312e1d66e0bf16386c86a89bea572"}, - {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc", "372a53b95f46e775b973031e40b844f24389657019f7b7540a9f0496f4ead4a2e4b050909664611fb0f4b7c7e92c3c04c84787be7f6b8edf7bf6bc31856b6c76"}, + {5, "test", "098f6bcd4621d373cade4e832627b4f6", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff"}, + {5, "testtest", "05a671c66aefea124cc08b76ea6d30bb", "51abb9636078defbf888d8457a7c76f85c8f114c", "37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578", "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc"}, } for _, c := range cases { @@ -37,12 +36,11 @@ func TestHashedBuffer(t *testing.T) { require.NoError(t, err) assert.Equal(t, c.Data, string(data)) - hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := buf.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512 := 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 19a30c5ffa..421fc5e725 100644 --- a/modules/packages/helm/metadata.go +++ b/modules/packages/helm/metadata.go @@ -9,8 +9,8 @@ import ( "io" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/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 bc0dc0155e..42aa250718 100644 --- a/modules/packages/maven/metadata.go +++ b/modules/packages/maven/metadata.go @@ -7,8 +7,7 @@ import ( "encoding/xml" "io" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/validation" "golang.org/x/net/html/charset" ) @@ -50,16 +49,8 @@ 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 @@ -74,17 +65,6 @@ 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 != "" { @@ -102,7 +82,7 @@ func ParsePackageMetaData(r io.Reader) (*Metadata, error) { } return &Metadata{ - GroupID: groupID, + GroupID: pom.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 3b087989e6..d0093013f9 100644 --- a/modules/packages/maven/metadata_test.go +++ b/modules/packages/maven/metadata_test.go @@ -14,7 +14,6 @@ import ( const ( groupID = "org.gitea" - parentGroupID = "org.gitea.parent" artifactID = "my-project" version = "1.0.1" name = "My Gitea Project" @@ -28,11 +27,6 @@ const ( const pomContent = ` - - ` + parentGroupID + ` - parent-project - 1.0.0 - ` + groupID + ` ` + artifactID + ` ` + version + ` @@ -53,24 +47,6 @@ 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("")) @@ -111,19 +87,4 @@ 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 d2d9a759a8..83a4b5b7af 100644 --- a/modules/packages/multi_hasher.go +++ b/modules/packages/multi_hasher.go @@ -12,32 +12,28 @@ import ( "errors" "hash" "io" - - "golang.org/x/crypto/blake2b" ) const ( - marshaledSizeMD5 = 92 - marshaledSizeSHA1 = 96 - marshaledSizeSHA256 = 108 - marshaledSizeSHA512 = 204 - marshaledSizeBlake2b = 213 + marshaledSizeMD5 = 92 + marshaledSizeSHA1 = 96 + marshaledSizeSHA256 = 108 + marshaledSizeSHA512 = 204 - marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512 + marshaledSizeBlake2b + marshaledSize = marshaledSizeMD5 + marshaledSizeSHA1 + marshaledSizeSHA256 + marshaledSizeSHA512 ) // HashSummer provide a Sums method type HashSummer interface { - Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b []byte) + Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) } // MultiHasher calculates multiple checksums type MultiHasher struct { - md5 hash.Hash - sha1 hash.Hash - sha256 hash.Hash - sha512 hash.Hash - blake2b hash.Hash + md5 hash.Hash + sha1 hash.Hash + sha256 hash.Hash + sha512 hash.Hash combinedWriter io.Writer } @@ -48,16 +44,14 @@ func NewMultiHasher() *MultiHasher { sha1 := sha1.New() sha256 := sha256.New() sha512 := sha512.New() - blake2b, _ := blake2b.New512(nil) - combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512, blake2b) + combinedWriter := io.MultiWriter(md5, sha1, sha256, sha512) return &MultiHasher{ md5, sha1, sha256, sha512, - blake2b, combinedWriter, } } @@ -80,17 +74,12 @@ 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 } @@ -115,12 +104,7 @@ func (h *MultiHasher) UnmarshalBinary(b []byte) error { } b = b[marshaledSizeSHA256:] - if err := h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512]); err != nil { - return err - } - - b = b[marshaledSizeSHA512:] - return h.blake2b.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeBlake2b]) + return h.sha512.(encoding.BinaryUnmarshaler).UnmarshalBinary(b[:marshaledSizeSHA512]) } // Write implements io.Writer @@ -129,11 +113,10 @@ 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, hashBlake2b []byte) { +func (h *MultiHasher) Sums() (hashMD5, hashSHA1, hashSHA256, hashSHA512 []byte) { hashMD5 = h.md5.Sum(nil) hashSHA1 = h.sha1.Sum(nil) hashSHA256 = h.sha256.Sum(nil) hashSHA512 = h.sha512.Sum(nil) - hashBlake2b = h.blake2b.Sum(nil) - return hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b + return hashMD5, hashSHA1, hashSHA256, hashSHA512 } diff --git a/modules/packages/multi_hasher_test.go b/modules/packages/multi_hasher_test.go index e5a32fc02c..ca333cb0a4 100644 --- a/modules/packages/multi_hasher_test.go +++ b/modules/packages/multi_hasher_test.go @@ -12,11 +12,10 @@ import ( ) const ( - expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c" - expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc" - expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d" - expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c" - expectedBlake2b = "b3c3ad15c7e6cca543d651add9427727ffb525120eb23264ee35f16f408a369b599d4404a52d29f642fc0d869f9b55581b60e4e8b9b74997182705d3dcb01edb" + expectedMD5 = "e3bef03c5f3b7f6b3ab3e3053ed71e9c" + expectedSHA1 = "060b3b99f88e96085b4a68e095bc9e3d1d91e1bc" + expectedSHA256 = "6ccce4863b70f258d691f59609d31b4502e1ba5199942d3bc5d35d17a4ce771d" + expectedSHA512 = "7f70e439ba8c52025c1f06cdf6ae443c4b8ed2e90059cdb9bbbf8adf80846f185a24acca9245b128b226d61753b0d7ed46580a69c8999eeff3bc13a4d0bd816c" ) func TestMultiHasherSums(t *testing.T) { @@ -24,13 +23,12 @@ func TestMultiHasherSums(t *testing.T) { h := NewMultiHasher() h.Write([]byte("gitea")) - hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512 := 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) { @@ -46,12 +44,11 @@ func TestMultiHasherSums(t *testing.T) { h2.Write([]byte("ea")) - hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := h2.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512 := 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 ed163d30ac..7d3d7cd6b5 100644 --- a/modules/packages/npm/creator.go +++ b/modules/packages/npm/creator.go @@ -14,9 +14,9 @@ import ( "strings" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/npm/creator_test.go b/modules/packages/npm/creator_test.go index 5cbaf0d865..b2cf1aae0e 100644 --- a/modules/packages/npm/creator_test.go +++ b/modules/packages/npm/creator_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 126a0ad494..1e98ddffde 100644 --- a/modules/packages/nuget/metadata.go +++ b/modules/packages/nuget/metadata.go @@ -13,8 +13,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version" ) @@ -57,21 +57,12 @@ 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"` } @@ -86,22 +77,13 @@ 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"` @@ -185,20 +167,11 @@ 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 8a34f1a5ae..ecce052be4 100644 --- a/modules/packages/nuget/metadata_test.go +++ b/modules/packages/nuget/metadata_test.go @@ -13,22 +13,14 @@ import ( ) const ( - id = "System.Forgejo" - title = "Package Title" - language = "Package Language" + id = "System.Gitea" semver = "1.0.1" - 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" + authors = "Gitea Authors" + projectURL = "https://gitea.io" description = "Package Description" releaseNotes = "Package Release Notes" readme = "Readme" - tags = "tag_1 tag_2 tag_3" - minClientVersion = "1.0.0.0" - repositoryURL = "https://codeberg.org/forgejo" + repositoryURL = "https://gitea.io/gitea/gitea" targetFramework = ".NETStandard2.1" dependencyID = "System.Text.Json" dependencyVersion = "5.0.0" @@ -36,24 +28,16 @@ const ( const nuspecContent = ` - + ` + id + ` - ` + title + ` - ` + language + ` ` + semver + ` ` + authors + ` - ` + owners + ` - ` + copyright + ` - true true ` + projectURL + ` - ` + licenseURL + ` - ` + iconURL + ` ` + description + ` ` + releaseNotes + ` README.md - ` + tags + ` @@ -158,22 +142,12 @@ 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 992ade7e8f..81bf0371a0 100644 --- a/modules/packages/nuget/symbol_extractor.go +++ b/modules/packages/nuget/symbol_extractor.go @@ -13,8 +13,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/packages" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/util" ) var ( diff --git a/modules/packages/pub/metadata.go b/modules/packages/pub/metadata.go index f8afdf7218..afb464e462 100644 --- a/modules/packages/pub/metadata.go +++ b/modules/packages/pub/metadata.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/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 30c91115e7..f4f78c2cab 100644 --- a/modules/packages/rpm/metadata.go +++ b/modules/packages/rpm/metadata.go @@ -8,8 +8,8 @@ import ( "io" "strings" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/validation" "github.com/sassoftware/go-rpmutils" ) @@ -78,12 +78,11 @@ type FileMetadata struct { } type Entry struct { - 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"` + 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"` } type File struct { @@ -99,7 +98,7 @@ type Changelog struct { } // ParsePackage parses the RPM package file -func ParsePackage(r io.Reader, repoType string) (*Package, error) { +func ParsePackage(r io.Reader) (*Package, error) { rpm, err := rpmutils.ReadRpm(r) if err != nil { return nil, err @@ -139,10 +138,10 @@ func ParsePackage(r io.Reader, repoType string) (*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, 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), + 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), Files: getFiles(rpm.Header), Changelogs: getChangelogs(rpm.Header), }, @@ -171,7 +170,7 @@ func getUInt64(h *rpmutils.RpmHeader, tag int) uint64 { return values[0] } -func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repoType string) []*Entry { +func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int) []*Entry { names, err := h.GetStrings(namesTag) if err != nil || len(names) == 0 { return nil @@ -189,54 +188,43 @@ func getEntries(h *rpmutils.RpmHeader, namesTag, versionsTag, flagsTag int, repo } entries := make([]*Entry, 0, len(names)) - - switch repoType { - case "rpm": - 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" - } - - if len(parts) > 1 { - e.Release = parts[1] - } - } - entries = append(entries, e) + for i := range names { + e := &Entry{ + Name: names[i], } - case "alt": - for i := range names { - e := &Entry{ - AltFlags: uint32(flags[i]), - } - e.Version = versions[i] - entries = append(entries, e) + + 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" + } + + if len(parts) > 1 { + e.Release = parts[1] + } + } + + entries = append(entries, e) } return entries } diff --git a/modules/packages/rpm/metadata_test.go b/modules/packages/rpm/metadata_test.go index 05f53ea446..dc9b480723 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, "rpm") + p, err := ParsePackage(zr) assert.NotNil(t, p) require.NoError(t, err) diff --git a/modules/packages/rubygems/marshal.go b/modules/packages/rubygems/marshal.go index 191efc7c0e..4e6a5fc5f8 100644 --- a/modules/packages/rubygems/marshal.go +++ b/modules/packages/rubygems/marshal.go @@ -9,7 +9,7 @@ import ( "io" "reflect" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/modules/packages/rubygems/metadata.go b/modules/packages/rubygems/metadata.go index 6d021a17ab..8a9794860e 100644 --- a/modules/packages/rubygems/metadata.go +++ b/modules/packages/rubygems/metadata.go @@ -10,8 +10,8 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "gopkg.in/yaml.v3" ) diff --git a/modules/packages/swift/metadata.go b/modules/packages/swift/metadata.go index 34fc4f1784..24c4262ab7 100644 --- a/modules/packages/swift/metadata.go +++ b/modules/packages/swift/metadata.go @@ -11,9 +11,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" "github.com/hashicorp/go-version" ) diff --git a/modules/packages/vagrant/metadata.go b/modules/packages/vagrant/metadata.go index 24684249b7..6789533339 100644 --- a/modules/packages/vagrant/metadata.go +++ b/modules/packages/vagrant/metadata.go @@ -9,8 +9,8 @@ import ( "io" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/validation" ) const ( diff --git a/modules/packages/vagrant/metadata_test.go b/modules/packages/vagrant/metadata_test.go index f1950685be..f467781a08 100644 --- a/modules/packages/vagrant/metadata_test.go +++ b/modules/packages/vagrant/metadata_test.go @@ -10,7 +10,7 @@ import ( "io" "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 d46790458e..c611c14270 100644 --- a/modules/pprof/pprof.go +++ b/modules/pprof/pprof.go @@ -9,7 +9,7 @@ import ( "runtime" "runtime/pprof" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // DumpMemProfileForUsername dumps a memory profile at pprofDataPath as memprofile__ diff --git a/modules/private/actions.go b/modules/private/actions.go index 8e4b44c226..311a283650 100644 --- a/modules/private/actions.go +++ b/modules/private/actions.go @@ -6,7 +6,7 @@ package private import ( "context" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) type GenerateTokenRequest struct { diff --git a/modules/private/forgejo_actions.go b/modules/private/forgejo_actions.go new file mode 100644 index 0000000000..133d5e253f --- /dev/null +++ b/modules/private/forgejo_actions.go @@ -0,0 +1,32 @@ +// 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 2d64c1dec9..93cbcd469d 100644 --- a/modules/private/hook.go +++ b/modules/private/hook.go @@ -9,10 +9,10 @@ import ( "net/url" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/git/pushoptions" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" + "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" ) // Git environment variables diff --git a/modules/private/internal.go b/modules/private/internal.go index 65fddbbe6b..9c330a24a8 100644 --- a/modules/private/internal.go +++ b/modules/private/internal.go @@ -13,11 +13,11 @@ import ( "strings" "time" - "forgejo.org/modules/httplib" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/proxyprotocol" - "forgejo.org/modules/setting" + "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" ) // 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 422ff16d9a..dcd1714856 100644 --- a/modules/private/key.go +++ b/modules/private/key.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 f6054f9c74..08de5b7e28 100644 --- a/modules/private/mail.go +++ b/modules/private/mail.go @@ -6,7 +6,7 @@ package private import ( "context" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // Email structure holds a data for sending general emails diff --git a/modules/private/manager.go b/modules/private/manager.go index fa2e0b0d40..6055e553bd 100644 --- a/modules/private/manager.go +++ b/modules/private/manager.go @@ -12,7 +12,7 @@ import ( "strconv" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // Shutdown calls the internal shutdown function diff --git a/modules/private/request.go b/modules/private/request.go index b80167adb6..58cd261239 100644 --- a/modules/private/request.go +++ b/modules/private/request.go @@ -8,8 +8,8 @@ import ( "io" "net/http" - "forgejo.org/modules/httplib" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/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 2192d3048d..496209d3cb 100644 --- a/modules/private/restore_repo.go +++ b/modules/private/restore_repo.go @@ -8,7 +8,7 @@ import ( "fmt" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // RestoreParams structure holds a data for restore repository diff --git a/modules/private/serv.go b/modules/private/serv.go index af4a016cb8..6c7c753cf0 100644 --- a/modules/private/serv.go +++ b/modules/private/serv.go @@ -8,10 +8,10 @@ import ( "fmt" "net/url" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + 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" ) // KeyAndOwner is the response from ServNoCommand diff --git a/modules/process/manager.go b/modules/process/manager.go index 062ee1482f..37098ad92f 100644 --- a/modules/process/manager.go +++ b/modules/process/manager.go @@ -7,7 +7,6 @@ package process import ( "context" "runtime/pprof" - "runtime/trace" "strconv" "sync" "sync/atomic" @@ -127,27 +126,6 @@ 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. // @@ -157,7 +135,16 @@ func (pm *Manager) AddTypedContextTimeout(parent context.Context, timeout time.D // 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) { - return pm.AddTypedContextTimeout(parent, timeout, description, NormalProcessType, true) + 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 } // Add create a new process @@ -172,8 +159,6 @@ 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, @@ -181,7 +166,6 @@ func (pm *Manager) Add(ctx context.Context, description string, cancel context.C Start: start, Cancel: cancel, Type: processType, - TraceTrask: traceTask, } var finished FinishedFunc @@ -234,7 +218,6 @@ 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 a603e6a9f2..e260893113 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,12 +175,13 @@ 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 - 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()) + reader, writer := io.Pipe() + defer reader.Close() + go func() { + err := pprof.Lookup("goroutine").WriteTo(writer, 0) + _ = writer.CloseWithError(err) + }() + stacks, err = profile.Parse(reader) if err != nil { return nil, 0, 0, err } diff --git a/modules/process/manager_stacktraces_test.go b/modules/process/manager_stacktraces_test.go deleted file mode 100644 index 509b424d8b..0000000000 --- a/modules/process/manager_stacktraces_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// 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 0d637c8acc..36b2a912ea 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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) 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(t.Context(), "foo") + ctx, _, finished := pm.AddContext(context.Background(), "foo") defer finished() pm.Cancel(GetPID(ctx)) @@ -54,7 +54,7 @@ func TestManager_Cancel(t *testing.T) { } finished() - ctx, cancel, finished := pm.AddContext(t.Context(), "foo") + ctx, cancel, finished := pm.AddContext(context.Background(), "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(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) defer cancel() p1Ctx, _, finished := pm.AddContext(ctx, "foo") diff --git a/modules/process/manager_unix.go b/modules/process/manager_unix.go index 54dd6dc485..c5be906b35 100644 --- a/modules/process/manager_unix.go +++ b/modules/process/manager_unix.go @@ -1,6 +1,8 @@ // 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 new file mode 100644 index 0000000000..44a84f2203 --- /dev/null +++ b/modules/process/manager_windows.go @@ -0,0 +1,15 @@ +// 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 8947eb252f..06a28c4a60 100644 --- a/modules/process/process.go +++ b/modules/process/process.go @@ -5,14 +5,12 @@ package process import ( "context" - "runtime/trace" "time" ) var ( SystemProcessType = "system" RequestProcessType = "request" - GitProcessType = "git" NormalProcessType = "normal" NoneProcessType = "none" ) @@ -25,7 +23,6 @@ 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 8c460dba30..1a6bdad7fb 100644 --- a/modules/proxy/proxy.go +++ b/modules/proxy/proxy.go @@ -10,8 +10,8 @@ import ( "strings" "sync" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "github.com/gobwas/glob" ) diff --git a/modules/proxyprotocol/conn.go b/modules/proxyprotocol/conn.go index beac5de120..f437f13683 100644 --- a/modules/proxyprotocol/conn.go +++ b/modules/proxyprotocol/conn.go @@ -14,7 +14,7 @@ import ( "sync" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var ( diff --git a/modules/public/public.go b/modules/public/public.go index 174936fd4a..abc6b46158 100644 --- a/modules/public/public.go +++ b/modules/public/public.go @@ -12,12 +12,12 @@ import ( "strings" "time" - "forgejo.org/modules/assetfs" - "forgejo.org/modules/container" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" ) func CustomAssets() *assetfs.Layer { diff --git a/modules/public/public_test.go b/modules/public/public_test.go index 4bfbb7ef31..5e4bf5d671 100644 --- a/modules/public/public_test.go +++ b/modules/public/public_test.go @@ -6,7 +6,7 @@ package public import ( "testing" - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" "github.com/stretchr/testify/assert" ) diff --git a/modules/public/serve_dynamic.go b/modules/public/serve_dynamic.go index e5bd89b1cd..a668b17c34 100644 --- a/modules/public/serve_dynamic.go +++ b/modules/public/serve_dynamic.go @@ -6,8 +6,8 @@ package public import ( - "forgejo.org/modules/assetfs" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/public/serve_static.go b/modules/public/serve_static.go index e19bd976eb..e79085021e 100644 --- a/modules/public/serve_static.go +++ b/modules/public/serve_static.go @@ -8,8 +8,8 @@ package public import ( "time" - "forgejo.org/modules/assetfs" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/timeutil" ) var _ GzipBytesProvider = (*vfsgenÛ°CompressedFileInfo)(nil) diff --git a/modules/queue/base_channel.go b/modules/queue/base_channel.go index 1be4edf144..dd8ccb15f4 100644 --- a/modules/queue/base_channel.go +++ b/modules/queue/base_channel.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" ) var errChannelClosed = errors.New("channel is closed") diff --git a/modules/queue/base_levelqueue.go b/modules/queue/base_levelqueue.go index 12c805c0be..efc57c9c9c 100644 --- a/modules/queue/base_levelqueue.go +++ b/modules/queue/base_levelqueue.go @@ -7,10 +7,10 @@ import ( "context" "sync/atomic" - "forgejo.org/modules/nosql" - "forgejo.org/modules/queue/lqinternal" + "code.gitea.io/gitea/modules/nosql" + "code.gitea.io/gitea/modules/queue/lqinternal" - "code.forgejo.org/forgejo/levelqueue" + "gitea.com/lunny/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_levelqueue_common.go b/modules/queue/base_levelqueue_common.go index 8b4f35c47d..78d3b85a8a 100644 --- a/modules/queue/base_levelqueue_common.go +++ b/modules/queue/base_levelqueue_common.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "forgejo.org/modules/nosql" + "code.gitea.io/gitea/modules/nosql" - "code.forgejo.org/forgejo/levelqueue" + "gitea.com/lunny/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_levelqueue_test.go b/modules/queue/base_levelqueue_test.go index 0f02b9f3ee..b65b570c4b 100644 --- a/modules/queue/base_levelqueue_test.go +++ b/modules/queue/base_levelqueue_test.go @@ -6,10 +6,10 @@ package queue import ( "testing" - "forgejo.org/modules/queue/lqinternal" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/queue/lqinternal" + "code.gitea.io/gitea/modules/setting" - "code.forgejo.org/forgejo/levelqueue" + "gitea.com/lunny/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 91d2e68500..968a4e98d4 100644 --- a/modules/queue/base_levelqueue_unique.go +++ b/modules/queue/base_levelqueue_unique.go @@ -8,10 +8,10 @@ import ( "sync" "sync/atomic" - "forgejo.org/modules/nosql" - "forgejo.org/modules/queue/lqinternal" + "code.gitea.io/gitea/modules/nosql" + "code.gitea.io/gitea/modules/queue/lqinternal" - "code.forgejo.org/forgejo/levelqueue" + "gitea.com/lunny/levelqueue" "github.com/syndtr/goleveldb/leveldb" ) diff --git a/modules/queue/base_redis.go b/modules/queue/base_redis.go index ec3c6dc16d..62df30f68f 100644 --- a/modules/queue/base_redis.go +++ b/modules/queue/base_redis.go @@ -8,9 +8,9 @@ import ( "sync" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/nosql" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 bf3ad5b97b..fa1700dc2e 100644 --- a/modules/queue/base_redis_test.go +++ b/modules/queue/base_redis_test.go @@ -7,8 +7,8 @@ import ( "context" "testing" - "forgejo.org/modules/queue/mock" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/queue/mock" + "code.gitea.io/gitea/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 e1f552bfb2..b73404f4e5 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" - "forgejo.org/modules/nosql" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/nosql" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/suite" ) diff --git a/modules/queue/base_test.go b/modules/queue/base_test.go index d852a80b16..a5600fea63 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 := t.Context() + ctx := context.Background() _ = 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 := t.Context() + ctx := context.Background() 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 f736a5aa12..c5bc16b6f0 100644 --- a/modules/queue/config.go +++ b/modules/queue/config.go @@ -4,7 +4,7 @@ package queue import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) type BaseConfig struct { diff --git a/modules/queue/manager.go b/modules/queue/manager.go index 8f1a93f273..8b964c0c28 100644 --- a/modules/queue/manager.go +++ b/modules/queue/manager.go @@ -8,8 +8,8 @@ import ( "sync" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 bd6e314493..a76c238752 100644 --- a/modules/queue/manager_test.go +++ b/modules/queue/manager_test.go @@ -4,10 +4,11 @@ package queue import ( + "context" "path/filepath" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -80,7 +81,7 @@ MAX_WORKERS = 123 require.NoError(t, err) - q1 := createWorkerPoolQueue[string](t.Context(), "no-such", cfgProvider, nil, false) + q1 := createWorkerPoolQueue[string](context.Background(), "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) @@ -96,7 +97,7 @@ MAX_WORKERS = 123 assert.Equal(t, "string", q1.GetItemTypeName()) qid1 := GetManager().qidCounter - q2 := createWorkerPoolQueue(t.Context(), "sub", cfgProvider, func(s ...int) (unhandled []int) { return nil }, false) + q2 := createWorkerPoolQueue(context.Background(), "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) @@ -118,7 +119,7 @@ MAX_WORKERS = 123 assert.Equal(t, 120, q1.workerMaxNum) stop := runWorkerPoolQueue(q2) - require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(t.Context(), 0)) - require.NoError(t, GetManager().FlushAll(t.Context(), 0)) + require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(context.Background(), 0)) + require.NoError(t, GetManager().FlushAll(context.Background(), 0)) stop() } diff --git a/modules/queue/mock/redisuniversalclient.go b/modules/queue/mock/redisuniversalclient.go index 65bac755d1..36e4b7cd5d 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: forgejo.org/modules/nosql (interfaces: RedisClient) +// Source: code.gitea.io/gitea/modules/nosql (interfaces: RedisClient) // // Generated by this command: // -// mockgen -package mock -destination ./modules/queue/mock/redisuniversalclient.go forgejo.org/modules/nosql RedisClient +// mockgen -package mock -destination ./modules/queue/mock/redisuniversalclient.go code.gitea.io/gitea/modules/nosql RedisClient // // Package mock is a generated GoMock package. diff --git a/modules/queue/queue.go b/modules/queue/queue.go index f16b3c1f34..56835014a5 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 "forgejo.org/modules/util" +import "code.gitea.io/gitea/modules/util" type HandlerFuncT[T any] func(...T) (unhandled []T) diff --git a/modules/queue/workergroup.go b/modules/queue/workergroup.go index 3fb821ce69..ea4c0020c5 100644 --- a/modules/queue/workergroup.go +++ b/modules/queue/workergroup.go @@ -10,7 +10,7 @@ import ( "sync/atomic" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var ( diff --git a/modules/queue/workerqueue.go b/modules/queue/workerqueue.go index 6a71fc4fb4..041ce9a3f2 100644 --- a/modules/queue/workerqueue.go +++ b/modules/queue/workerqueue.go @@ -10,10 +10,10 @@ import ( "sync/atomic" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/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 5ae1a701b2..4cfe8ede97 100644 --- a/modules/queue/workerqueue_test.go +++ b/modules/queue/workerqueue_test.go @@ -5,14 +5,15 @@ package queue import ( "bytes" + "context" "runtime" "strconv" "sync" "testing" "time" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -58,7 +59,7 @@ func TestWorkerPoolQueueUnhandled(t *testing.T) { testRecorder.Record("push:%v", i) require.NoError(t, q.Push(i)) } - require.NoError(t, q.FlushWithContext(t.Context(), 0)) + require.NoError(t, q.FlushWithContext(context.Background(), 0)) stop() ok := true @@ -166,7 +167,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(t.Context(), 0)) + require.NoError(t, q.FlushWithContext(context.Background(), 0)) stop() } diff --git a/modules/recaptcha/recaptcha.go b/modules/recaptcha/recaptcha.go index 95b0a77a43..1777d169c1 100644 --- a/modules/recaptcha/recaptcha.go +++ b/modules/recaptcha/recaptcha.go @@ -11,9 +11,9 @@ import ( "net/url" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // Response is the structure of JSON returned from API diff --git a/modules/references/references.go b/modules/references/references.go index f008826e04..c61d06d5dc 100644 --- a/modules/references/references.go +++ b/modules/references/references.go @@ -11,10 +11,10 @@ import ( "strings" "sync" - "forgejo.org/modules/log" - "forgejo.org/modules/markup/mdstripper" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "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" ) 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,8 +460,7 @@ func findAllIssueReferencesBytes(content []byte, links []string) []*rawReference } parts := strings.Split(u.EscapedPath(), "/") // /user/repo/issues/3 - // /user/repo/pulls/7/files/... - if len(parts) < 5 || parts[0] != "" { + 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 5dc6cd94fe..ffa7f993e3 100644 --- a/modules/references/references_test.go +++ b/modules/references/references_test.go @@ -7,7 +7,7 @@ import ( "regexp" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) @@ -132,30 +132,6 @@ 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{ @@ -490,7 +466,6 @@ 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 b452094c16..8f66dcf3f7 100644 --- a/modules/regexplru/regexplru.go +++ b/modules/regexplru/regexplru.go @@ -6,7 +6,7 @@ package regexplru import ( "regexp" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" lru "github.com/hashicorp/golang-lru/v2" ) diff --git a/modules/repository/branch.go b/modules/repository/branch.go index 59b5f9e7d5..2bf9930f19 100644 --- a/modules/repository/branch.go +++ b/modules/repository/branch.go @@ -7,14 +7,14 @@ import ( "context" "fmt" - "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" + "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" ) // SyncRepoBranches synchronizes branch table with repository branches diff --git a/modules/repository/branch_test.go b/modules/repository/branch_test.go index deb6cd5d19..b98618a16b 100644 --- a/modules/repository/branch_test.go +++ b/modules/repository/branch_test.go @@ -6,10 +6,10 @@ package repository import ( "testing" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/repository/collaborator.go b/modules/repository/collaborator.go index 5a0c4451b7..17915d34b7 100644 --- a/modules/repository/collaborator.go +++ b/modules/repository/collaborator.go @@ -6,11 +6,11 @@ package repository import ( "context" - "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" + "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" "xorm.io/builder" ) diff --git a/modules/repository/collaborator_test.go b/modules/repository/collaborator_test.go index dae173506b..3844197bf1 100644 --- a/modules/repository/collaborator_test.go +++ b/modules/repository/collaborator_test.go @@ -6,14 +6,14 @@ package repository import ( "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -272,7 +272,8 @@ func TestRepoPermissionPrivateOrgRepo(t *testing.T) { // update team information and then check permission team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}) - unittest.AssertSuccessfulDelete(t, &organization.TeamUnit{TeamID: team.ID}) + err = organization.UpdateTeamUnits(db.DefaultContext, team, nil) + require.NoError(t, err) 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 8f63f03db5..ede60429a1 100644 --- a/modules/repository/commits.go +++ b/modules/repository/commits.go @@ -9,13 +9,13 @@ import ( "net/url" "time" - "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" + "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" ) // PushCommit represents a commit in a push operation. diff --git a/modules/repository/commits_test.go b/modules/repository/commits_test.go index f49b0d37c5..82841b3268 100644 --- a/modules/repository/commits_test.go +++ b/modules/repository/commits_test.go @@ -4,15 +4,17 @@ package repository import ( + "crypto/md5" + "fmt" "strconv" "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -124,12 +126,15 @@ func TestPushCommits_AvatarLink(t *testing.T) { }, } + setting.GravatarSource = "https://secure.gravatar.com/avatar" + setting.OfflineMode = true + assert.Equal(t, - "/avatars/ab53a2911ddf9b4817ac01ddcd3d975f?size="+strconv.Itoa(28*setting.Avatar.RenderedSizeFactor), + "/avatars/avatar2?size="+strconv.Itoa(28*setting.Avatar.RenderedSizeFactor), pushCommits.AvatarLink(db.DefaultContext, "user2@example.com")) assert.Equal(t, - "/assets/img/avatar_default.png", + fmt.Sprintf("https://secure.gravatar.com/avatar/%x?d=identicon&s=%d", md5.Sum([]byte("nonexistent@example.com")), 28*setting.Avatar.RenderedSizeFactor), pushCommits.AvatarLink(db.DefaultContext, "nonexistent@example.com")) } diff --git a/modules/repository/create.go b/modules/repository/create.go index d76a5571c7..ca2150b972 100644 --- a/modules/repository/create.go +++ b/modules/repository/create.go @@ -11,22 +11,22 @@ import ( "path/filepath" "strings" - "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" + "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" ) // CreateRepositoryByExample creates a repository for the user/organization. @@ -89,9 +89,8 @@ 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), - DefaultUpdateStyle: repo_model.UpdateStyle(setting.Repository.PullRequest.DefaultUpdateStyle), - AllowRebaseUpdate: true, + DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), + AllowRebaseUpdate: true, }, }) } else { diff --git a/modules/repository/create_test.go b/modules/repository/create_test.go index cb34143cef..c743271c26 100644 --- a/modules/repository/create_test.go +++ b/modules/repository/create_test.go @@ -6,10 +6,10 @@ package repository import ( "testing" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + 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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/repository/delete.go b/modules/repository/delete.go index 6fff16b406..04af98beef 100644 --- a/modules/repository/delete.go +++ b/modules/repository/delete.go @@ -6,9 +6,9 @@ package repository import ( "context" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" ) // CanUserDelete returns true if user could delete the repository diff --git a/modules/repository/env.go b/modules/repository/env.go index 110f6ca674..e4f32092fc 100644 --- a/modules/repository/env.go +++ b/modules/repository/env.go @@ -8,9 +8,9 @@ import ( "os" "strings" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" ) // env keys for git hooks need diff --git a/modules/repository/fork.go b/modules/repository/fork.go index 42801fa80d..fbf0008716 100644 --- a/modules/repository/fork.go +++ b/modules/repository/fork.go @@ -6,9 +6,9 @@ package repository import ( "context" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" ) // CanUserForkRepo returns true if specified user can fork repository. diff --git a/modules/repository/hooks.go b/modules/repository/hooks.go index 0f5e3afc34..95849789ab 100644 --- a/modules/repository/hooks.go +++ b/modules/repository/hooks.go @@ -7,9 +7,10 @@ import ( "fmt" "os" "path/filepath" + "runtime" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) func getHookTemplates() (hookNames, hookTpls, giteaHookTpls []string) { @@ -145,6 +146,10 @@ 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 7b1442be93..5f500c5233 100644 --- a/modules/repository/init.go +++ b/modules/repository/init.go @@ -10,14 +10,14 @@ import ( "sort" "strings" - 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" + 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" ) type OptionFile struct { diff --git a/modules/repository/license.go b/modules/repository/license.go index af75d463d2..07ae92ca70 100644 --- a/modules/repository/license.go +++ b/modules/repository/license.go @@ -1,5 +1,4 @@ // Copyright 2023 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package repository @@ -11,7 +10,7 @@ import ( "regexp" "strings" - "forgejo.org/modules/options" + "code.gitea.io/gitea/modules/options" ) type LicenseValues struct { @@ -108,9 +107,6 @@ 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 3195f15dda..a7d77743ac 100644 --- a/modules/repository/license_test.go +++ b/modules/repository/license_test.go @@ -1,5 +1,4 @@ // Copyright 2023 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package repository @@ -171,31 +170,6 @@ 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 5906b10865..f81dfcdafb 100644 --- a/modules/repository/main_test.go +++ b/modules/repository/main_test.go @@ -6,10 +6,9 @@ package repository import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/modules/repository/push.go b/modules/repository/push.go index d8be0a3e8c..66d0417caf 100644 --- a/modules/repository/push.go +++ b/modules/repository/push.go @@ -4,7 +4,7 @@ package repository import ( - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" ) // PushUpdateOptions defines the push update options diff --git a/modules/repository/repo.go b/modules/repository/repo.go index c86d48fe52..e08bc376b8 100644 --- a/modules/repository/repo.go +++ b/modules/repository/repo.go @@ -12,17 +12,17 @@ import ( "strings" "time" - "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" + "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" ) /* @@ -90,11 +90,11 @@ func SyncReleasesWithTags(ctx context.Context, repo *repo_model.Repository, gitR if rel.IsDraft { continue } - commit, err := gitRepo.GetTagCommit(rel.TagName) + commitID, err := gitRepo.GetTagCommitID(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) || commit.ID.String() != rel.Sha1 { + if git.IsErrNotExist(err) || commitID != 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,12 +182,11 @@ 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 } @@ -342,10 +341,9 @@ 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", "created_unix"). + Cols("sha1"). Update(&repo_model.Release{ - Sha1: tag.Object.String(), - CreatedUnix: timeutil.TimeStamp(tag.Tagger.When.Unix()), + Sha1: tag.Object.String(), }); 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 278bdc2420..f3e7be6d7d 100644 --- a/modules/repository/repo_test.go +++ b/modules/repository/repo_test.go @@ -6,7 +6,7 @@ package repository import ( "testing" - "forgejo.org/modules/git" + "code.gitea.io/gitea/modules/git" "github.com/stretchr/testify/assert" ) diff --git a/modules/repository/temp.go b/modules/repository/temp.go index 6048c43a8e..04faa9db3d 100644 --- a/modules/repository/temp.go +++ b/modules/repository/temp.go @@ -9,9 +9,9 @@ import ( "path" "path/filepath" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // LocalCopyPath returns the local repository temporary copy path. diff --git a/modules/secret/secret.go b/modules/secret/secret.go index fc63ec521b..e70ae1839c 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) //nolint:staticcheck + cfb := cipher.NewCFBEncrypter(block, iv) 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) //nolint:staticcheck + cfb := cipher.NewCFBDecrypter(block, iv) cfb.XORKeyStream(text, text) data, err := base64.StdEncoding.DecodeString(string(text)) if err != nil { - 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 nil, fmt.Errorf("AesDecrypt invalid decrypted base64 string: %w", err) } return data, nil } diff --git a/modules/session/db.go b/modules/session/db.go index eea7e2136e..3b12b93521 100644 --- a/modules/session/db.go +++ b/modules/session/db.go @@ -7,9 +7,9 @@ import ( "log" "sync" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/timeutil" "code.forgejo.org/go-chi/session" ) diff --git a/modules/session/redis.go b/modules/session/redis.go index cf84ef21d9..230b501080 100644 --- a/modules/session/redis.go +++ b/modules/session/redis.go @@ -22,8 +22,8 @@ import ( "sync" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/nosql" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/nosql" "code.forgejo.org/go-chi/session" ) diff --git a/modules/session/virtual.go b/modules/session/virtual.go index 1c3e1c778b..9cf3683a71 100644 --- a/modules/session/virtual.go +++ b/modules/session/virtual.go @@ -7,8 +7,8 @@ import ( "fmt" "sync" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 52a3ad5309..8c1b57b649 100644 --- a/modules/setting/actions.go +++ b/modules/setting/actions.go @@ -46,7 +46,7 @@ func (url defaultActionsURL) URL() string { } const ( - defaultActionsURLForgejo = "https://data.forgejo.org" + defaultActionsURLForgejo = "https://code.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 4bff6e02ad..afd76d3bee 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://data.forgejo.org", + wantURL: "https://code.forgejo.org", }, { name: "github", diff --git a/modules/setting/admin.go b/modules/setting/admin.go index 7a1e071bac..eed3aa22cf 100644 --- a/modules/setting/admin.go +++ b/modules/setting/admin.go @@ -4,7 +4,7 @@ package setting import ( - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" ) // Admin settings diff --git a/modules/setting/admin_test.go b/modules/setting/admin_test.go index 5473534521..0c6c24b038 100644 --- a/modules/setting/admin_test.go +++ b/modules/setting/admin_test.go @@ -6,7 +6,7 @@ package setting import ( "testing" - "forgejo.org/modules/container" + "code.gitea.io/gitea/modules/container" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/setting/annex.go b/modules/setting/annex.go index aa41c14ff0..35e9e55c0e 100644 --- a/modules/setting/annex.go +++ b/modules/setting/annex.go @@ -4,7 +4,7 @@ package setting import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Annex represents the configuration for git-annex diff --git a/modules/setting/api.go b/modules/setting/api.go index 18180c3d07..c36f05cfd1 100644 --- a/modules/setting/api.go +++ b/modules/setting/api.go @@ -7,7 +7,7 @@ import ( "net/url" "path" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // API settings diff --git a/modules/setting/attachment.go b/modules/setting/attachment.go index 956525f0db..4255ac985e 100644 --- a/modules/setting/attachment.go +++ b/modules/setting/attachment.go @@ -12,7 +12,7 @@ var Attachment = struct { Enabled bool }{ Storage: &Storage{}, - 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", + 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", 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(".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.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.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 cdc7e1a971..bfa6ca0e61 100644 --- a/modules/setting/cache.go +++ b/modules/setting/cache.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Cache represents cache settings diff --git a/modules/setting/camo.go b/modules/setting/camo.go index 5d31446a41..608ecf8363 100644 --- a/modules/setting/camo.go +++ b/modules/setting/camo.go @@ -6,7 +6,7 @@ package setting import ( "strconv" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var Camo = struct { diff --git a/modules/setting/config.go b/modules/setting/config.go index 6299640e61..03558574c2 100644 --- a/modules/setting/config.go +++ b/modules/setting/config.go @@ -6,8 +6,8 @@ package setting import ( "sync" - "forgejo.org/modules/log" - "forgejo.org/modules/setting/config" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting/config" ) type PictureStruct struct { diff --git a/modules/setting/config/value.go b/modules/setting/config/value.go index 3409f61b76..f0ec120544 100644 --- a/modules/setting/config/value.go +++ b/modules/setting/config/value.go @@ -7,9 +7,9 @@ import ( "context" "sync" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) type CfgSecKey struct { diff --git a/modules/setting/config_env.go b/modules/setting/config_env.go index 458dbb51bb..fa0100dba2 100644 --- a/modules/setting/config_env.go +++ b/modules/setting/config_env.go @@ -10,7 +10,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) const ( @@ -168,22 +168,3 @@ 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 e93b21abda..12cf36aa59 100644 --- a/modules/setting/config_provider.go +++ b/modules/setting/config_provider.go @@ -12,8 +12,8 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" "gopkg.in/ini.v1" //nolint:depguard ) diff --git a/modules/setting/cors.go b/modules/setting/cors.go index 5260887d9d..63daaad60b 100644 --- a/modules/setting/cors.go +++ b/modules/setting/cors.go @@ -5,6 +5,8 @@ package setting import ( "time" + + "code.gitea.io/gitea/modules/log" ) // CORSConfig defines CORS settings @@ -26,4 +28,7 @@ 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 deleted file mode 100644 index 5f39f02e4b..0000000000 --- a/modules/setting/disposable_email_domain_data.go +++ /dev/null @@ -1,3811 +0,0 @@ -// 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 31d12294b8..8669b70562 100644 --- a/modules/setting/f3.go +++ b/modules/setting/f3.go @@ -3,7 +3,7 @@ package setting import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Friendly Forge Format (F3) settings diff --git a/modules/setting/federation.go b/modules/setting/federation.go index a0fdec228e..aeb30683ea 100644 --- a/modules/setting/federation.go +++ b/modules/setting/federation.go @@ -4,9 +4,9 @@ package setting import ( - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" - "github.com/42wim/httpsig" + "github.com/go-fed/httpsig" ) // Federation settings diff --git a/modules/setting/git.go b/modules/setting/git.go index f35592a924..812c4fe6c9 100644 --- a/modules/setting/git.go +++ b/modules/setting/git.go @@ -8,7 +8,7 @@ import ( "strings" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Git settings diff --git a/modules/setting/i18n.go b/modules/setting/i18n.go index a400cf844c..889e52beb6 100644 --- a/modules/setting/i18n.go +++ b/modules/setting/i18n.go @@ -9,9 +9,7 @@ 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 502be159a1..287e72941c 100644 --- a/modules/setting/incoming_email.go +++ b/modules/setting/incoming_email.go @@ -8,7 +8,7 @@ import ( "net/mail" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var IncomingEmail = struct { diff --git a/modules/setting/indexer.go b/modules/setting/indexer.go index 6a464ee0de..3c96b58740 100644 --- a/modules/setting/indexer.go +++ b/modules/setting/indexer.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/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.Warn("Invalid glob expression '%s' (skipped): %v", expr, err) + log.Info("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 3cd48c538b..750101747f 100644 --- a/modules/setting/lfs.go +++ b/modules/setting/lfs.go @@ -7,35 +7,25 @@ import ( "fmt" "time" - "forgejo.org/modules/generate" + "code.gitea.io/gitea/modules/generate" ) -// 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. +// LFS represents the configuration for Git LFS 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") @@ -62,15 +52,6 @@ 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 2b204282a8..c7f16379b2 100644 --- a/modules/setting/lfs_test.go +++ b/modules/setting/lfs_test.go @@ -100,32 +100,3 @@ 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 0747ac4dac..a141188c0c 100644 --- a/modules/setting/log.go +++ b/modules/setting/log.go @@ -11,8 +11,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) type LogGlobalConfig struct { diff --git a/modules/setting/log_test.go b/modules/setting/log_test.go index eda6dc36af..3134d3e75c 100644 --- a/modules/setting/log_test.go +++ b/modules/setting/log_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" "github.com/stretchr/testify/require" ) diff --git a/modules/setting/mailer.go b/modules/setting/mailer.go index b7f69c3492..136d932b8d 100644 --- a/modules/setting/mailer.go +++ b/modules/setting/mailer.go @@ -11,7 +11,7 @@ import ( "text/template" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" shellquote "github.com/kballard/go-shellquote" ) @@ -263,6 +263,8 @@ func loadMailerFrom(rootCfg ConfigProvider) { MailService.OverrideEnvelopeFrom = true MailService.EnvelopeFrom = parsed.Address } + + log.Info("Mail Service Enabled") } func loadRegisterMailFrom(rootCfg ConfigProvider) { @@ -273,6 +275,7 @@ func loadRegisterMailFrom(rootCfg ConfigProvider) { return } Service.RegisterEmailConfirm = true + log.Info("Register Mail Service Enabled") } func loadNotifyMailFrom(rootCfg ConfigProvider) { @@ -283,6 +286,7 @@ 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 90fc86b131..e893c1c2f1 100644 --- a/modules/setting/markup.go +++ b/modules/setting/markup.go @@ -7,7 +7,7 @@ import ( "regexp" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // ExternalMarkupRenderers represents the external markup renderers diff --git a/modules/setting/mirror.go b/modules/setting/mirror.go index 58c57c5c95..3aa530a1f4 100644 --- a/modules/setting/mirror.go +++ b/modules/setting/mirror.go @@ -6,7 +6,7 @@ package setting import ( "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Mirror settings diff --git a/modules/setting/oauth2.go b/modules/setting/oauth2.go index 72500cfc89..49288e2639 100644 --- a/modules/setting/oauth2.go +++ b/modules/setting/oauth2.go @@ -8,8 +8,8 @@ import ( "path/filepath" "sync/atomic" - "forgejo.org/modules/generate" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/generate" + "code.gitea.io/gitea/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 2fc5da6996..18252b2447 100644 --- a/modules/setting/oauth2_test.go +++ b/modules/setting/oauth2_test.go @@ -7,8 +7,8 @@ import ( "os" "testing" - "forgejo.org/modules/generate" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/generate" + "code.gitea.io/gitea/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 db60cd2205..4ba494765b 100644 --- a/modules/setting/other.go +++ b/modules/setting/other.go @@ -3,7 +3,7 @@ package setting -import "forgejo.org/modules/log" +import "code.gitea.io/gitea/modules/log" type OtherConfig struct { ShowFooterVersion bool diff --git a/modules/setting/packages.go b/modules/setting/packages.go index 87e41fb5a0..b3f50617d2 100644 --- a/modules/setting/packages.go +++ b/modules/setting/packages.go @@ -42,7 +42,6 @@ var ( LimitSizePub int64 LimitSizePyPI int64 LimitSizeRpm int64 - LimitSizeAlt int64 LimitSizeRubyGems int64 LimitSizeSwift int64 LimitSizeVagrant int64 @@ -107,7 +106,6 @@ 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 33f27db8fd..85d0e06302 100644 --- a/modules/setting/path.go +++ b/modules/setting/path.go @@ -10,7 +10,7 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var ( @@ -34,7 +34,11 @@ var ( func getAppPath() (string, error) { var appPath string var err error - appPath, err = exec.LookPath(os.Args[0]) + if IsWindows && filepath.IsAbs(os.Args[0]) { + appPath = filepath.Clean(os.Args[0]) + } else { + 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 7a9de9568b..4ff420d090 100644 --- a/modules/setting/proxy.go +++ b/modules/setting/proxy.go @@ -6,7 +6,7 @@ package setting import ( "net/url" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Proxy settings diff --git a/modules/setting/queue.go b/modules/setting/queue.go index 06d007c140..251a6c1e30 100644 --- a/modules/setting/queue.go +++ b/modules/setting/queue.go @@ -7,8 +7,8 @@ import ( "path/filepath" "runtime" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 9efd674f8b..6086dd1d57 100644 --- a/modules/setting/repository.go +++ b/modules/setting/repository.go @@ -9,7 +9,7 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // enumerates all the policy repository creating @@ -87,7 +87,6 @@ var ( DefaultMergeMessageAllAuthors bool DefaultMergeMessageMaxApprovers int DefaultMergeMessageOfficialApproversOnly bool - DefaultUpdateStyle string PopulateSquashCommentWithCommitMessages bool AddCoCommitterTrailers bool TestConflictingPatchesWithGitApply bool @@ -217,7 +216,6 @@ var ( DefaultMergeMessageAllAuthors bool DefaultMergeMessageMaxApprovers int DefaultMergeMessageOfficialApproversOnly bool - DefaultUpdateStyle string PopulateSquashCommentWithCommitMessages bool AddCoCommitterTrailers bool TestConflictingPatchesWithGitApply bool @@ -234,7 +232,6 @@ var ( DefaultMergeMessageAllAuthors: false, DefaultMergeMessageMaxApprovers: 10, DefaultMergeMessageOfficialApproversOnly: true, - DefaultUpdateStyle: "merge", PopulateSquashCommentWithCommitMessages: false, AddCoCommitterTrailers: true, RetargetChildrenOnMerge: true, @@ -289,7 +286,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(true) + Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool() 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 f3480d1056..678a57cb30 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -8,10 +8,10 @@ import ( "os" "strings" - "forgejo.org/modules/auth/password/hash" - "forgejo.org/modules/generate" - "forgejo.org/modules/keying" - "forgejo.org/modules/log" + "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" ) var ( diff --git a/modules/setting/server.go b/modules/setting/server.go index bff51f787d..5cc33f6fc4 100644 --- a/modules/setting/server.go +++ b/modules/setting/server.go @@ -13,9 +13,9 @@ import ( "strings" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) // Scheme describes protocol types @@ -265,7 +265,7 @@ func loadServerFrom(rootCfg ConfigProvider) { } UnixSocketPermission = uint32(UnixSocketPermissionParsed) - if HTTPAddr[0] != '@' && !filepath.IsAbs(HTTPAddr) { + if !filepath.IsAbs(HTTPAddr) { HTTPAddr = filepath.Join(AppWorkPath, HTTPAddr) } } diff --git a/modules/setting/server_test.go b/modules/setting/server_test.go index 4450f99546..8db8168854 100644 --- a/modules/setting/server_test.go +++ b/modules/setting/server_test.go @@ -6,10 +6,9 @@ package setting import ( "testing" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestDisplayNameDefault(t *testing.T) { @@ -35,54 +34,3 @@ 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 729b10839e..afaee18101 100644 --- a/modules/setting/service.go +++ b/modules/setting/service.go @@ -1,18 +1,15 @@ // 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" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/structs" "github.com/gobwas/glob" ) @@ -40,12 +37,10 @@ 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 @@ -87,8 +82,6 @@ var Service = struct { DefaultOrgMemberVisible bool UserDeleteWithCommentsMaxTime time.Duration ValidSiteURLSchemes []string - UsernameCooldownPeriod int64 - MaxUserRedirects int64 // OpenID settings EnableOpenIDSignIn bool @@ -98,10 +91,8 @@ var Service = struct { // Explore page settings Explore struct { - RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` - DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` - DisableOrganizationsPage bool `ini:"DISABLE_ORGANIZATIONS_PAGE"` - DisableCodePage bool `ini:"DISABLE_CODE_PAGE"` + RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` + DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` } `ini:"service.explore"` }{ AllowedUserVisibilityModesSlice: []bool{true, true, true}, @@ -142,25 +133,6 @@ 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) @@ -180,34 +152,9 @@ func loadServiceFrom(rootCfg ConfigProvider) { if sec.HasKey("EMAIL_DOMAIN_WHITELIST") { deprecatedSetting(rootCfg, "service", "EMAIL_DOMAIN_WHITELIST", "service", "EMAIL_DOMAIN_ALLOWLIST", "1.21") } - 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.EmailDomainAllowList = CompileEmailGlobList(sec, "EMAIL_DOMAIN_WHITELIST", "EMAIL_DOMAIN_ALLOWLIST") 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) @@ -288,14 +235,6 @@ 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 4fc09021b6..7a13e39238 100644 --- a/modules/setting/service_test.go +++ b/modules/setting/service_test.go @@ -4,28 +4,15 @@ package setting import ( - "fmt" - "sort" - "strings" "testing" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/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() { @@ -41,6 +28,15 @@ 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")) @@ -52,121 +48,6 @@ 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 e9ff9bf0bc..e9637fdfc5 100644 --- a/modules/setting/session.go +++ b/modules/setting/session.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" ) // SessionConfig defines Session settings @@ -73,4 +73,6 @@ 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 7c40f6057e..9710fb23d8 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1,6 +1,5 @@ // 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 @@ -8,12 +7,13 @@ package setting import ( "fmt" "os" + "runtime" "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/user" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/user" + "code.gitea.io/gitea/modules/util" ) var ForgejoVersion = "1.0.0" @@ -33,6 +33,7 @@ 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 @@ -40,18 +41,22 @@ 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 SSH.StartBuiltinServer { + if IsWindows || SSH.StartBuiltinServer { return "", true } @@ -206,7 +211,6 @@ func LoadSettings() { initAllLoggers() loadDBSetting(CfgProvider) - loadFederationFrom(CfgProvider) loadServiceFrom(CfgProvider) loadOAuth2ClientFrom(CfgProvider) loadCacheFrom(CfgProvider) @@ -221,6 +225,7 @@ 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 1fef9e068a..f77ee65974 100644 --- a/modules/setting/setting_test.go +++ b/modules/setting/setting_test.go @@ -1,5 +1,4 @@ // Copyright 2020 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. All rights reserved // SPDX-License-Identifier: MIT package setting @@ -7,10 +6,9 @@ package setting import ( "testing" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestMakeAbsoluteAssetURL(t *testing.T) { @@ -32,84 +30,3 @@ 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 86193bddb9..ea387e521f 100644 --- a/modules/setting/ssh.go +++ b/modules/setting/ssh.go @@ -11,8 +11,8 @@ import ( "text/template" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" gossh "golang.org/x/crypto/ssh" ) diff --git a/modules/setting/storage_test.go b/modules/setting/storage_test.go index 59135b5911..271607914c 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, LFS.Storage.MinioConfig.UseSSL) + assert.True(t, true, 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 1211fd475a..39acba12ef 100644 --- a/modules/setting/time.go +++ b/modules/setting/time.go @@ -6,7 +6,7 @@ package setting import ( "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // DefaultUILocation is the location on the UI, so that we can display the time on UI. @@ -20,6 +20,7 @@ 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 2e6a3df4c6..40f1812839 100644 --- a/modules/setting/ui.go +++ b/modules/setting/ui.go @@ -6,8 +6,8 @@ package setting import ( "time" - "forgejo.org/modules/container" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" ) // UI settings diff --git a/modules/setting/webhook.go b/modules/setting/webhook.go index 071b729aa1..7b1ab4db1f 100644 --- a/modules/setting/webhook.go +++ b/modules/setting/webhook.go @@ -6,28 +6,26 @@ package setting import ( "net/url" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) // Webhook settings var Webhook = struct { - QueueLength int - DeliverTimeout int - SkipTLSVerify bool - AllowedHostList string - PagingNum int - ProxyURL string - ProxyURLFixed *url.URL - ProxyHosts []string - PayloadCommitLimit int + QueueLength int + DeliverTimeout int + SkipTLSVerify bool + AllowedHostList string + PagingNum int + ProxyURL string + ProxyURLFixed *url.URL + ProxyHosts []string }{ - QueueLength: 1000, - DeliverTimeout: 5, - SkipTLSVerify: false, - PagingNum: 10, - ProxyURL: "", - ProxyHosts: []string{}, - PayloadCommitLimit: 15, + QueueLength: 1000, + DeliverTimeout: 5, + SkipTLSVerify: false, + PagingNum: 10, + ProxyURL: "", + ProxyHosts: []string{}, } func loadWebhookFrom(rootCfg ConfigProvider) { @@ -47,5 +45,4 @@ 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 1ccd95b18b..21d4f89936 100644 --- a/modules/ssh/init.go +++ b/modules/ssh/init.go @@ -11,8 +11,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) func Init() error { diff --git a/modules/ssh/ssh.go b/modules/ssh/ssh.go index 19cac0b603..6ee10f718b 100644 --- a/modules/ssh/ssh.go +++ b/modules/ssh/ssh.go @@ -21,12 +21,12 @@ import ( "sync" "syscall" - 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" + 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" "github.com/gliderlabs/ssh" gossh "golang.org/x/crypto/ssh" diff --git a/modules/ssh/ssh_graceful.go b/modules/ssh/ssh_graceful.go index 825313ab1c..cad2c685bd 100644 --- a/modules/ssh/ssh_graceful.go +++ b/modules/ssh/ssh_graceful.go @@ -4,9 +4,9 @@ package ssh import ( - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "github.com/gliderlabs/ssh" ) diff --git a/modules/storage/helper.go b/modules/storage/helper.go index 8bec3a0042..95f1c7b9a8 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.Values) (*url.URL, error) { +func (s DiscardStorage) URL(_, _ string) (*url.URL, error) { return nil, fmt.Errorf("%s", s) } diff --git a/modules/storage/helper_test.go b/modules/storage/helper_test.go index dd30c9b8ac..60a7c61289 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", nil) + got, err := tt.URL("path", "name") assert.Nil(t, got) require.Errorf(t, err, string(tt)) } diff --git a/modules/storage/local.go b/modules/storage/local.go index 6f851983b1..9bb532f1df 100644 --- a/modules/storage/local.go +++ b/modules/storage/local.go @@ -11,9 +11,9 @@ import ( "os" "path/filepath" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/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, reqParams url.Values) (*url.URL, error) { +func (l *LocalStorage) URL(path, name string) (*url.URL, error) { return nil, ErrURLNotSupported } diff --git a/modules/storage/local_test.go b/modules/storage/local_test.go index d0dd3a6462..e230323f67 100644 --- a/modules/storage/local_test.go +++ b/modules/storage/local_test.go @@ -8,7 +8,7 @@ import ( "path/filepath" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/storage/minio.go b/modules/storage/minio.go index ee545edc10..d0c2dec65b 100644 --- a/modules/storage/minio.go +++ b/modules/storage/minio.go @@ -15,9 +15,9 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" @@ -276,12 +276,8 @@ 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, serveDirectReqParams url.Values) (*url.URL, error) { - // copy serveDirectReqParams - reqParams, err := url.ParseQuery(serveDirectReqParams.Encode()) - if err != nil { - return nil, err - } +func (m *MinioStorage) URL(path, name string) (*url.URL, error) { + reqParams := make(url.Values) // 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 99f70c4565..9ce1dbc7b4 100644 --- a/modules/storage/minio_test.go +++ b/modules/storage/minio_test.go @@ -10,7 +10,7 @@ import ( "os" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 db081e0768..b83b1c7929 100644 --- a/modules/storage/storage.go +++ b/modules/storage/storage.go @@ -11,13 +11,32 @@ import ( "net/url" "os" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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 @@ -44,7 +63,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, reqParams url.Values) (*url.URL, error) + URL(path, name string) (*url.URL, error) IterateObjects(path string, iterator func(path string, obj Object) error) error } @@ -112,7 +131,7 @@ var ( ActionsArtifacts ObjectStorage = UninitializedStorage ) -// Init init the storage +// Init init the stoarge func Init() error { for _, f := range []func() error{ initAttachments, diff --git a/modules/storage/storage_test.go b/modules/storage/storage_test.go index af3dd9520e..70bcd3155a 100644 --- a/modules/storage/storage_test.go +++ b/modules/storage/storage_test.go @@ -7,7 +7,7 @@ import ( "bytes" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/modules/structs/action.go b/modules/structs/action.go deleted file mode 100644 index df9f845adc..0000000000 --- a/modules/structs/action.go +++ /dev/null @@ -1,25 +0,0 @@ -// 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 8a4d066d72..5b7df127b4 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;EmailForAdmin;MaxSize(254)"` + Email string `json:"email" binding:"Required;Email;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 0a3d4140c2..c97cdcb83c 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 "forgejo.org/modules/structs" +package structs // import "code.gitea.io/gitea/modules/structs" import ( "time" diff --git a/modules/structs/hook.go b/modules/structs/hook.go index 28c2e00588..1940fd8dc3 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) // ErrInvalidReceiveHook FIXME @@ -53,8 +53,7 @@ type CreateHookOption struct { BranchFilter string `json:"branch_filter" binding:"GlobPattern"` AuthorizationHeader string `json:"authorization_header"` // default: false - Active bool `json:"active"` - IsSystemWebhook bool `json:"is_system_webhook"` + Active bool `json:"active"` } // EditHookOption options when modify one hook @@ -142,6 +141,26 @@ 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 +} + // ________ .__ __ // \______ \ ____ | | _____/ |_ ____ // | | \_/ __ \| | _/ __ \ __\/ __ \ @@ -202,14 +221,13 @@ const ( // IssueCommentPayload represents a payload information of issue comment event. type IssueCommentPayload struct { - 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"` + 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"` } // JSONPayload implements Payload @@ -273,6 +291,22 @@ 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/", "") diff --git a/modules/structs/miscellaneous.go b/modules/structs/miscellaneous.go index 7866cb5fc0..bff10f95b7 100644 --- a/modules/structs/miscellaneous.go +++ b/modules/structs/miscellaneous.go @@ -37,10 +37,6 @@ 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 451153b620..b2b2c61a01 100644 --- a/modules/structs/org.go +++ b/modules/structs/org.go @@ -47,22 +47,13 @@ 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 1ce7550e19..ab627666c9 100644 --- a/modules/structs/pull.go +++ b/modules/structs/pull.go @@ -57,8 +57,7 @@ type PullRequest struct { // swagger:strfmt date-time Closed *time.Time `json:"closed_at"` - PinOrder int `json:"pin_order"` - Flow int64 `json:"flow"` + PinOrder int `json:"pin_order"` } // PRBranchInfo information about a branch diff --git a/modules/structs/pull_review.go b/modules/structs/pull_review.go index f89c1f2a63..c77ebea07d 100644 --- a/modules/structs/pull_review.go +++ b/modules/structs/pull_review.go @@ -89,6 +89,7 @@ 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 c9cd729cf3..f2fe9c7ac3 100644 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -105,7 +105,6 @@ 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"` @@ -224,10 +223,8 @@ 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", "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 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 `true` to allow edits from maintainers by default DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"` // set to `true` to archive this repository. @@ -293,16 +290,6 @@ 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 6e77a813d3..8a12498705 100644 --- a/modules/structs/repo_compare.go +++ b/modules/structs/repo_compare.go @@ -5,7 +5,6 @@ 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. - Files []*CommitAffectedFiles `json:"files"` // Total files modified in this comparison. + TotalCommits int `json:"total_commits"` // Total number of commits in the comparison. + Commits []*Commit `json:"commits"` // List of commits in the comparison. } diff --git a/modules/structs/repo_note.go b/modules/structs/repo_note.go index 76c6c17898..4eaf5a255d 100644 --- a/modules/structs/repo_note.go +++ b/modules/structs/repo_note.go @@ -8,7 +8,3 @@ 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 49e4c495cf..f2747b1473 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -6,7 +6,7 @@ package structs import ( "time" - "forgejo.org/modules/json" + "code.gitea.io/gitea/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 profile page + // URL to the user's gitea page HTMLURL string `json:"html_url"` // User locale Language string `json:"language"` @@ -84,7 +84,6 @@ 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"` } @@ -102,7 +101,6 @@ 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 485d0de1af..9319667e8f 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" binding:"EmailWithAllowedDomain"` + Email string `json:"email"` 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 704ed0e65b..c4429ea0a2 100644 --- a/modules/structs/workflow.go +++ b/modules/structs/workflow.go @@ -12,18 +12,4 @@ 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 e00d8de2d1..016e1dc08b 100644 --- a/modules/svg/svg.go +++ b/modules/svg/svg.go @@ -9,9 +9,9 @@ import ( "path" "strings" - gitea_html "forgejo.org/modules/html" - "forgejo.org/modules/log" - "forgejo.org/modules/public" + gitea_html "code.gitea.io/gitea/modules/html" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/public" ) var svgIcons map[string]string diff --git a/modules/sync/status_pool.go b/modules/sync/status_pool.go index f22e3e155b..6f075d54b7 100644 --- a/modules/sync/status_pool.go +++ b/modules/sync/status_pool.go @@ -6,7 +6,7 @@ package sync import ( "sync" - "forgejo.org/modules/container" + "code.gitea.io/gitea/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 8a444aff0f..2f44c7b845 100644 --- a/modules/system/appstate_test.go +++ b/modules/system/appstate_test.go @@ -6,8 +6,8 @@ package system import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/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 384087ab4f..17178283d9 100644 --- a/modules/system/db.go +++ b/modules/system/db.go @@ -6,9 +6,9 @@ package system import ( "context" - "forgejo.org/models/system" - "forgejo.org/modules/json" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 76d8e3271e..2c2f35bbed 100644 --- a/modules/templates/base.go +++ b/modules/templates/base.go @@ -7,8 +7,8 @@ import ( "slices" "strings" - "forgejo.org/modules/assetfs" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/setting" ) func AssetFS() *assetfs.LayeredFS { diff --git a/modules/templates/dynamic.go b/modules/templates/dynamic.go index c5752c8c72..e1babd83c9 100644 --- a/modules/templates/dynamic.go +++ b/modules/templates/dynamic.go @@ -6,8 +6,8 @@ package templates import ( - "forgejo.org/modules/assetfs" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/modules/setting" ) func BuiltinAssets() *assetfs.Layer { diff --git a/modules/templates/eval/eval.go b/modules/templates/eval/eval.go index 487a1de4b0..5d4ac915b9 100644 --- a/modules/templates/eval/eval.go +++ b/modules/templates/eval/eval.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) type Num struct { diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 02b175e6f6..aeae8204ad 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -14,14 +14,15 @@ import ( "strings" "time" - 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" + 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" ) // NewFuncMap returns functions for injecting to templates @@ -51,7 +52,6 @@ func NewFuncMap() template.FuncMap { "StringUtils": NewStringUtils, "SliceUtils": NewSliceUtils, "JsonUtils": NewJsonUtils, - "DateUtils": NewDateUtils, // ----------------------------------------------------------------- // svg / avatar / icon / color @@ -64,18 +64,16 @@ func NewFuncMap() template.FuncMap { // ----------------------------------------------------------------- // time / number / format - "FileSize": FileSizePanic, - "CountFmt": base.FormatNumberSI, - "Sec2Time": util.SecToTime, + "FileSize": FileSizePanic, + "CountFmt": base.FormatNumberSI, + "TimeSince": timeutil.TimeSince, + "TimeSinceUnix": timeutil.TimeSinceUnix, + "DateTime": timeutil.DateTime, + "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 { @@ -103,10 +101,6 @@ 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 }, @@ -188,7 +182,6 @@ 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 d60397df08..55a55dd7f4 100644 --- a/modules/templates/htmlrenderer.go +++ b/modules/templates/htmlrenderer.go @@ -19,12 +19,12 @@ import ( "sync/atomic" texttemplate "text/template" - "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" + "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" ) type TemplateExecutor scopedtmpl.TemplateExecutor diff --git a/modules/templates/htmlrenderer_test.go b/modules/templates/htmlrenderer_test.go index 7373605744..a1d3783a75 100644 --- a/modules/templates/htmlrenderer_test.go +++ b/modules/templates/htmlrenderer_test.go @@ -10,7 +10,7 @@ import ( "strings" "testing" - "forgejo.org/modules/assetfs" + "code.gitea.io/gitea/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 a40728d7c7..ee79755dbb 100644 --- a/modules/templates/mailer.go +++ b/modules/templates/mailer.go @@ -11,9 +11,9 @@ import ( "strings" texttmpl "text/template" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) var mailSubjectSplit = regexp.MustCompile(`(?m)^-{3,}\s*$`) diff --git a/modules/templates/main_test.go b/modules/templates/main_test.go index 946bc603f6..bbdf5d2f99 100644 --- a/modules/templates/main_test.go +++ b/modules/templates/main_test.go @@ -7,12 +7,11 @@ import ( "context" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/markup" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/markup" - _ "forgejo.org/models" - _ "forgejo.org/models/forgefed" - _ "forgejo.org/models/issues" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/issues" ) func TestMain(m *testing.M) { diff --git a/modules/templates/static.go b/modules/templates/static.go index 776548c853..b5a7e561ec 100644 --- a/modules/templates/static.go +++ b/modules/templates/static.go @@ -8,8 +8,8 @@ package templates import ( "time" - "forgejo.org/modules/assetfs" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/assetfs" + "code.gitea.io/gitea/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 93ebec51e4..afc1091516 100644 --- a/modules/templates/util_avatar.go +++ b/modules/templates/util_avatar.go @@ -9,13 +9,13 @@ import ( "html" "html/template" - 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" + 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" ) 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 deleted file mode 100644 index bb83bf692a..0000000000 --- a/modules/templates/util_date.go +++ /dev/null @@ -1,151 +0,0 @@ -// 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 deleted file mode 100644 index 37caf0d422..0000000000 --- a/modules/templates/util_date_test.go +++ /dev/null @@ -1,82 +0,0 @@ -// 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 9d9af77fad..8d6376b522 100644 --- a/modules/templates/util_dict.go +++ b/modules/templates/util_dict.go @@ -9,9 +9,9 @@ import ( "html/template" "reflect" - "forgejo.org/modules/container" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/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 3bc80e8f21..71a4e23d36 100644 --- a/modules/templates/util_json.go +++ b/modules/templates/util_json.go @@ -6,7 +6,7 @@ package templates import ( "bytes" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) type JsonUtils struct{} //nolint:revive diff --git a/modules/templates/util_misc.go b/modules/templates/util_misc.go index 12a65c87da..774385483b 100644 --- a/modules/templates/util_misc.go +++ b/modules/templates/util_misc.go @@ -12,14 +12,14 @@ import ( "strings" "time" - 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" + 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" "github.com/editorconfig/editorconfig-core-go/v2" ) diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index a4d7a82eea..c53bdd876f 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -14,14 +14,14 @@ import ( "strings" "unicode" - 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" + 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" ) // RenderCommitMessage renders commit message with XSS-safe and special links. @@ -262,15 +262,3 @@ 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 20c39eb417..da74298ef7 100644 --- a/modules/templates/util_render_test.go +++ b/modules/templates/util_render_test.go @@ -8,10 +8,10 @@ import ( "html/template" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - "forgejo.org/modules/translation" + "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" "github.com/stretchr/testify/assert" ) @@ -46,13 +46,13 @@ var testMetas = map[string]string{ } func TestApostrophesInMentions(t *testing.T) { - rendered := RenderMarkdownToHtml(t.Context(), "@mention-user's comment") - assert.EqualValues(t, template.HTML("

      @mention-user's comment

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

      @mention-user's comment

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

      @ThisUserDoesNotExist @mention-user

      \n"), rendered) + rendered := RenderMarkdownToHtml(context.Background(), "@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: t.Context(), + ctx: context.Background(), 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: t.Context(), + ctx: context.Background(), 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: t.Context(), + ctx: context.Background(), 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(t.Context(), testInput, testMetas)) +` + "`code 👠#123 code`" + assert.EqualValues(t, expected, RenderCommitBody(context.Background(), testInput, testMetas)) } func TestRenderCommitMessage(t *testing.T) { expected := `space @mention-user ` - assert.EqualValues(t, expected, RenderCommitMessage(t.Context(), testInput, testMetas)) + assert.EqualValues(t, expected, RenderCommitMessage(context.Background(), testInput, testMetas)) } func TestRenderCommitMessageLinkSubject(t *testing.T) { expected := `space @mention-user` - assert.EqualValues(t, expected, RenderCommitMessageLinkSubject(t.Context(), testInput, "https://example.com/link", testMetas)) + assert.EqualValues(t, expected, RenderCommitMessageLinkSubject(context.Background(), 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(t.Context(), testInput, testMetas)) + assert.EqualValues(t, expected, RenderIssueTitle(context.Background(), 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(t.Context(), testInput)) + assert.EqualValues(t, expected, RenderRefIssueTitle(context.Background(), 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(t.Context(), testInput)) + assert.EqualValues(t, expected, RenderMarkdownToHtml(context.Background(), testInput)) } func TestRenderLabels(t *testing.T) { diff --git a/modules/templates/util_string.go b/modules/templates/util_string.go index 2d255e54a7..f23b74786a 100644 --- a/modules/templates/util_string.go +++ b/modules/templates/util_string.go @@ -8,7 +8,7 @@ import ( "html/template" "strings" - "forgejo.org/modules/base" + "code.gitea.io/gitea/modules/base" ) type StringUtils struct{} @@ -19,10 +19,6 @@ 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 deleted file mode 100644 index fd68c88a40..0000000000 --- a/modules/test/distant_federation_server_mock.go +++ /dev/null @@ -1,117 +0,0 @@ -// 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 8e8fc32216..0f12257f3e 100644 --- a/modules/test/logchecker.go +++ b/modules/test/logchecker.go @@ -11,7 +11,7 @@ import ( "sync/atomic" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) type LogChecker struct { diff --git a/modules/test/logchecker_test.go b/modules/test/logchecker_test.go index d81142bf1c..0f410fed12 100644 --- a/modules/test/logchecker_test.go +++ b/modules/test/logchecker_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" "github.com/stretchr/testify/assert" ) diff --git a/modules/test/utils.go b/modules/test/utils.go index f60bad022e..3d884b6cbe 100644 --- a/modules/test/utils.go +++ b/modules/test/utils.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "strings" - "forgejo.org/modules/json" + "code.gitea.io/gitea/modules/json" ) // RedirectURL returns the redirect URL of a http response. diff --git a/modules/testlogger/testlogger.go b/modules/testlogger/testlogger.go index b5f196ad4b..7897cc6b07 100644 --- a/modules/testlogger/testlogger.go +++ b/modules/testlogger/testlogger.go @@ -16,9 +16,8 @@ import ( "testing" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/queue" ) var ( @@ -446,7 +445,10 @@ func (w *testLoggerWriterCloser) Reset() error { func PrintCurrentTest(t testing.TB, skip ...int) func() { t.Helper() start := time.Now() - actualSkip := util.OptionalArg(skip) + 1 + actualSkip := 1 + if len(skip) > 0 { + actualSkip = skip[0] + 1 + } _, filename, line, _ := runtime.Caller(actualSkip) if log.CanColorStdout { @@ -471,7 +473,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(t.Context(), time.Minute); err != nil { + if err := queue.GetManager().FlushAll(context.Background(), time.Minute); err != nil { t.Errorf("Flushing queues failed with error %v", err) } timer.Stop() @@ -486,7 +488,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\n", err) + _, _ = fmt.Fprintf(os.Stdout, "testlogger.go:recordError() FATAL ERROR: log.Error has been called: %v", 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 new file mode 100644 index 0000000000..c089173560 --- /dev/null +++ b/modules/timeutil/datetime.go @@ -0,0 +1,68 @@ +// 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 new file mode 100644 index 0000000000..ac2ce35ba2 --- /dev/null +++ b/modules/timeutil/datetime_test.go @@ -0,0 +1,47 @@ +// 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 7b30176df0..57ae8b2a9d 100644 --- a/modules/timeutil/executable.go +++ b/modules/timeutil/executable.go @@ -9,7 +9,7 @@ import ( "sync" "time" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" ) var ( diff --git a/modules/timeutil/since.go b/modules/timeutil/since.go index b0bbe25f98..dba42c793a 100644 --- a/modules/timeutil/since.go +++ b/modules/timeutil/since.go @@ -4,10 +4,13 @@ package timeutil import ( + "fmt" + "html/template" "strings" "time" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" ) // Seconds-based time units @@ -78,11 +81,16 @@ 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), time.Now(), lang) + 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) } func timeSincePro(then, now time.Time, lang translation.Locale) string { @@ -106,3 +114,32 @@ 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 b47b2c76dd..40fefe8700 100644 --- a/modules/timeutil/since_test.go +++ b/modules/timeutil/since_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" "github.com/stretchr/testify/assert" ) diff --git a/modules/timeutil/timestamp.go b/modules/timeutil/timestamp.go index 783ccba30b..27a80b6682 100644 --- a/modules/timeutil/timestamp.go +++ b/modules/timeutil/timestamp.go @@ -6,7 +6,7 @@ package timeutil import ( "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // TimeStamp defines a timestamp diff --git a/modules/timeutil/timestampnano.go b/modules/timeutil/timestampnano.go index e2e86b863f..4a9f7955b9 100644 --- a/modules/timeutil/timestampnano.go +++ b/modules/timeutil/timestampnano.go @@ -6,7 +6,7 @@ package timeutil import ( "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 deleted file mode 100644 index 861672c619..0000000000 --- a/modules/translation/i18n/dummy.go +++ /dev/null @@ -1,58 +0,0 @@ -// 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 deleted file mode 100644 index 1df3d0c348..0000000000 --- a/modules/translation/i18n/dummy_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 63a5f48dfa..7f64ccf908 100644 --- a/modules/translation/i18n/errors.go +++ b/modules/translation/i18n/errors.go @@ -4,12 +4,10 @@ package i18n import ( - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) var ( - 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} + 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} ) diff --git a/modules/translation/i18n/i18n.go b/modules/translation/i18n/i18n.go index e447502a3b..1555cd961e 100644 --- a/modules/translation/i18n/i18n.go +++ b/modules/translation/i18n/i18n.go @@ -8,28 +8,11 @@ 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 @@ -48,10 +31,8 @@ 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 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 + // AddLocaleByIni adds a new language to the store + AddLocaleByIni(langName, langDesc string, source, moreSource []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 a0458f0b8e..244f6ffbb3 100644 --- a/modules/translation/i18n/i18n_test.go +++ b/modules/translation/i18n/i18n_test.go @@ -12,26 +12,6 @@ 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 @@ -47,48 +27,11 @@ 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", 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)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, nil)) + require.NoError(t, ls.AddLocaleByIni("lang2", "Lang2", testData2, nil)) ls.SetDefaultLang("lang1") lang1, _ := ls.Locale("lang1") @@ -113,60 +56,12 @@ commits = fallback value for commits 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) - // 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") + found := lang1.HasKey("no-such") assert.False(t, found) - assert.EqualValues(t, "no-such", lang1.TrString("no-such")) require.NoError(t, ls.Close()) } @@ -182,7 +77,7 @@ c=22 `) ls := NewLocaleStore() - require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, testData1, testData2)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", testData1, testData2)) lang1, _ := ls.Locale("lang1") assert.Equal(t, "11", lang1.TrString("a")) assert.Equal(t, "21", lang1.TrString("b")) @@ -223,7 +118,7 @@ func (e *errorPointerReceiver) Error() string { func TestLocaleWithTemplate(t *testing.T) { ls := NewLocaleStore() - require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", MockPluralRule, []byte(`key=%s`), nil)) + require.NoError(t, ls.AddLocaleByIni("lang1", "Lang1", []byte(`key=%s`), nil)) lang1, _ := ls.Locale("lang1") tmpl := template.New("test").Funcs(template.FuncMap{"tr": lang1.TrHTML}) @@ -286,7 +181,7 @@ func TestLocaleStoreQuirks(t *testing.T) { for _, testData := range testDataList { ls := NewLocaleStore() - err := ls.AddLocaleByIni("lang1", "Lang1", nil, []byte("a="+testData.in), nil) + err := ls.AddLocaleByIni("lang1", "Lang1", []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 1b64139690..0e6ddab401 100644 --- a/modules/translation/i18n/localestore.go +++ b/modules/translation/i18n/localestore.go @@ -1,5 +1,4 @@ // Copyright 2022 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package i18n @@ -9,10 +8,8 @@ import ( "html/template" "slices" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // This file implements the static LocaleStore that will not watch for changes @@ -21,9 +18,6 @@ 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) @@ -44,19 +38,8 @@ 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, pluralRule PluralFormRule, source, moreSource []byte) error { +func (store *localeStore) AddLocaleByIni(langName, langDesc string, source, moreSource []byte) error { if _, ok := store.localeMap[langName]; ok { return ErrLocaleAlreadyExist } @@ -64,7 +47,7 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, pluralRule P store.langNames = append(store.langNames, langName) store.langDescs = append(store.langDescs, langDesc) - l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string), pluralRule: pluralRule, newStyleMessages: make(map[string]string)} + l := &locale{store: store, langName: langName, idxToMsgMap: make(map[int]string)} store.localeMap[l.langName] = l iniFile, err := setting.NewConfigProviderForLocale(source, moreSource) @@ -95,98 +78,6 @@ func (store *localeStore) AddLocaleByIni(langName, langDesc string, pluralRule P 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 @@ -222,38 +113,22 @@ func (store *localeStore) Close() error { func (l *locale) TrString(trKey string, trArgs ...any) string { format := trKey - 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 + 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 found = true } } - - 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) - } - } + } + if !found { + log.Error("Missing translation %q", trKey) } msg, err := Format(format, trArgs...) @@ -263,7 +138,7 @@ func (l *locale) TrString(trKey string, trArgs ...any) string { return msg } -func PrepareArgsForHTML(trArgs ...any) []any { +func (l *locale) TrHTML(trKey string, trArgs ...any) template.HTML { args := slices.Clone(trArgs) for i, v := range args { switch v := v.(type) { @@ -277,38 +152,11 @@ func PrepareArgsForHTML(trArgs ...any) []any { args[i] = template.HTMLEscapeString(fmt.Sprint(v)) } } - 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) + return template.HTML(l.TrString(trKey, args...)) } // 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 72a15b7438..fe3a1502ea 100644 --- a/modules/translation/mock.go +++ b/modules/translation/mock.go @@ -31,18 +31,10 @@ 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 deleted file mode 100644 index 7e9ae39111..0000000000 --- a/modules/translation/plural_rules.go +++ /dev/null @@ -1,253 +0,0 @@ -// 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 1b763764f1..16eb55e28e 100644 --- a/modules/translation/translation.go +++ b/modules/translation/translation.go @@ -10,11 +10,11 @@ import ( "strings" "sync" - "forgejo.org/modules/log" - "forgejo.org/modules/options" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation/i18n" - "forgejo.org/modules/util" + "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" "github.com/dustin/go-humanize" "golang.org/x/text/language" @@ -32,15 +32,10 @@ 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 } @@ -105,17 +100,8 @@ func InitLocales(ctx context.Context) { } key := "locale_" + setting.Langs[i] + ".ini" - 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 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 len(setting.Langs) != 0 { @@ -174,16 +160,6 @@ 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 356b85f946..bffbb155ca 100644 --- a/modules/translation/translation_test.go +++ b/modules/translation/translation_test.go @@ -8,7 +8,7 @@ package translation import ( "testing" - "forgejo.org/modules/translation/i18n" + "code.gitea.io/gitea/modules/translation/i18n" "github.com/stretchr/testify/assert" ) @@ -48,111 +48,3 @@ 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 31ba256195..38d0233446 100644 --- a/modules/turnstile/turnstile.go +++ b/modules/turnstile/turnstile.go @@ -11,8 +11,8 @@ import ( "net/url" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" ) // Response is the structure of JSON returned from API diff --git a/modules/typesniffer/typesniffer.go b/modules/typesniffer/typesniffer.go index a8fc70e54c..6aec5c285e 100644 --- a/modules/typesniffer/typesniffer.go +++ b/modules/typesniffer/typesniffer.go @@ -11,7 +11,7 @@ import ( "regexp" "strings" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // Use at most this many bytes to determine Content Type. @@ -20,8 +20,6 @@ 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" ) @@ -108,12 +106,6 @@ 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 8d80b4ddb4..f6fa07ee7f 100644 --- a/modules/typesniffer/typesniffer_test.go +++ b/modules/typesniffer/typesniffer_test.go @@ -135,13 +135,3 @@ 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 b0932ba663..0c93f08d21 100644 --- a/modules/updatechecker/update_checker.go +++ b/modules/updatechecker/update_checker.go @@ -11,10 +11,10 @@ import ( "net/http" "strings" - "forgejo.org/modules/json" - "forgejo.org/modules/proxy" - "forgejo.org/modules/setting" - "forgejo.org/modules/system" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/system" "github.com/hashicorp/go-version" ) diff --git a/modules/user/user.go b/modules/user/user.go index d153413c70..eee401a23f 100644 --- a/modules/user/user.go +++ b/modules/user/user.go @@ -6,6 +6,8 @@ package user import ( "os" "os/user" + "runtime" + "strings" ) // CurrentUsername return current login OS user name @@ -14,7 +16,12 @@ func CurrentUsername() string { if err != nil { return fallbackCurrentUsername() } - return userinfo.Username + username := userinfo.Username + if runtime.GOOS == "windows" { + parts := strings.Split(username, "\\") + username = parts[len(parts)-1] + } + return 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 c7eff85c90..372a675d34 100644 --- a/modules/user/user_test.go +++ b/modules/user/user_test.go @@ -5,6 +5,7 @@ package user import ( "os/exec" + "runtime" "strings" "testing" ) @@ -22,6 +23,10 @@ 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 b722eee97d..79a29c8b3b 100644 --- a/modules/util/file_unix.go +++ b/modules/util/file_unix.go @@ -1,6 +1,8 @@ // 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 228c64f980..d60082a034 100644 --- a/modules/util/file_unix_test.go +++ b/modules/util/file_unix_test.go @@ -1,6 +1,8 @@ // 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 new file mode 100644 index 0000000000..77a33d3c49 --- /dev/null +++ b/modules/util/file_windows.go @@ -0,0 +1,15 @@ +// 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 6c05db779a..ec9bca7efa 100644 --- a/modules/util/keypair_test.go +++ b/modules/util/keypair_test.go @@ -10,6 +10,7 @@ import ( "crypto/sha256" "crypto/x509" "encoding/pem" + "regexp" "testing" "github.com/stretchr/testify/assert" @@ -23,8 +24,8 @@ func TestKeygen(t *testing.T) { assert.NotEmpty(t, priv) assert.NotEmpty(t, pub) - assert.Regexp(t, "^-----BEGIN RSA PRIVATE KEY-----.*", priv) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----.*", pub) + assert.Regexp(t, regexp.MustCompile("^-----BEGIN RSA PRIVATE KEY-----.*"), priv) + assert.Regexp(t, regexp.MustCompile("^-----BEGIN PUBLIC KEY-----.*"), pub) } func TestSignUsingKeys(t *testing.T) { diff --git a/modules/util/path.go b/modules/util/path.go index 9039f27cbf..185e7cf882 100644 --- a/modules/util/path.go +++ b/modules/util/path.go @@ -10,6 +10,8 @@ import ( "os" "path" "path/filepath" + "regexp" + "runtime" "strings" ) @@ -76,7 +78,11 @@ 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 `/` - elems[0] = filepath.Clean(strings.ReplaceAll(base, "\\", pathSeparator)) + if isOSWindows() { + elems[0] = filepath.Clean(base) + } else { + 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)) @@ -85,7 +91,11 @@ func FilePathJoinAbs(base string, sub ...string) string { if s == "" { continue } - elems = append(elems, filepath.Clean(pathSeparator+strings.ReplaceAll(s, "\\", pathSeparator))) + if isOSWindows() { + elems = append(elems, filepath.Clean(pathSeparator+s)) + } else { + 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...) @@ -207,6 +217,12 @@ 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) { @@ -214,7 +230,17 @@ func FileURLToPath(u *url.URL) (string, error) { return "", errors.New("URL scheme is not 'file': " + u.String()) } - return u.Path, nil + 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 } // HomeDir returns path of '~'(in Linux) on Windows, @@ -223,7 +249,14 @@ 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` - home = os.Getenv("HOME") + if isOSWindows() { + home = os.Getenv("USERPROFILE") + if home == "" { + home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + } + } else { + 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 b912b76f6e..3699f052d1 100644 --- a/modules/util/path_test.go +++ b/modules/util/path_test.go @@ -5,6 +5,7 @@ package util import ( "net/url" + "runtime" "testing" "github.com/stretchr/testify/assert" @@ -16,6 +17,7 @@ func TestFileURLToPath(t *testing.T) { url string expected string haserror bool + windows bool }{ // case 0 { @@ -32,9 +34,18 @@ 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 { @@ -166,18 +177,35 @@ func TestCleanPath(t *testing.T) { assert.Equal(t, c.expected, PathJoinRelX(c.elems...), "case: %v", c.elems) } - 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 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`}, + } } 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 b07a48bee4..265891b307 100644 --- a/modules/util/remove.go +++ b/modules/util/remove.go @@ -7,10 +7,13 @@ import ( "io/fs" "os" "path/filepath" + "runtime" "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 @@ -26,6 +29,12 @@ 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 @@ -34,29 +43,6 @@ func Remove(name string) error { return err } -// 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 @@ -69,7 +55,25 @@ func RemoveAll(name string) error { // > (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) + err = 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 + }) if err != nil { // try again <-time.After(100 * time.Millisecond) @@ -87,6 +91,12 @@ 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 @@ -110,6 +120,12 @@ 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 ff234eea93..c595f49c49 100644 --- a/modules/util/rotatingfilewriter/writer.go +++ b/modules/util/rotatingfilewriter/writer.go @@ -14,8 +14,8 @@ import ( "sync" "time" - "forgejo.org/modules/graceful/releasereopen" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/graceful/releasereopen" + "code.gitea.io/gitea/modules/util" ) type Options struct { diff --git a/modules/util/slice.go b/modules/util/slice.go index 80c8e62f6f..9c878c24be 100644 --- a/modules/util/slice.go +++ b/modules/util/slice.go @@ -4,6 +4,7 @@ package util import ( + "cmp" "slices" "strings" ) @@ -46,6 +47,13 @@ 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 f2edbdc673..77b116eeff 100644 --- a/modules/util/truncate.go +++ b/modules/util/truncate.go @@ -41,8 +41,6 @@ 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 da405c9c4b..dcd7cf4f29 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -14,7 +14,7 @@ import ( "strconv" "strings" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/modules/optional" "golang.org/x/crypto/ssh" "golang.org/x/text/cases" @@ -234,25 +234,6 @@ func IfZero[T comparable](v, def T) T { 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 5e0c4a9a0b..549b53f5a7 100644 --- a/modules/util/util_test.go +++ b/modules/util/util_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "forgejo.org/modules/optional" - "forgejo.org/modules/test" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -275,16 +275,3 @@ 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 f4f82278bd..cb0a5063e5 100644 --- a/modules/validation/binding.go +++ b/modules/validation/binding.go @@ -8,11 +8,10 @@ import ( "regexp" "strings" - "forgejo.org/modules/auth" - "forgejo.org/modules/git" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/git" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" "github.com/gobwas/glob" ) @@ -27,14 +26,11 @@ 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() @@ -42,14 +38,13 @@ func AddBindingRules() { addGlobOrRegexPatternRule() addUsernamePatternRule() addValidGroupTeamMapRule() - addEmailBindingRules() } func addGitRefNameBindingRule() { // Git refname validation rule binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return rule == "GitRefName" + return strings.HasPrefix(rule, "GitRefName") }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -63,38 +58,11 @@ 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 rule == "ValidUrl" + return strings.HasPrefix(rule, "ValidUrl") }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -112,7 +80,7 @@ func addValidSiteURLBindingRule() { // URL validation rule binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return rule == "ValidSiteUrl" + return strings.HasPrefix(rule, "ValidSiteUrl") }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { str := fmt.Sprintf("%v", val) @@ -203,7 +171,7 @@ func addUsernamePatternRule() { func addValidGroupTeamMapRule() { binding.AddRule(&binding.Rule{ IsMatch: func(rule string) bool { - return rule == "ValidGroupTeamMap" + return strings.HasPrefix(rule, "ValidGroupTeamMap") }, IsValid: func(errs binding.Errors, name string, val any) (bool, binding.Errors) { _, err := auth.UnmarshalGroupTeamMapping(fmt.Sprintf("%v", val)) @@ -217,34 +185,6 @@ 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 5adcdf0289..01ff4e3435 100644 --- a/modules/validation/binding_test.go +++ b/modules/validation/binding_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" chi "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" ) @@ -27,7 +27,6 @@ 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 deleted file mode 100644 index fb563c2b81..0000000000 --- a/modules/validation/email.go +++ /dev/null @@ -1,146 +0,0 @@ -// 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 deleted file mode 100644 index ffdc6fd4ee..0000000000 --- a/modules/validation/email_test.go +++ /dev/null @@ -1,73 +0,0 @@ -// 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 42d86754e1..1bf622e61d 100644 --- a/modules/validation/glob_pattern_test.go +++ b/modules/validation/glob_pattern_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" "github.com/gobwas/glob" ) diff --git a/modules/validation/helpers.go b/modules/validation/helpers.go index 1f573564e6..567ad867fe 100644 --- a/modules/validation/helpers.go +++ b/modules/validation/helpers.go @@ -9,7 +9,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" + + "github.com/gobwas/glob" ) var externalTrackerRegex = regexp.MustCompile(`({?)(?:user|repo|index)+?(}?)`) @@ -48,6 +50,29 @@ 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 01a17f0d6b..a1bdf2a29c 100644 --- a/modules/validation/helpers_test.go +++ b/modules/validation/helpers_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/modules/validation/refname_test.go b/modules/validation/refname_test.go index bb64cab51e..3af7387c47 100644 --- a/modules/validation/refname_test.go +++ b/modules/validation/refname_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) var gitRefNameValidationTestCases = []validationTestCase{ diff --git a/modules/validation/regex_pattern_test.go b/modules/validation/regex_pattern_test.go index 90bd969c4f..efcb276734 100644 --- a/modules/validation/regex_pattern_test.go +++ b/modules/validation/regex_pattern_test.go @@ -7,7 +7,7 @@ import ( "regexp" "testing" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) func getRegexPatternErrorString(pattern string) string { diff --git a/modules/validation/validatable.go b/modules/validation/validatable.go index bc565bd194..94b5cc135c 100644 --- a/modules/validation/validatable.go +++ b/modules/validation/validatable.go @@ -10,7 +10,7 @@ import ( "strings" "unicode/utf8" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" ) // ErrNotValid represents an validation error diff --git a/modules/validation/validatable_test.go b/modules/validation/validatable_test.go index 0802d5cc92..919f5a3183 100644 --- a/modules/validation/validatable_test.go +++ b/modules/validation/validatable_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" ) type Sut struct { diff --git a/modules/validation/validurl_test.go b/modules/validation/validurl_test.go index 77fa7aa097..39f7fa5d65 100644 --- a/modules/validation/validurl_test.go +++ b/modules/validation/validurl_test.go @@ -6,7 +6,7 @@ package validation import ( "testing" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) var urlValidationTestCases = []validationTestCase{ diff --git a/modules/validation/validurllist_test.go b/modules/validation/validurllist_test.go deleted file mode 100644 index 506f96da69..0000000000 --- a/modules/validation/validurllist_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// 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 4a7f28b1fa..728cc5a160 100644 --- a/modules/web/handler.go +++ b/modules/web/handler.go @@ -9,9 +9,9 @@ import ( "net/http" "reflect" - "forgejo.org/modules/log" - "forgejo.org/modules/web/routing" - "forgejo.org/modules/web/types" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/web/routing" + "code.gitea.io/gitea/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 9083e9b485..8fa71a81bd 100644 --- a/modules/web/middleware/binding.go +++ b/modules/web/middleware/binding.go @@ -8,12 +8,12 @@ import ( "reflect" "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // Form form binding interface @@ -143,8 +143,6 @@ 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 3bfaeabe69..f2d25f5b1c 100644 --- a/modules/web/middleware/cookie.go +++ b/modules/web/middleware/cookie.go @@ -9,8 +9,8 @@ import ( "net/url" "strings" - "forgejo.org/modules/session" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/session" + "code.gitea.io/gitea/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 4603e64052..08d83f94be 100644 --- a/modules/web/middleware/data.go +++ b/modules/web/middleware/data.go @@ -7,7 +7,7 @@ import ( "context" "time" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) // ContextDataStore represents a data store diff --git a/modules/web/middleware/locale.go b/modules/web/middleware/locale.go index 565fb2f502..34a16f04e7 100644 --- a/modules/web/middleware/locale.go +++ b/modules/web/middleware/locale.go @@ -6,8 +6,8 @@ package middleware import ( "net/http" - "forgejo.org/modules/translation" - "forgejo.org/modules/translation/i18n" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/translation/i18n" "golang.org/x/text/language" ) @@ -26,10 +26,8 @@ func Locale(resp http.ResponseWriter, req *http.Request) translation.Locale { } } - if lang == "dummy" { - changeLang = false - } else if lang != "" && !i18n.DefaultLocales.HasLang(lang) { - // Check again in case someone changes the supported language list. + // Check again in case someone changes the supported language list. + if lang != "" && !i18n.DefaultLocales.HasLang(lang) { lang = "" changeLang = false } @@ -53,3 +51,9 @@ 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 046c9f4ba7..805fcb4411 100644 --- a/modules/web/route.go +++ b/modules/web/route.go @@ -7,9 +7,9 @@ import ( "net/http" "strings" - "forgejo.org/modules/web/middleware" + "code.gitea.io/gitea/modules/web/middleware" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" "github.com/go-chi/chi/v5" ) diff --git a/modules/web/routemock.go b/modules/web/routemock.go index 33d2ad06eb..cb41f63b91 100644 --- a/modules/web/routemock.go +++ b/modules/web/routemock.go @@ -6,7 +6,7 @@ package web import ( "net/http" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 43d4b28830..cd99b99323 100644 --- a/modules/web/routemock_test.go +++ b/modules/web/routemock_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/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 8fd24c9733..5f3a7592af 100644 --- a/modules/web/routing/logger.go +++ b/modules/web/routing/logger.go @@ -8,8 +8,8 @@ import ( "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/web/types" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/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/") || req.RequestURI == "/api/actions/runner.v1.RunnerService/FetchTask" || req.RequestURI == "/api/actions/runner.v1.RunnerService/UpdateLog" { + if strings.HasPrefix(req.RequestURI, "/assets/") { logf = logger.Trace } message := completedMessage diff --git a/modules/web/routing/logger_manager.go b/modules/web/routing/logger_manager.go index 4b12419b44..aa25ec3a27 100644 --- a/modules/web/routing/logger_manager.go +++ b/modules/web/routing/logger_manager.go @@ -9,8 +9,8 @@ import ( "sync" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/process" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/process" ) // Event indicates when the printer is triggered diff --git a/options/gitignore/Flutter b/options/gitignore/Flutter deleted file mode 100644 index 39b8814aec..0000000000 --- a/options/gitignore/Flutter +++ /dev/null @@ -1,119 +0,0 @@ -# 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 912e6700f4..1fd04ef1f6 100644 --- a/options/gitignore/Nix +++ b/options/gitignore/Nix @@ -1,6 +1,3 @@ # 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 deleted file mode 100644 index 4eff01dae1..0000000000 --- a/options/gitignore/NotesAndCoreConfiguration +++ /dev/null @@ -1,16 +0,0 @@ -# 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 deleted file mode 100644 index 3e0804f299..0000000000 --- a/options/gitignore/NotesAndExtendedConfiguration +++ /dev/null @@ -1,38 +0,0 @@ -# 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 deleted file mode 100644 index 2b3b76ee0e..0000000000 --- a/options/gitignore/NotesOnly +++ /dev/null @@ -1,4 +0,0 @@ -# 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 748837a058..236ae6be8c 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 b7b3a0c883..0efbdc6c92 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -957,7 +957,7 @@ settings.recent_deliveries = التوصيل الأخيرة projects.new = مشروع جديد file_history = تاريخ editor.directory_is_a_file = اسم المجلد "%s" مستخدم ÙØ¹Ù„ا لاسم مل٠ÙÙŠ هذا المستودع. -editor.commit_directly_to_this_branch = أودع مباشرةً إلى ÙØ±Ø¹ %[1]s. +editor.commit_directly_to_this_branch = أودع مباشرةً إلى ÙØ±Ø¹ %s. editor.unable_to_upload_files = تعذر Ø±ÙØ¹ Ø§Ù„Ù…Ù„ÙØ§Øª إلى "%s" برسالة الخطأ: %v settings.webhook.payload = المحتوى invisible_runes_header = `يحتوي هذا المل٠على محار٠يونيكود غير مرئية` @@ -1017,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 = أض٠'<%s>' +editor.add_tmpl = أض٠'' editor.new_branch_name_desc = اسم Ø§Ù„ÙØ±Ø¹ الجديد… release = إصدار editor.delete_this_file = احذ٠المل٠@@ -1990,4 +1990,4 @@ branch_kind = البحث ضمن Ø§Ù„ÙØ±ÙˆØ¹... no_results = لا توجد نتائج مطابقة. issue_kind = البحث ضمن الأعطال... pull_kind = البحث ضمن طلبات السحب... -keyword_search_unavailable = البحث من خلال الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ© ليس Ù…ØªÙˆÙØ± حالياً. رجاءاً تواصل مع مشر٠الموقع. +keyword_search_unavailable = البحث من خلال الكلمات Ø§Ù„Ù…ÙØªØ§Ø­ÙŠØ© ليس Ù…ØªÙˆÙØ± حالياً. رجاءاً تواصل مع مشر٠الموقع. \ No newline at end of file diff --git a/options/locale/locale_be.ini b/options/locale/locale_be.ini index fe04dadc3e..f9d8e738c3 100644 --- a/options/locale/locale_be.ini +++ b/options/locale/locale_be.ini @@ -1,3 +1,6 @@ + + + [common] dashboard = ПанÑль ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ explore = ÐглÑд diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index 6fc4b55eae..ca11b20ff2 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -1,3 +1,195 @@ + + + +[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 +generic.download = Изтеглете пакета от ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´: + +[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 = Отказ @@ -111,202 +303,6 @@ 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 = Редактиране @@ -404,7 +400,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 = Само притежателÑÑ‚ или учаÑтниците в организациÑта, ако имат права, ще могат да го видÑÑ‚. @@ -431,14 +427,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 = Да Ñе инициализира хранилище +auto_init = Да Ñе инициализира хранилище (Ð”Ð¾Ð±Ð°Ð²Ñ .gitignore, License и README) template.issue_labels = Етикети за задачите migrate_items_labels = Етикети issues.label_templates.title = Зареждане на предв. зададен набор от етикети @@ -822,7 +818,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 @@ -838,8 +834,7 @@ file_too_large = Файлът е твърде голÑм, за да бъде п commits = ÐŸÐ¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ commit = Подаване editor.commit_changes = Подаване на промените -editor.add_tmpl = ДобавÑне на "<%s>" -editor.add_tmpl.filename = име на файла +editor.add_tmpl = ДобавÑне на "<име на файла>" editor.add = ДобавÑне на %s editor.delete = Изтриване на %s editor.update = ОбновÑване на %s @@ -851,7 +846,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 = Подаване директно към клона %[1]s. +editor.commit_directly_to_this_branch = Подаване директно към клона %s. editor.branch_already_exists = Клонът „%s“ вече ÑъщеÑтвува в това хранилище. editor.file_already_exists = Файл Ñ Ð¸Ð¼Ðµ „%s“ вече ÑъщеÑтвува в това хранилище. editor.commit_empty_file_header = Подаване на празен файл @@ -946,7 +941,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 = Изтриване на клона @@ -1002,7 +997,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 = ПоÑледна дейноÑÑ‚ @@ -1022,7 +1017,7 @@ 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 = Ðе Ñте упълномощени за Ñливане на тази заÑвка за Ñливане. @@ -1120,7 +1115,7 @@ pulls.reject_count_1 = %d поиÑкана промÑна issues.review.show_resolved = Показване на решено issues.review.hide_resolved = Скриване на решено issues.review.resolve_conversation = Решаване на обÑъждането -diff.comment.markdown_info = Поддържа Ñе Ñтилизиране Ñ ÐœÐ°Ñ€ÐºÐ´Ð°ÑƒÐ½. +diff.comment.markdown_info = Поддържа Ñе Ñтилизиране Ñ markdown. diff.file_suppressed = Разликите не Ñа показани, защото Ñа твърде много pulls.reject_count_n = %d поиÑкани промени settings.pulls.default_allow_edits_from_maintainers = ПозволÑване на редакции от поддържащите по подразбиране @@ -1202,94 +1197,6 @@ 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 = Потвърждаване @@ -1313,12 +1220,6 @@ 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 = ПиÑане @@ -1350,7 +1251,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 = Пълно име на организациÑта @@ -1431,9 +1332,6 @@ 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 = Ð - Я @@ -1465,14 +1363,6 @@ 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 @@ -1504,9 +1394,6 @@ 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 = Други филтри @@ -1776,10 +1663,6 @@ 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 = По-малко @@ -1815,7 +1698,6 @@ code_frequency.what = чеÑтота на промените [projects] type-1.display_name = Индивидуален проект -deleted.display_name = Изтрит проект [search] @@ -1850,4 +1732,4 @@ eib = ЕиБ [translation_meta] -test = окей +test = окей \ No newline at end of file diff --git a/options/locale/locale_bn.ini b/options/locale/locale_bn.ini index 2155f9073c..8741fee98c 100644 --- a/options/locale/locale_bn.ini +++ b/options/locale/locale_bn.ini @@ -1,8 +1,6 @@ + + + [common] help = সাহাযà§à¦¯ -dashboard = ডà§à¦¯à¦¾à¦¶à¦¬à§‹à¦°à§à¦¡ -home = বাড়ি -explore = দেখোণ -logo = লোগো -sign_in = সাইণ ইণ -sign_in_or = বা \ No newline at end of file +dashboard = ডà§à¦¯à¦¾à¦¶à¦¬à§‹à¦°à§à¦¡ \ No newline at end of file diff --git a/options/locale/locale_bs.ini b/options/locale/locale_bs.ini index 78eb7daa33..bec7a65005 100644 --- a/options/locale/locale_bs.ini +++ b/options/locale/locale_bs.ini @@ -1,3 +1,6 @@ + + + [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 9cb7d5e50c..8b2d944253 100644 --- a/options/locale/locale_ca.ini +++ b/options/locale/locale_ca.ini @@ -1,10 +1,13 @@ + + + [common] -home = Inici +home = inici dashboard = Panell de control explore = Explorar help = Ajuda logo = Logo -sign_in = Iniciar sessió +sign_in = Entrar sign_in_with_provider = Entra amb %s sign_in_or = o sign_out = Sortir @@ -15,7 +18,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 @@ -115,7 +118,7 @@ write = Escriure preview = Previsualitzar loading = Carregant… error = Error -error404 = La pàgina a la qual estàs intentant arribar no existeix, ha sigut eliminada o no estàs autoritzat a veure-la. +error404 = La pàgina a la que estàs intentant arribar no existeix o no estàs autoritzat a veure-la. go_back = Tornar Enrere invalid_data = Dades invalides: %v unknown = Desconegut @@ -139,13 +142,6 @@ 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... @@ -173,8 +169,6 @@ 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 @@ -213,7 +207,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 SMTP +smtp_addr = Hoste SMPT smtp_port = Port SMPT smtp_from = Enviar correu com a mailer_user = Nom d'usuari SMTP @@ -345,74 +339,6 @@ 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 @@ -431,16 +357,6 @@ 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 @@ -468,19 +384,4 @@ filter = Altres filtres footer.software = Sobre aquest software footer.links = Enllaços navbar = Barra de navegació -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 +footer = Peu de pàgina \ No newline at end of file diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index cd28012f94..ab977f5b60 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -4,7 +4,7 @@ dashboard=PÅ™ehled explore=Procházet help=NápovÄ›da logo=Logo -sign_in=PÅ™ihlásit se +sign_in=PÅ™ihlášení sign_in_with_provider = PÅ™ihlásit se pÅ™es %s sign_in_or=nebo sign_out=Odhlásit se @@ -112,7 +112,7 @@ preview=Náhled loading=NaÄítání… error=Chyba -error404=Stránka, kterou se snažíte zobrazit, buÄ neexistuje, byla odstranÄ›na nebo nemáte oprávnÄ›ní ji zobrazit. +error404=Stránka, kterou se snažíte zobrazit, buÄ neexistuje, nebo nemáte oprávnÄ›ní ji zobrazit. go_back=ZpÄ›t never=Nikdy @@ -165,7 +165,6 @@ 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 @@ -199,16 +198,6 @@ 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 @@ -224,7 +213,7 @@ network_error=Chyba sítÄ› server_internal = Interní chyba serveru [startpage] -app_desc=Jednoduchá, samostatnÄ› hostovatelná služba Git +app_desc=Bezproblémová 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í @@ -521,8 +510,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=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.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.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. @@ -594,9 +583,9 @@ AuthName=Název ověření AdminEmail=E-mailová adresa správce NewBranchName=Název nové vÄ›tve -CommitSummary=Shrnutí revize -CommitMessage=Zpráva revize -CommitChoice=VýbÄ›r revize +CommitSummary=Shrnutí commity +CommitMessage=Zpráva commitu +CommitChoice=VýbÄ›r commitu TreeName=Cesta k souboru Content=Obsah @@ -656,8 +645,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=NepodaÅ™ilo se ověřit váš klÃ­Ä SSH: %s -invalid_gpg_key=NepodaÅ™ilo se ověřit váš klÃ­Ä GPG: %s +invalid_ssh_key=Nelze ověřit váš SSH klíÄ: %s +invalid_gpg_key=Nelze ověřit váš GPG klíÄ: %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. @@ -684,8 +673,6 @@ 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… @@ -698,7 +685,7 @@ watched=Sledované repozitáře code=Kód projects=Projekty overview=PÅ™ehled -following_few=%d sledovaných +following_few=%d sledovaní follow=Sledovat unfollow=PÅ™estat sledovat user_bio=Životopis @@ -720,7 +707,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 sledovaný +following_one = %d následuje followers.title.one = Sledující followers.title.few = Sledující following.title.one = Sleduje @@ -751,9 +738,9 @@ uid=UID webauthn=Dvoufázové ověření (bezpeÄnostní klíÄe) public_profile=VeÅ™ejný profil -biography_placeholder=ŘeknÄ›te ostatním nÄ›co o sobÄ›! (Je podporován Markdown) +biography_placeholder=ŘeknÄ›te nám nÄ›co o sobÄ›! (Můžete použít Markdown) location_placeholder=Sdílejte svou pÅ™ibližnou polohu s ostatními -profile_desc=O vás +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. 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 @@ -773,7 +760,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 @@ -3753,7 +3670,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 @@ -3764,7 +3681,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 @@ -3868,15 +3785,6 @@ 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 @@ -3995,9 +3903,6 @@ 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 @@ -4016,32 +3921,32 @@ submodule=Sous-module [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ôts… -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ôt... +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 @@ -4082,4 +3987,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t pulls.read = Lire : Lire et créer des demandes de tirage. [translation_meta] -test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion. :-) +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 :) \ No newline at end of file diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini deleted file mode 100644 index d2d960b627..0000000000 --- a/options/locale/locale_ga-IE.ini +++ /dev/null @@ -1,2996 +0,0 @@ -[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 75763775eb..dab320ddd5 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -8,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 = Rexistrarse -link_account = Vincular conta +sign_up = Rexístrate +link_account = Vincular Conta register = Rexistro -version = Versión -powered_by = Impulsado por %s +version = Vesión +powered_by = Desenvolvido por %s page = Páxina template = Modelo notifications = Notificacións -active_stopwatch = Rastreador de tempo activo +active_stopwatch = Activar Rastrexador de Tempo create_new = Crear… -user_profile_and_more = Perfil e configuración… -signed_in_as = Sesión iniciada como +user_profile_and_more = Perfil e Configuración… +signed_in_as = Inicia Sesión como enable_javascript = Este sitio web require JavaScript. toc = Táboa de Contidos licenses = Licenzas @@ -29,17 +29,17 @@ email = Enderezo Electrónico password = Contrasinal re_type = Confirme o contrasinal captcha = CAPTCHA -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… +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… webauthn_use_twofa = Use o Código de Dous Factores do seu Teléfono -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_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_reload = Recarga repository = Repositorio organization = Organización @@ -49,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 da páxina +admin_panel = Administración do Sitio account_settings = Axustes da Conta settings = Configuración your_profile = Perfil your_starred = Destacado -your_settings = Configuración +your_settings = Configuracións all = Todo sources = Fontes mirrors = Espellos collaborative = Colaborativo forks = Derivacións -pull_requests = Solicitudes de fusión +pull_requests = Pull Requests milestones = Fitos ok = OK cancel = Cancelar @@ -71,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á seguro de querer eliminar o artefacto "%s"? +confirm_delete_artifact = Estás seguro de que queres 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 = 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 +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 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 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. +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. remove = Quitar -view = Ver +view = Vista copy_type_unsupported = Este tipo de ficheiro non se pode copiar concept_user_organization = Organización -show_timestamps = Mostrar marcas de tempo -show_log_seconds = Mostrar segundos -download_logs = Descargar rexistros +show_timestamps = Mostrar M0arcas de Tempo +show_log_seconds = Mostrar Segundos +download_logs = Descargar Rexistros name = Nome value = Valor -confirm_delete_selected = Confirmar a eliminación de tódolos elementos seleccionados? +confirm_delete_selected = Confirmar a eliminación de todos os elementos seleccionados? show_full_screen = Mostrar Pantalla Completa -more_items = Máis elementos -toggle_menu = Alternar menú +more_items = Máis items +toggle_menu = Alternar Menú filter = Filtro filter.clear = Borrar filtros filter.is_archived = Arquivado @@ -140,14 +140,6 @@ 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 @@ -162,7 +154,6 @@ 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 @@ -175,56 +166,20 @@ 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 procura +type_tooltip = Tipo de busca 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 Docker ou consígueo empaquetado. -license = Código aberto [error] occurred = Ocorreu un erro @@ -268,26 +223,4 @@ 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 -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 +federated_avatar_lookup = Activar avatares federados \ No newline at end of file diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini deleted file mode 100644 index bff7682a95..0000000000 --- a/options/locale/locale_he.ini +++ /dev/null @@ -1,666 +0,0 @@ - - - -[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 59f66b4d0f..695fd3a9fa 100644 --- a/options/locale/locale_hi.ini +++ b/options/locale/locale_hi.ini @@ -1,3 +1,6 @@ + + + [common] dashboard = नियंतà¥à¤°à¤£ ककà¥à¤· home = मà¥à¤–à¥à¤¯ पृषà¥à¤  @@ -21,22 +24,4 @@ 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 +user_profile_and_more = पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² और सेटिंगà¥à¤¸â€¦ \ No newline at end of file diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index ea8732f422..69496f86d2 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -203,6 +203,7 @@ not_found = A cél nem található. 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ú @@ -383,6 +384,7 @@ 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 @@ -810,9 +812,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='<%s>' hozzáadása +editor.add_tmpl='' 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) %[1]s ágba. +editor.commit_directly_to_this_branch=Mentés egyenesen a(z) %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… @@ -1033,7 +1035,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 @@ -1272,8 +1274,6 @@ topic.done=Kész -milestones.filter_sort.name = Név - [graphs] [org] @@ -1688,9 +1688,6 @@ 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 @@ -1754,6 +1751,9 @@ owner.settings.cleanuprules.enabled=Engedélyezett [secrets] [actions] + + + runners.name=Név runners.owner_type=Típus runners.description=Leírás @@ -1770,6 +1770,7 @@ 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 @@ -1800,4 +1801,4 @@ 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. +keyword_search_unavailable = A kulcsszó alapú keresés jelenleg nem elérhetÅ‘. Kérlek értesítsd az oldal rendszergazdáját. \ No newline at end of file diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index fc9d934ce6..34f23f5661 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -84,98 +84,21 @@ 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 @@ -202,9 +125,6 @@ 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 @@ -222,8 +142,6 @@ show_private=Pribadi issues.in_your_repos=Dalam repositori anda -show_archived = Diarsipkan - [explore] repos=Repositori users=Pengguna @@ -289,6 +207,7 @@ authorization_failed=Otorisasi gagal sspi_auth_failed=Autentikasi SSPI gagal [mail] + activate_account=Silakan aktifkan akun anda activate_email=Verifikasi alamat surel anda @@ -575,8 +494,6 @@ email_notifications.submit=Pasang Pengaturan Email visibility.private=Pribadi -visibility.public = Publik - [repo] owner=Pemilik repo_name=Nama Repositori @@ -706,9 +623,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 '<%s>' +editor.add_tmpl=Tambahkan '' editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang… -editor.commit_directly_to_this_branch=Komitmen langsung ke %[1]s cabang. +editor.commit_directly_to_this_branch=Komitmen langsung ke %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 @@ -837,7 +754,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 @@ -1042,12 +959,6 @@ 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] @@ -1102,8 +1013,6 @@ 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 @@ -1362,9 +1271,6 @@ 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 @@ -1428,6 +1334,9 @@ owner.settings.cleanuprules.enabled=Aktif [secrets] [actions] + + + runners.name=Nama runners.owner_type=Jenis runners.description=Deskripsi @@ -1440,56 +1349,8 @@ 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] -changed_filemode = %[1]s → %[2]s -directory = Directory -normal_file = Normal file -executable_file = Executable file -symbolic_link = Symbolic link -submodule = Submodule +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … -[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 9c39b9d830..a9cd1e6190 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -114,10 +114,6 @@ 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] [heatmap] @@ -137,6 +133,7 @@ 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 @@ -703,7 +700,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ð „<%s>“ +editor.add_tmpl=Bæta við „“ 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… @@ -895,7 +892,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 @@ -1123,8 +1120,6 @@ topic.done=à lagi -milestones.filter_sort.name = Heiti - [graphs] [org] @@ -1294,9 +1289,6 @@ 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` @@ -1362,6 +1354,9 @@ pypi.requires=Þarfnast Python [secrets] [actions] + + + runners.id=Auðkenni runners.name=Heiti runners.owner_type=Tegund @@ -1381,5 +1376,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 3c5e834260..818e2892d1 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -166,7 +166,6 @@ 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 @@ -200,15 +199,6 @@ 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 @@ -227,10 +217,11 @@ 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 più bello. Non aver paura di diventare collaborante! +license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora migliore. Non aver paura di diventare un collaboratore! install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto. [install] @@ -517,15 +508,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 immesso %[3]d commit presso %[2]s +issue.action.push_n=@%[1]s ha spinto %[3]d commit a %[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 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.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.new=@%[1]s creato #%[2]d. issue.in_tree_path=In %s: @@ -542,8 +533,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 collaborante -repo.collaborator.added.text=Sei statÉ™ aggiuntÉ™ come collaborante al repositorio: +repo.collaborator.added.subject=%s ti ha aggiunto a %s come collaboratorÉ™ +repo.collaborator.added.text=Sei statÉ™ aggiuntÉ™ come collaboratorÉ™ 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 @@ -700,7 +691,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 collaboranti del repositorio. +block_user.detail_3 = Non sarete in grado di aggiungervi come collaboratorÉœ del repositorio. code = Codice block = Blocca unblock = Sblocca @@ -770,9 +761,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=Commit aggiunti +comment_type_group_pull_request_push=Aggiunti commit comment_type_group_project=Progetto -comment_type_group_issue_ref=Riferimento alla segnalazione +comment_type_group_issue_ref=Riferimento del problema 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 @@ -807,7 +798,7 @@ activate_email=Invia Attivazione activations_pending=Attivazioni in sospeso delete_email=Rimuovi email_deletion=Rimuovi indirizzo Email -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_desc=L'indirizzo email e le relativa informazioni verranno rimosse dal tuo account. I Git commits di questa email 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. @@ -1009,7 +1000,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. @@ -1039,7 +1030,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 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. +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. 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 @@ -1199,7 +1190,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. +migrate.gitea.description=Migrare i dati da gitea.com o altre istanze di Gitea/Forgejo. 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. @@ -1310,13 +1301,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 "<%s>" +editor.add_tmpl=Aggiungi "" 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 %[1]s. +editor.commit_directly_to_this_branch=Fai un commit direttamente sul ramo %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 @@ -1350,8 +1341,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 committente +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.gpg_key_id=ID chiave GPG commits.ssh_key_fingerprint=Impronta chiave SSH @@ -1412,18 +1403,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=Nessun traguardo -issues.new.clear_milestone=Rimuovi traguardo +issues.new.no_milestone=Nessuna pietra miliare +issues.new.clear_milestone=Milestone pulita 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=Comincia +issues.choose.get_started=Cominciare issues.choose.open_external_link=Apri issues.choose.blank=Default -issues.choose.blank_about=Crea una segnalazione dal modello predefinito. +issues.choose.blank_about=Crea un problema dal modello predefinito. issues.no_ref=Nessun ramo/etichetta specificati issues.create=Crea segnalazione issues.new_label=Nuova etichetta @@ -1441,7 +1432,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=`ha modificato il traguardo da %s a %s %s` +issues.change_milestone_at=`pietra miliare modificata 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` @@ -1489,19 +1480,19 @@ issues.filter_sort.fewestforks=Minor numero di fork issues.action_open=Apri issues.action_close=Chiuso issues.action_label=Etichetta -issues.action_milestone=Traguardo -issues.action_milestone_no_select=Nessun Traguardo +issues.action_milestone=Pietra Miliare +issues.action_milestone_no_select=Nessuna pietra miliare 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 è stata fusa %[1]s -pulls.merged_by_fake=di %[2]s è stata fusa %[1]s +pulls.merged_by=di %[3]s è stato fuso %[1]s +pulls.merged_by_fake=di %[2]s è stato fuso %[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=Aperte +issues.open_title=Aperta issues.closed_title=Chiuso issues.draft_title=Bozza issues.num_comments=%d commenti @@ -1516,14 +1507,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=`ha chiuso questa segnalazione %[2]s` +issues.closed_at=`chiuso questo probleam %[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 questa segnalazione %[4]s %[2]s` +issues.ref_closed_from=`chiuso questo problema %[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 @@ -1561,32 +1552,32 @@ issues.subscribe=Iscriviti issues.unsubscribe=Annulla iscrizione issues.lock=Blocca conversazione issues.unlock=Sblocca conversazione -issues.lock.unknown_reason=Impossibile bloccare una segnalazione senza un motivo. +issues.lock.unknown_reason=Impossibile bloccare un problema con un motivo sconosciuto. issues.lock_duplicate=Un issue non può essere bloccato due volte. -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_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_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 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.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.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 una segnalazione bloccata. +issues.comment_on_locked=Non puoi commentare un problema bloccato. issues.delete=Elimina -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.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.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à fermato automaticamente quando questa segnalazione verrà chiusa -issues.tracking_already_started=`Hai già avviato il monitoraggio del tempo su un'altra segnalazione!` +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.stop_tracking=Ferma timer issues.stop_tracking_history=`ha smesso di funzionare %s` issues.cancel_tracking=Scarta @@ -1607,7 +1598,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 @@ -1632,16 +1623,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=Vanno chiuse tutte le segnalazioni che bloccano quest'ultima, prima di poterla chiudere. +issues.dependency.issue_close_blocked=Devi chiudere tutte le anomalie che bloiccano questo problema prima di chiudelo. 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 richiesta di modifica. Continuare? +issues.dependency.pr_remove_text=Questo rimuoverà la dipendenza da questa pull request. Continuare? issues.dependency.setting=Abilita le dipendenze per segnalazioni e richieste di modifica -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_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_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. @@ -1683,7 +1674,7 @@ issues.reference_link=Riferimento: %s compare.compare_base=base compare.compare_head=confronta -pulls.desc=Attiva richieste di modifica e revisioni del codice. +pulls.desc=Attiva pull request e revisioni di codice. pulls.new=Nuova richiesta di modifica pulls.view=Visualizza richiesta di modifica pulls.compare_changes=Nuova richiesta di modifica @@ -1704,23 +1695,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 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.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.merged=Unito pulls.manually_merged=Unito manualmente -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.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.still_in_progress=Ancora in corso? pulls.add_prefix=Aggiungi prefisso %s pulls.remove_prefix=Rimuovi il prefisso %s -pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione. +pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork. 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. @@ -1728,8 +1719,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 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.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.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 @@ -1741,20 +1732,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 richiesta di modifica non può essere fusa perché tutte le opzioni di fusione del repositorio sono disattivate. +pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository 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 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.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.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 è possibile utilizzare l'opzione di fusione selezionata per questa richiesta di modifica. +pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request. 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 @@ -1778,12 +1769,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=`ha chiuso questa richiesta di modifica %[2]s` -pulls.reopened_at=`ha riaperto questa richiesta di modifica %[2]s` +pulls.closed_at=`chiusa questa pull request %[2]s` +pulls.reopened_at=`riaperta questa pull request %[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 richiesta di modifica era programmata per essere fusa al passare di tutti i controlli. +pulls.auto_merge_newly_scheduled=La pull request era programmata per unire quando tutti i controlli sono superati. 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 @@ -1793,8 +1784,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 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) +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) @@ -1828,8 +1819,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 lÉœ collaboranti. -wiki.desc=Scrivi e condividi documentazione con lÉœ collaboranti. +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.create_first_page=Crea la prima pagina wiki.page=Pagina wiki.filter_page=Filtra pagina @@ -1878,7 +1869,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 chiuse da %s +activity.title.issues_closed_from=%s chiusa da %s activity.title.issues_created_by=%s creata da %s activity.closed_issue_label=Chiusa activity.new_issues_count_1=Nuova segnalazione @@ -1927,7 +1918,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=Collaboranti +settings.collaboration=Collaboratori settings.collaboration.admin=Amministratore settings.collaboration.write=Scrittura settings.collaboration.read=Lettura @@ -2021,14 +2012,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=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.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.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=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.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.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. @@ -2037,21 +2028,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 repositorio %s, inclusi codice, segnalazioni commenti, dati della wiki e impostazioni collaboranti. +settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repository %s inclusi codice, issue, commenti, dati wiki e impostazioni collaboratore. 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 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.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.delete_collaborator=Rimuovi -settings.collaborator_deletion=Rimuovi collaborante -settings.collaborator_deletion_desc=Rimuovere unÉ™ collaborante ne revocherà l'accesso a questo repositorio. Continuare? -settings.remove_collaborator_success=LÉ™ collaborante è statÉ™ rimossÉ™. +settings.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.search_user_placeholder=Ricerca utente… -settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come collaborante. +settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come un collaboratore. 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 @@ -2123,7 +2114,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=Richiesta di modifica aperta, chiusa, riaperta o modificata. +settings.event_pull_request_desc=Pull request 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 @@ -2421,7 +2412,7 @@ actions = Azioni commit.operations = Operazioni issues.action_check = Seleziona/Deseleziona issues.close = Chiudi segnalazione -issues.role.collaborator = Collaborante +issues.role.collaborator = Collaboratore desc.sha256 = SHA256 editor.add = Aggiungi %s editor.update = Aggiorna %s @@ -2464,7 +2455,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 lÉ™ collaborante perché ha bloccato lÉ™ proprietariÉ™ del progetto. +settings.add_collaborator_blocked_them = Non si può aggiungere il collaboratore perché ha bloccato il proprietario del progetto. branch.protected_deletion_failed = Il ramo "%s" è protetto. Non può essere eliminato. branch.default_deletion_failed = Il ramo "%s" è il ramo predefinito. Non può essere eliminato. branch.tag_collision = Il ramo "%s" non può essere creato perché esiste già un'etichetta con lo stesso nome nel repositorio. @@ -2578,7 +2569,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 lÉ™ collaborante perché lÉ™ proprietariÉ™ del progetto l'ha bloccatÉ™. +settings.add_collaborator_blocked_our = Non si può aggiungere il collaboratore perché il proprietario del progetto lo ha bloccato. 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 @@ -2621,7 +2612,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 = Quest*utente è statÉ™ invitatÉ™ a collaborare al progetto. +issues.role.collaborator_helper = Questo utente è stato invitato a collaborare sul 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 @@ -2673,7 +2664,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É™ proprietariÉ™ come collaborante. +settings.add_collaborator_owner = Non si può aggiungere un proprietario come collaboratore. 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. @@ -2751,7 +2742,7 @@ 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 %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. @@ -2792,9 +2783,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 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 +issues.edit.already_changed = Impossibile salvare le modifiche al problema. Sembra che il contenuto sia già stato modificato da un altro utente. Aggiornare la pagina e provare a modificare nuovamente per evitare di sovrascrivere le modifiche subscribe.pull.guest.tooltip = Accedi per iscriverti a questa richiesta di modifica. -subscribe.issue.guest.tooltip = Accedere per seguire questa segnalazione. +subscribe.issue.guest.tooltip = Accedere per sottoscrivere questo problema. n_release_one = rilascio %s n_release_few = rilasci %s issues.author.tooltip.pr = Quest'utente è l'autorÉ™ di questa richiesta di modifica. @@ -2811,7 +2802,6 @@ 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 @@ -2902,7 +2892,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 prelevare e immettere sui repositori del team e aggiungere collaboranti. +teams.admin_access_helper=I membri possono pullare e pushare sulle repository del team e anche aggiungere collaboratori. 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. @@ -2915,7 +2905,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 Amministrante: i membri possono leggere da, immettere in e aggiungere collaboranti ai repositori 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.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… @@ -3234,7 +3224,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.Passport 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. assport 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 @@ -3476,13 +3466,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 = Non c'è ancora nessuna segnalazione. +self_check.no_problem_found = Nessun problema trovato. 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 "forgejo 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 "gitea 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 @@ -3494,14 +3484,13 @@ 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 la segnalazione %[3]s#%[2]s` +close_issue=`ha chiuso il problema %[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` @@ -3756,6 +3745,9 @@ creation.success = Il segreto "%s" è stato aggiungo. deletion.success = Il segreto è stato rimosso. [actions] + + + runners.id=ID runners.name=Nome runners.owner_type=Tipo @@ -3860,6 +3852,7 @@ 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 @@ -3895,9 +3888,6 @@ 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 @@ -3911,9 +3901,4 @@ 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 - - -[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 +filepreview.line = Linea %[1]d in %[2]s \ No newline at end of file diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 32caac1371..ec69bda54e 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -167,8 +167,6 @@ new_org.link = æ–°ã—ã„組織 test = テスト error413 = 割り当ã¦é‡ã‚’使ã„切りã—ã¾ã—ãŸã€‚ -copy_path = パスをコピー - [aria] navbar=ナビゲーションãƒãƒ¼ footer=フッター @@ -220,6 +218,7 @@ app_desc=自分ã§ç«‹ã¦ã‚‹ã€è¶…ç°¡å˜ Git サービス install=ç°¡å˜ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« install_desc=シンプルã«ã€ãƒ—ラットフォームã«å¿œã˜ã¦ãƒã‚¤ãƒŠãƒªã‚’実行ã—ãŸã‚Šã€Dockerã§å‹•ã‹ã—ãŸã‚Šã€ãƒ‘ッケージを使ã†ã ã‘。 platform=クロスプラットフォーム +platform_desc=Forgejoã¯Goã§ã‚³ãƒ³ãƒ‘イルã§ãる環境ãªã‚‰ã©ã“ã§ã‚‚å‹•ãã¾ã™: Windowsã€macOSã€Linuxã€ARM等々ã€å¥½ããªã‚‚ã®ã‚’é¸ã‚“ã§ãã ã•ã„! lightweight=è»½é‡ lightweight_desc=Forgejo ã®æœ€å°å‹•作è¦ä»¶ã¯å°ã•ãã¦ã€å®‰ä¾¡ãª Raspberry Pi ã§ã‚‚å‹•ãã¾ã™ã€‚エãƒãƒ«ã‚®ãƒ¼æ¶ˆè²»ã‚’節約ã—ã¾ã—ょã†! license=オープンソース @@ -660,9 +659,10 @@ 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"ã‹ã‚‰å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ @@ -934,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=許å¯: @@ -1159,7 +1159,8 @@ desc.public=公開 desc.template=テンプレート desc.internal=組織内 desc.archived=アーカイブ -desc.sha256 = SHA256 +desc.sha256=SHA256 + template.items=テンプレート項目 template.git_content=Gitコンテンツ (デフォルトブランãƒ) template.git_hooks=Gitフック @@ -1219,7 +1220,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 インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ +migrate.gitea.description=gitea.com ã‚„ãã®ä»–ã® Gitea/Forgejo インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.gogs.description=notabug.org ã‚„ãã®ä»–ã® Gogs インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.onedev.description=code.onedev.io ã‚„ãã®ä»–ã® OneDev インスタンスã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ migrate.codebase.description=codebasehq.com ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’移行ã—ã¾ã™ã€‚ @@ -1346,8 +1347,7 @@ editor.or=ã¾ãŸã¯ editor.cancel_lower=キャンセル editor.commit_signed_changes=ç½²åã—ãŸå¤‰æ›´ã‚’コミット editor.commit_changes=変更をコミット -editor.add_tmpl="<%s>" を追加 -editor.add_tmpl.filename = ファイルå +editor.add_tmpl="<ファイルå>" を追加 editor.add=%s を追加 editor.update=%s ã‚’æ›´æ–° editor.delete=%s を削除 @@ -1357,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=ブランãƒ%[1]sã¸ç›´æŽ¥ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ +editor.commit_directly_to_this_branch=ブランãƒ%sã¸ç›´æŽ¥ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ editor.create_new_branch=æ–°ã—ã„ブランãƒã«ã‚³ãƒŸãƒƒãƒˆã—ã¦ãƒ—ルリクエストを作æˆã™ã‚‹ã€‚ editor.create_new_branch_np=æ–°ã—ã„ブランãƒã«ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã€‚ editor.propose_file_change=ãƒ•ã‚¡ã‚¤ãƒ«ä¿®æ­£ã‚’ææ¡ˆ @@ -1723,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=期日ã®è¿½åŠ  @@ -1838,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=会話 @@ -2450,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=ä¿è­·ã•れãŸãƒ•ァイルã¯ã€ã“ã®ãƒ–ランãƒã«ãƒ•ァイルを追加・編集・削除ã™ã‚‹æ¨©é™ã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã£ã¦ã‚‚ã€ç›´æŽ¥å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚ セミコロン(';')ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ‘ターンを指定ã§ãã¾ã™ã€‚ ãƒ‘ã‚¿ãƒ¼ãƒ³ã®æ–‡æ³•ã«ã¤ã„ã¦ã¯ %[2]s ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 例: .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.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" ã«å¯¾ã™ã‚‹ãƒ–ランãƒä¿è­·ã‚’æ›´æ–°ã—ã¾ã—ãŸã€‚ @@ -2698,6 +2698,7 @@ 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 = 貢献ã®ç¨®é¡ž: @@ -2780,7 +2781,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 = %[2]sã‹ã‚‰ %[1]d ä»¶ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[3]s ã¸ãƒžãƒ¼ã‚¸ã—ãŸã„ +pulls.title_desc_one = %[3]s ã‹ã‚‰ %[1]d ä»¶ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[2]s ã¸ãƒžãƒ¼ã‚¸ã—ãŸã„ pulls.ready_for_review = ãƒ¬ãƒ“ãƒ¥ãƒ¼ã®æº–å‚™ãŒã§ãã¦ã„ã¾ã™ã‹ï¼Ÿ settings.transfer.button = 所有権を移é€ã™ã‚‹ settings.transfer.modal.title = æ‰€æœ‰æ¨©ã‚’ç§»é€ @@ -3519,8 +3520,6 @@ config.app_slogan = インスタンスã®ã‚¹ãƒ­ãƒ¼ã‚¬ãƒ³ config.cache_test = テストキャッシュ -config.cache_test_failed = キャッシュã®èª¿æŸ»ã«å¤±æ•—ã—ã¾ã—ãŸ: %v. - [action] create_repo=ãŒãƒªãƒã‚¸ãƒˆãƒª %s を作æˆã—ã¾ã—㟠rename_repo=ãŒãƒªãƒã‚¸ãƒˆãƒªåã‚’ %[1]s ã‹ã‚‰ %[3]s ã¸å¤‰æ›´ã—ã¾ã—㟠@@ -3764,8 +3763,6 @@ rpm.repository.multiple_groups = ã“ã®ãƒ‘ッケージã¯è¤‡æ•°ã®ã‚°ãƒ«ãƒ¼ãƒ— owner.settings.cargo.rebuild.no_index = 冿§‹ç¯‰ã§ãã¾ã›ã‚“ã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒåˆæœŸåŒ–ã•れã¦ã„ã¾ã›ã‚“。 npm.dependencies.bundle = ãƒãƒ³ãƒ‰ãƒ«ã•れãŸä¾å­˜é–¢ä¿‚ -search_in_external_registry = %s ã§æ¤œç´¢ - [secrets] secrets=シークレット description=シークレットã¯ç‰¹å®šã®Actionsã«æ¸¡ã•れã¾ã™ã€‚ ãれ以外ã§èª­ã¿å‡ºã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。 @@ -3844,8 +3841,8 @@ runs.actors_no_select=ã™ã¹ã¦ã®ã‚¢ã‚¯ã‚¿ãƒ¼ runs.status_no_select=ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ runs.no_results=一致ã™ã‚‹çµæžœã¯ã‚りã¾ã›ã‚“。 runs.no_workflows=ワークフローã¯ã¾ã ã‚りã¾ã›ã‚“。 -runs.no_workflows.quick_start = Forgejo Action ã®å§‹ã‚æ–¹ãŒã‚ã‹ã‚‰ãªã„? クイックスタートガイドをã”覧ãã ã•ã„。 -runs.no_workflows.documentation = Forgejo Action ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 +runs.no_workflows.quick_start=Gitea Actions ã®å§‹ã‚æ–¹ãŒã‚ã‹ã‚‰ãªã„? ã§ã¯ã‚¯ã‚¤ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¬ã‚¤ãƒ‰ã‚’ã”覧ãã ã•ã„。 +runs.no_workflows.documentation=Gitea Actions ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。 runs.no_runs=ワークフローã¯ã¾ã å®Ÿè¡Œã•れã¦ã„ã¾ã›ã‚“。 runs.empty_commit_message=(空ã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸) @@ -3871,6 +3868,8 @@ 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 ã¤å«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ @@ -3883,17 +3882,14 @@ 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=実行å¯èƒ½ãƒ•ァイル @@ -3968,4 +3964,4 @@ projects.read = 読ã¿å–り: リãƒã‚¸ãƒˆãƒª プロジェクト ボー actions.read = 読ã¿å–り: çµ±åˆã•れ㟠CI/CD パイプラインã¨ãã®ãƒ­ã‚°ã‚’表示ã—ã¾ã™ã€‚ [translation_meta] -test = ã“れã¯ãƒ†ã‚¹ãƒˆæ–‡å­—列ã§ã™ã€‚Forgejo UI ã«ã¯è¡¨ç¤ºã•れã¾ã›ã‚“ãŒã€ãƒ†ã‚¹ãƒˆç›®çš„ã§ä½¿ç”¨ã•れã¾ã™ã€‚æ—©ãæ¸ˆã¾ã›ã‚‹ãŸã‚ã«"ok"ã¨å…¥åŠ›ã™ã‚‹ã‹æ¥½ã—ã‹ã£ãŸå‡ºæ¥äº‹ã‚’入力ã—ã¦ä¸‹ã•ã„。ãã†ã™ã‚Œã°ã€å®Œäº†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ :) +test = ã“れã¯ãƒ†ã‚¹ãƒˆæ–‡å­—列ã§ã™ã€‚Forgejo UI ã«ã¯è¡¨ç¤ºã•れã¾ã›ã‚“ãŒã€ãƒ†ã‚¹ãƒˆç›®çš„ã§ä½¿ç”¨ã•れã¾ã™ã€‚æ—©ãæ¸ˆã¾ã›ã‚‹ãŸã‚ã«"ok"ã¨å…¥åŠ›ã™ã‚‹ã‹æ¥½ã—ã‹ã£ãŸå‡ºæ¥äº‹ã‚’入力ã—ã¦ä¸‹ã•ã„。ãã†ã™ã‚Œã°ã€å®Œäº†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ :) \ No newline at end of file diff --git a/options/locale/locale_ka.ini b/options/locale/locale_ka.ini deleted file mode 100644 index b1e1df74b3..0000000000 --- a/options/locale/locale_ka.ini +++ /dev/null @@ -1,836 +0,0 @@ -[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 6329dc9fe6..0b10f661da 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,14 +159,6 @@ 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 = 내비게ì´ì…˜ ë°” @@ -176,10 +168,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 = ë§Žì€ @@ -190,20 +182,6 @@ 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 = 하 - ê°€ @@ -212,9 +190,6 @@ string.asc = ê°€ - 하 [error] network_error = ë„¤íŠ¸ì›Œí¬ ì˜¤ë¥˜ server_internal = ë‚´ë¶€ 서버 오류 -not_found = íƒ€ê²Ÿì„ ì°¾ì„ ìˆ˜ 없습니다. -occurred = ì—러가 ë°œìƒí•¨ -report_message = ì´ê²ƒì´ Forgejoì˜ ë²„ê·¸ë¼ê³  ìƒê°í•œë‹¤ë©´, Codeberg ì—서 ì´ìŠˆë¥¼ 검색하거나 필요하다면 새 ì´ìŠˆë¥¼ 만들어주세요. [startpage] app_desc=편리한 설치형 Git 서비스 @@ -222,10 +197,6 @@ install=쉬운 설치 platform=í¬ë¡œìФ í”Œëž«í¼ lightweight=가벼움 license=오픈 소스 -platform_desc = Forgejo는 Linux와 FreeBSDë“±ì˜ ìžìœ  오픈소스 ìš´ì˜ ì²´ì œë¥¼ í¬í•¨í•œ 다양한 CPU 아키í…처ì—서 실행ë©ë‹ˆë‹¤. ë§ˆìŒ ê°€ëŠ”ëŒ€ë¡œ 고르세요! -lightweight_desc = Forgejoì˜ ë‚®ì€ ì „ë ¥ ì†Œëª¨ëŸ‰ì€ ê°’ì‹¼ Raspberry Pi마저 구ë™í•  수 있게 합니다. ê¸°ê¸°ì˜ ì—너지를 절약하세요! -license_desc = Forgejo를 설치해보세요! Forgejo를 개선하기 위해 기여할 수 있습니다. 기여ìžê°€ ë˜ê¸°ë¥¼ ë§ì„¤ì´ì§€ 마세요! -install_desc = 간단히 ë‹¹ì‹ ì˜ ê¸°ê¸°ì—서바ì´ë„ˆë¦¬ë¥¼ 실행하거나, Docker를 사용하거나, 패키지 저장소ì—서 설치할 수 있습니다. [install] install=설치 @@ -234,7 +205,7 @@ docker_helper=Forgejo를 Dockerì—서 실행하려면 설정 ì „ì— ì´ í˜•ì‹ìœ¼ë¡œ 입력하세요. -mailer_user=SMTP 사용ìžëª… +mailer_user=SMTP 사용ìžì´ë¦„ mailer_password=SMTP 비밀번호 register_confirm=가입시 ì´ë©”ì¼ í™•ì¸ í•„ìˆ˜ mail_notify=ì´ë©”ì¼ ì•Œë¦¼ 켜기 @@ -279,9 +250,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=새 ê³„ì •ì„ ë“±ë¡í•˜ë ¤ëŠ” 사용ìžëŠ” ì„¤ì •ëœ ì™¸ë¶€ 서비스를 ì´ìš©í•´ì•¼ë§Œ 새 ê³„ì •ì„ ë“±ë¡í•  수 있습니다. @@ -293,7 +264,7 @@ enable_captcha.description=ì‚¬ìš©ìž ë“±ë¡ì‹œ 캡차를 요구합니다. require_sign_in_view=ì¸ìŠ¤í„´ìŠ¤ì˜ ì½˜í…츠를 볼때 ë¡œê·¸ì¸ ìš”êµ¬ admin_setting.description=ê´€ë¦¬ìž ê³„ì •ì„ ë§Œë“œëŠ” ê²ƒì€ ì„ íƒì‚¬í•­ìž…니다. 첫번째로 등ë¡ëœ 사용ìžëŠ” ìžë™ì ìœ¼ë¡œ 관리ìžë¡œ 지정ë©ë‹ˆë‹¤. admin_title=ê´€ë¦¬ìž ê³„ì • 설정 -admin_name=관리ìžì˜ 사용ìžëª… +admin_name=ê´€ë¦¬ìž ì´ë¦„ admin_password=비밀번호 confirm_password=비밀번호 í™•ì¸ admin_email=ì´ë©”ì¼ ì£¼ì†Œ @@ -302,37 +273,27 @@ 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'로 ì´ë©”ì¼ì„ 가리면 Gitì— 'joe@noreply.example.org'로 ë¡œê·¸ì¸ í•˜ê²Œ ë©ë‹ˆë‹¤. +no_reply_address_helper=가려진 ì´ë©”ì¼ì„ 가진 사용ìžì—게 ì ìš©ë  ì´ë©”ì¼ ë„ë©”ì¸ìž…니다. 예를 들어, ì‚¬ìš©ìž 'joe'ì˜ ê°€ë ¤ìž” ì´ë©”ì¼ ë„ë©”ì¸ì´ 'noreply.example.org'로 설정ë˜ì–´ 있으면 'joe@noreply.example.org'로 처리 ë©ë‹ˆë‹¤. db_schema_helper = ë°ì´í„°ë² ì´ìФ 기본값 ("공개")를 사용하려면 빈 칸으로 ë‘세요. require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 ë˜ëŠ” TiDB (MySQL 프로토콜) ì´ ì„¤ì¹˜ë˜ì–´ 있어야 합니다. domain = 서버 ë„ë©”ì¸ smtp_from_invalid = "ì´ë©”ì¼ ë°œì‹ ì¸" 주소가 유효하지 않습니다 enable_captcha = ë“±ë¡ ì‹œ CAPTCHA 활성화 allow_only_external_registration = 외부 서비스를 통한 등ë¡ë§Œ 허용 -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=저장소 @@ -376,7 +337,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=여기를 눌러 í™•ì¸ ë©”ì¼ ìž¬ì „ì†¡ @@ -413,6 +374,7 @@ authorization_failed=ì¸ì¦ 실패 sspi_auth_failed=SSPI ì¸ì¦ 실패 [mail] + activate_account=ê³„ì •ì„ í™œì„±í™”í•˜ì„¸ìš” activate_email=ì´ë©”ì¼ ì£¼ì†Œ í™•ì¸ @@ -434,7 +396,6 @@ 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 @@ -449,8 +410,8 @@ cancel=취소 modify=변경하기 [form] -UserName=사용ìžëª… -RepoName=저장소명 +UserName=ì‚¬ìš©ìž ì´ë¦„ +RepoName=저장소 ì´ë¦„ Email=ì´ë©”ì¼ ì£¼ì†Œ Password=비밀번호 Retype=비밀번호 í™•ì¸ @@ -484,14 +445,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=존재하지 않는 사용ìžìž…니다. @@ -507,10 +468,8 @@ 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] @@ -526,9 +485,6 @@ unfollow=ì¶”ì í•´ì œ user_bio=소개 projects = 프로ì íЏ watched = ì£¼ì‹œì¤‘ì¸ ì €ìž¥ì†Œ -form.name_reserved = "%s" 사용ìžëª…ì´ ì˜ˆì•½(reserved)ë˜ì—ˆìŠµë‹ˆë‹¤. -form.name_pattern_not_allowed = "%s" íŒ¨í„´ì´ ì‚¬ìš©ìžëª…으로 사용할 수 없습니다. -form.name_chars_not_allowed = "%s" 사용ìžëª…ì´ ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžë¥¼ í¬í•¨í•©ë‹ˆë‹¤. [settings] @@ -548,14 +504,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=언어 @@ -706,14 +662,11 @@ 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=í…œí”Œë¦¿ì„ ì„ íƒí•©ë‹ˆë‹¤. @@ -826,7 +779,7 @@ editor.or=í˜¹ì€ editor.cancel_lower=취소 editor.commit_changes=변경 ë‚´ìš©ì„ ì»¤ë°‹ editor.commit_message_desc=ì„ íƒì  확장 설명 추가… -editor.commit_directly_to_this_branch=%[1]s 브랜치ì—서 ì§ì ‘ 커밋해주세요. +editor.commit_directly_to_this_branch=%s 브랜치ì—서 ì§ì ‘ 커밋해주세요. editor.create_new_branch=ì´ ì»¤ë°‹ì— ëŒ€í•œ 새로운 브랜치를 만들고 ëŒì–´ì˜¤ê¸° ìš”ì²­ì„ ì‹œìž‘í•©ë‹ˆë‹¤. editor.new_branch_name_desc=새로운 브랜치 ì´ë¦„… editor.cancel=취소 @@ -963,7 +916,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=수ë™ìœ¼ë¡œ 시간 ìž…ë ¥ @@ -1021,7 +974,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=커밋 @@ -1129,6 +1082,7 @@ contributors.contribution_type.commits=커밋 search=검색 search.search_repo=저장소 검색 +search.results="%s ì—서 \"%s\" ì— ëŒ€í•œ 검색 ê²°ê³¼" search.code_no_results=검색어와 ì¼ì¹˜í•˜ëŠ” 소스코드가 없습니다. settings=설정 @@ -1163,7 +1117,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=ê³µë°±ì€ ì¶©ëŒì—서 무시하기 @@ -1209,7 +1163,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 @@ -1350,7 +1304,7 @@ settings.trust_model.committer.desc = 유효한 ì„œëª…ì´ ì»¤ë¯¸í„°ì™€ ì¼ì¹˜í•  visibility_helper = 저장소 비공개로 만들기 projects.description = 설명 (ì„ íƒ) settings.external_tracker_url_desc = 방문ìžë“¤ì´ ì´ìŠˆ íƒ­ì„ í´ë¦­í•˜ë©´ 외부 ì´ìŠˆ 트레커 URL로 ì—°ê²°ë©ë‹ˆë‹¤. -settings.tracker_url_format_desc = {user}를 사용ìžëª…, {repo}를 저장소명, {index}를 ì´ìŠˆ 번호로 사용할 수 있습니다. +settings.tracker_url_format_desc = {user}, {repo} and {index}를 ì‚¬ìš©ìž ì´ë¦„, 저장소 ì´ë¦„, ì´ìŠˆ 번호로 사용할 수 있습니다. projects = 프로ì íЏ projects.desc = ì´ìŠˆì™€ í’€ 리퀘스트를 프로ì íЏì—서 관리합니다. projects.create = 프로ì íЏ 만들기 @@ -1412,27 +1366,14 @@ 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=멤버 @@ -1469,7 +1410,7 @@ members.public=ë³´ìž„ members.public_helper=숨기기 members.private=숨김 members.private_helper=ë³´ì´ê¸° -members.member_role=멤버 ì—­í• : +members.member_role=íšŒì› ì—­í• : members.owner=ì†Œìœ ìž members.member=멤버 members.remove=제거 @@ -1493,7 +1434,6 @@ teams.repositories=팀 저장소 teams.search_repo_placeholder=저장소 찾기... teams.add_duplicate_users=사용ìžê°€ ì´ë¯¸ 팀 멤버입니다. teams.members.none=ì´ íŒ€ì— ë©¤ë²„ê°€ 없습니다. -form.name_pattern_not_allowed = "%s" íŒ¨í„´ì´ ì¡°ì§ëª…으로 사용할 수 없습니다. [admin] dashboard=대시보드 @@ -1694,9 +1634,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=페ì´ì§€ë¥¼ 보려면 ë¡œê·¸ì¸ í•„ìˆ˜ @@ -1705,8 +1645,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=기본ì ìœ¼ë¡œ ì´ìŠˆ 종ì†ì„±ì„ 활성화 @@ -1792,17 +1732,8 @@ 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으로 변경함 @@ -1874,6 +1805,9 @@ details.author = ìž‘ì„±ìž [secrets] [actions] + + + runners.name=ì´ë¦„ runners.owner_type=유형 runners.description=설명 @@ -1890,6 +1824,9 @@ 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"ì— ì˜í•´ 제공ë©ë‹ˆë‹¤.관리ìžê°€ 코드 ì¸ë±ì„œë¥¼ 활성화하면 ë” ë‚˜ì€ ê²°ê³¼ê°€ ì œê³µë  ìˆ˜ 있습니다. @@ -1897,24 +1834,17 @@ 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 = í’€ 검색… -milestone_kind = 마ì¼ìŠ¤í†¤ 검색... -fuzzy = 모호함 -union = 통합 검색 -union_tooltip = 공백으로 êµ¬ë¶„ëœ í‚¤ì›Œë“œ 중 하나ë¼ë„ ì¼ì¹˜í•˜ëŠ” 결과를 í¬í•¨í•˜ì„¸ìš” -exact = 정확한 -regexp = ì •ê·œ í‘œí˜„ì‹ -regexp_tooltip = 검색어를 ì •ê·œ 표현ì‹ìœ¼ë¡œ í•´ì„합니다 \ No newline at end of file +issue_kind = ì´ìŠˆ 검색... +pull_kind = í’€ 검색... \ No newline at end of file diff --git a/options/locale/locale_lt.ini b/options/locale/locale_lt.ini index 868e5bff6e..22716796f9 100644 --- a/options/locale/locale_lt.ini +++ b/options/locale/locale_lt.ini @@ -1,3 +1,6 @@ + + + [common] dashboard = SÄ…vadas explore = NarÅ¡yti diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 4bd379c8e2..34fd8c82d4 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1,13 +1,13 @@ [common] home=SÄkums -dashboard=PÄrskata panelis +dashboard=Infopanelis 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=Atteikties +sign_out=IzrakstÄ«ties 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=PaÅ¡reizÄ“jÄ laika uzskaite +active_stopwatch=AktÄ«vÄ 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… @@ -34,63 +34,63 @@ access_token=Piekļuves pilnvara re_type=ApstiprinÄt paroli captcha=CilvÄ“ktests twofa=DivpakÄpju pieteikÅ¡anÄs -twofa_scratch=DivpakÄpju vienreiz izmantojamais kods +twofa_scratch=DivpakÄpju vienreizÄ“jais kods passcode=Kods -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_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_error=Nevar nolasÄ«t drošības atslÄ“gu. -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_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_error_unable_to_process=Serveris nevarÄ“ja apstrÄdÄt pieprasÄ«jumu. -webauthn_error_duplicated=Drošības atslÄ“ga nav atļauta Å¡im pieprasÄ«jumam. LÅ«gums pÄrliecinÄties, ka šī atslÄ“ga nav jau reÄ£istrÄ“ta. +webauthn_error_duplicated=Drošības atslÄ“ga nav atļauta Å¡im pieprasÄ«jumam. PÄrliecinieties, ka šī atslÄ“ga jau nav reÄ£istrÄ“ta. webauthn_error_empty=JÄnorÄda šīs atslÄ“gas nosaukums. -webauthn_error_timeout=IestÄjÄs noildze, pirms varÄ“ja nolasÄ«t atslÄ“gu. LÅ«gums pÄrlÄdÄ“t Å¡o lapu un mēģinÄt vÄ“lreiz. +webauthn_error_timeout=IestÄjusies noildze, mēģinot, nolasÄ«t atslÄ“gu. PÄrlÄdÄ“jiet lapu un mēģiniet vÄ“lreiz. webauthn_reload=PÄrlÄdÄ“t -repository=GlabÄtava -organization=ApvienÄ«ba -mirror=SpoguļglabÄtava +repository=Repozitorijs +organization=OrganizÄcija +mirror=Spogulis new_repo=Jauns repozitorijs new_migrate=Jauna migrÄcija -new_mirror=Jauna spoguļglabÄtava -new_fork=Jauns glabÄtavas atzarojums +new_mirror=Jauns spoguļserveris +new_fork=Jauns atdalÄ«ts repozitorijs new_org=Jauna organizÄcija new_project=Jauns projekts -new_project_column=Jauna aile +new_project_column=Jauna kolonna manage_org=PÄrvaldÄ«t organizÄcijas admin_panel=Vietnes pÄrvaldÄ«ba account_settings=Konta iestatÄ«jumi settings=IestatÄ«jumi your_profile=Profils -your_starred=Izlase +your_starred=Pievienots izlasÄ“ your_settings=IestatÄ«jumi all=Visi sources=Avoti -mirrors=SpoguļglabÄtavas -collaborative=LÄ«dzdarboÅ¡anÄs -forks=Atzarojumi +mirrors=Spoguļi +collaborative=SadarbÄ«bas +forks=AtdalÄ«tie -activities=DarbÄ«bas +activities=AktivitÄte pull_requests=Izmaiņu pieprasÄ«jumi -issues=Pieteikumi +issues=ProblÄ“mas milestones=Atskaites punkti ok=Labi cancel=Atcelt retry=MēģinÄt vÄ“lreiz -rerun=AtkÄrtoti izpildÄ«t -rerun_all=AtkÄrtoti izpildÄ«t visus darbus +rerun=Palaist atkÄrtoti +rerun_all=Palaist atkÄrtoti visus darbus save=SaglabÄt add=Pievienot add_all=Pievienot visus remove=Noņemt remove_all=Noņemt visus -remove_label_str=Noņemt vienumu "%s" +remove_label_str=`Noņemt ierakstu "%s"` edit=Labot view=SkatÄ«t @@ -98,21 +98,21 @@ enabled=IespÄ“jots disabled=AtspÄ“jots locked=SlÄ“gts -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=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=Å Äda veida datnes nevar ievietot starpliktuvÄ“ write=RakstÄ«t -preview=PriekÅ¡skatÄ«jums +preview=PriekÅ¡skatÄ«tÄ«jums loading=Notiek ielÄde… error=Kļūda -error404=Å Ä« lapa vai nu nepastÄv, vai ir noņemta, vai arÄ« nav tiesÄ«bu to apskatÄ«t. +error404=Lapa, ko vÄ“laties atvÄ“rt, neeksistÄ“ vai arÄ« Jums nav tiesÄ«bas to aplÅ«kot. go_back=Atgriezties never=Nekad @@ -129,63 +129,34 @@ archived=ArhivÄ“tie concept_system_global=GlobÄls concept_user_individual=IndividuÄls -concept_code_repository=GlabÄtava -concept_user_organization=ApvienÄ«ba +concept_code_repository=Repozitorijs +concept_user_organization=OrganizÄcija -show_timestamps=RÄdÄ«t laikspiedolus +show_timestamps=RÄdÄ«t laika zÄ«mogus show_log_seconds=RÄdÄ«t sekundes -show_full_screen=AtvÄ“rt pilnekrÄnÄ +show_full_screen=AtvÄ“rt pilnÄ logÄ 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=PÄrieÅ¡anas josla +navbar=NavigÄcijas josla footer=KÄjene footer.software=Par Å¡o programmatÅ«ru footer.links=Saites [heatmap] -number_of_contributions_in_the_last_12_months=%s iesaistes pÄ“dÄ“jo 12 mÄ“neÅ¡u laikÄ -contributions_zero=Nav iesaistīšanos +number_of_contributions_in_the_last_12_months=%s darbÄ«bas pÄ“dÄ“jo 12 mÄ“neÅ¡u laikÄ +contributions_zero=Nav aktivitÄtes 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=Virsraksts -buttons.bold.tooltip=Treknraksts +buttons.heading.tooltip=Pievienot virsrakstu +buttons.bold.tooltip=Izcelt tekstu buttons.italic.tooltip=SlÄ«praksta teksts buttons.quote.tooltip=CitÄ“t tekstu buttons.code.tooltip=Pievienot kodu @@ -194,22 +165,10 @@ 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 pieteikumu vai izmaiņu pieprasÄ«jumu +buttons.ref.tooltip=Atsaukties uz problÄ“mu vai izmaiņu pieprasÄ«jumu buttons.switch_to_legacy.tooltip=Izmantot vÄ“sturisko redaktoru -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. +buttons.enable_monospace_font=Izmantot vienÄda izmÄ“ra fontu +buttons.disable_monospace_font=Neizmantot vienÄda izmÄ“ra fontu [filter] string.asc=A - Z @@ -217,29 +176,28 @@ string.desc=Z - A [error] occurred=Radusies kļūda -report_message=Ja ir pÄrliecÄ«ba, ka šī ir Forgejo nepilnÄ«ba, lÅ«gums pÄrbaudÄ«t Codeberg, vai tÄ jau nav zinÄma, vai izveidot jaunu pieteikumu, ja nepiecieÅ¡ams. +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. 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=PaÅ¡mitinÄms Git pakalpojums bez galvassÄpÄ“m -install=Viegli uzstÄdÄ«t +app_desc=Viegli uzstÄdÄms Git serviss +install=VienkÄrÅ¡i instalÄ“jams 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 +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! lightweight=Viegla -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! +lightweight_desc=Forgejo ir miminÄlas prasÄ«bas un to var darbinÄt uz nedÄrga Raspberry Pi datora. Ietaupi savai ierÄ«cei resursus! license=AtvÄ“rtÄ pirmkoda -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! +license_desc=IegÅ«sti Forgejo! Pievienojies un palÄ«dzi uzlabot, lai padarÄ«tu Å¡o projektu vÄ“l labÄku! NekautrÄ“jies un lÄ«dzdarbojies! [install] -install=UzstÄdīšana +install=InstalÄcija title=SÄkotnÄ“jÄ konfigurÄcija -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). +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=DatubÄzes iestatÄ«jumi db_type=DatubÄzes veids host=Resursdators @@ -247,126 +205,119 @@ user=LietotÄjvÄrds password=Parole db_name=DatubÄzes nosaukums db_schema=ShÄ“ma -db_schema_helper=AtstÄt tukÅ¡u, lai izmantotu datubÄzes noklusÄ“jumu ("public"). +db_schema_helper=AtstÄjiet tukÅ¡u, lai izmantu datubÄzes noklusÄ“to ("public"). ssl_mode=SSL path=Ceļš 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 +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, kas ir norÄdÄ«ts app.ini datnÄ“, var tikt pazaudÄ“ti: lietotÄji nevarÄ“s pieteikties ar 2FA/OTP, kÄ arÄ« spoguļserveri 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, kÄ arÄ« 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ÄÅ¡ 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=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 -general_title=VispÄrÄ«gi iestatÄ«jumi +general_title=VispÄrÄ«gie iestatÄ«jumi app_name=Vietnes nosaukums 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 +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=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 +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 domain_helper=DomÄ“ns vai servera adrese. ssh_port=SSH servera ports -ssh_port_helper=Porta numurs, kuru izmantos SSH serveris. AtstÄt tukÅ¡u, lai atspÄ“jotu SSH serveri. +ssh_port_helper=Porta numurs, kuru SSH serveris klausÄ«sies. AtstÄjiet tukÅ¡u, lai atspÄ“jotu. http_port=HTTP klausīšanÄs ports -http_port_helper=Porta numurs, kuru izmantos Forgejo tÄ«mekļa serveris. +http_port_helper=Porta numurs, kuru Forgejo tÄ«mekļa serveris klausÄ«sies. app_url=Pamata URL app_url_helper=Pamata adrese HTTP(S) klonēšanas URL un e-pastu paziņojumiem. log_root_path=ŽurnÄlu atraÅ¡anÄs vieta log_root_path_helper=ŽurnÄlu datnes tiks rakstÄ«tas Å¡ajÄ mapÄ“. -optional_title=IzvÄ“les iestatÄ«jumi +optional_title=NeobligÄtie iestatÄ«jumi email_title=E-pasta iestatÄ«jumi -smtp_addr=SMTP saimniekdators +smtp_addr=SMTP resursdators smtp_port=SMTP ports 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" . +smtp_from_helper=E-pasta adrese, ko Forgejo izmantos. Ievadiet tika e-pasta adrese vai izmantojiet "VÄrds" formÄtu. mailer_user=SMTP lietotÄjvÄrds mailer_password=SMTP parole -register_confirm=ReÄ£istrÄ“joties pieprasÄ«t e-pasta adreses apstiprinÄÅ¡anu +register_confirm=ReÄ£istrÄ“joties pieprasÄ«t apstiprinÄt e-pastu mail_notify=IespÄ“jot e-pasta paziņojumus 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 nodroÅ¡inÄti vietÄ“ji. +offline_mode.description=AtspÄ“jot ÄrÄ“jos satura piegÄdes tÄ«klus, lai visi resursi tiktu piegÄdÄti lokÄli. disable_gravatar=AtspÄ“jot Gravatar -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. +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 openid_signin=IespÄ“jot pieteikÅ¡anos 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. +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. enable_captcha=PieprasÄ«t drošības kodu lietotÄju reÄ£istrÄcijÄ -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 +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 admin_password=Parole -confirm_password=ApstiprinÄt paroli +confirm_password=Apstipriniet paroli admin_email=E-pasta adrese -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). +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. 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 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 +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 save_config_failed=NeizdevÄs saglabÄt konfigurÄciju: %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 +invalid_admin_setting=NederÄ«gs administratora iestatÄ«jums: %v +invalid_log_root_path=NederÄ«gs žurnalizēšanas ceļš: %v default_keep_email_private=PÄ“c noklusÄ“juma slÄ“pt e-pasta adreses -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_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_enable_timetracking=PÄ“c noklusÄ“juma iespÄ“jot laika uzskaiti -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 +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 invalid_password_algorithm=Kļūdaina paroles jaucÄ“jfunkcija -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 +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 env_config_keys=Vides konfigurÄcija 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-pasta adrese +uname_holder=LietotÄjvÄrds vai e-pasts password_holder=Parole switch_dashboard_context=MainÄ«t pÄrskata paneļa kontekstu -my_repos=GlabÄtavas +my_repos=Repozitoriji show_more_repos=ParÄdÄ«t vairÄk repozitorijus… collaborative_repos=SadarbÄ«bas repozitoriji my_orgs=ApvienÄ«bas my_mirrors=Mani spoguļi -view_home=ApskatÄ«t %s +view_home=SkatÄ«ties %s search_repos=MeklÄ“t repozitoriju… -filter=Citas atlases -filter_by_team_repositories=AtlasÄ«t pÄ“c komandas glabÄtavÄm -feed_of="%s" barotne +filter=Citi filtri +filter_by_team_repositories=FiltrÄ“t pÄ“c komandas repozitorijiem +feed_of=`"%s" plÅ«sma` show_archived=ArhivÄ“tie show_both_archived_unarchived=AttÄ“lot gan arhivÄ“tos, gan nearhivÄ“tos @@ -374,16 +325,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=RÄda gan atklÄtÄs, gan privÄtÄs +show_both_private_public=AttÄ“lot gan publiskos, gan privÄtos show_only_private=AttÄ“lot tikai privÄtos -show_only_public=AttÄ“lo tikai atklÄtÄs +show_only_public=AttÄ“lot tikai publiskos -issues.in_your_repos=ManÄs glabÄtavÄs +issues.in_your_repos=JÅ«su repozitorijos [explore] -repos=GlabÄtavas +repos=Repozitoriji users=LietotÄji -organizations=ApvienÄ«bas +organizations=OrganizÄcijas search=MeklÄ“t go_to=Iet uz code=Kods @@ -399,178 +350,145 @@ org_no_results=Netika atrasta neviena organizÄcija, kas atbilstu kritÄ“rijiem. code_no_results=Netika atrasts pirmkods, kas atbilstu kritÄ“rijiem. code_search_results=`Meklēšanas rezultÄti "%s"` code_last_indexed_at=PÄ“dÄ“jo reizi indeksÄ“ts %s -relevant_repositories_tooltip=GlabÄtavas, kas ir atzarojumi vai kam nav temata, ikonas un apraksta, ir paslÄ“ptas. -relevant_repositories=Tiek rÄdÄ«tas tikai atbilstoÅ¡Äs glabÄtavas, rÄdÄ«t neatsijÄtu iznÄkumu. -stars_one = %d zvaigzne -stars_few = %d zvaignznes -forks_one = %d atzarojums -forks_few = %d atzarojumi +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. [auth] -create_new_account=Izveidot kontu +create_new_account=ReÄ£istrÄ“t kontu register_helper_msg=Jau ir konts? Piesakieties tagad! social_register_helper_msg=Jau ir konts? Piesaisti to! -disable_register_prompt=ReÄ£istrēšanÄs ir atspÄ“jota. LÅ«gums sazinÄties ar vietnes pÄrvaldÄ«tÄju. -disable_register_mail=E-pasta adreses apstiprinÄÅ¡ana reÄ£istrÄ“joties ir atspÄ“jota. -manual_activation_only=JÄsazinÄs ar vietnes pÄrvaldÄ«tÄju, lai pabeigtu aktivēšanu. +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. remember_me=AtcerÄ“ties Å¡o ierÄ«ci remember_me.compromised=PieteikÅ¡anÄs pilnvara vairs nav derÄ«ga, kas var norÄdÄ«t uz ļaunprÄtÄ«gÄm darbÄ«bÄm kontÄ. LÅ«gums pÄrbaudÄ«t, vai kontÄ nav neparastu darbÄ«bu. forgot_password_title=Aizmirsta parole forgot_password=Aizmirsi paroli? sign_up_now=NepiecieÅ¡ams konts? ReÄ£istrÄ“jies tagad. -sign_up_successful=Konts tika sekmÄ«gi izveidots. Laipni lÅ«dzam! -confirmation_mail_sent_prompt=Jauns apstiprinÄÅ¡anas e-pasta ziņojums tika nosÅ«tÄ«ts uz %s. LÅ«gums pÄrbaudÄ«t savu iesÅ«tni nÄkamajÄs %s, lai pabeigtu reÄ£istrēšanos. Ja e-pasta adrese ir nepareiza, ir iespÄ“jams pieteikties un pieprasÄ«t vÄ“l viena apstiprinÄÅ¡anas e-pasta ziņojuma nosÅ«tīšanu uz citu adresi. -must_change_password=AtjauninÄt savu paroli +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 allow_password_change=PieprasÄ«t lietotÄjam mainÄ«t paroli (ieteicams) -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 +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=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 +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 email_not_associate=Å Ä« e-pasta adrese nav saistÄ«ta ar nevienu kontu. -send_reset_mail=NosÅ«tÄ«t atkopes e-pasta ziņojumu -reset_password=Konta atkope -invalid_code=ApstiprinÄÅ¡anas kods ir nederÄ«gs, vai ir beidzies tÄ derÄ«gums. -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Ä. +send_reset_mail=NosÅ«tÄ«t atkopÅ¡anas e-pasta ziņojumu +reset_password=Konta atkopÅ¡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. reset_password_helper=Atjaunot paroli -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. +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. non_local_account=Ä€rÄ“jie konti nevar mainÄ«t paroli, izmantojot, Forgejo saskarni. -verify=ApliecinÄt +verify=PÄrbaudÄ«t scratch_code=VienreizÄ“jais kods use_scratch_code=Izmantot vienreizÄ“jo kodu -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_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_token_incorrect=IevadÄ«ts nepareizs vienreizÄ“jais kods. login_userpass=Pieteikties tab_openid=OpenID oauth_signup_tab=Izveidot jaunu kontu -oauth_signup_title=Pabeigt jauna konta izveidoÅ¡anu +oauth_signup_title=Pabeigt jaunÄ konta izveidoÅ¡anu oauth_signup_submit=Pabeigt konta izveidoÅ¡anu oauth_signin_tab=SasaistÄ«t ar esoÅ¡u kontu -oauth_signin_title=Pieteikties, lai pilnvarotu sasaistÄ«to kontu +oauth_signin_title=Pieteikties, lai autorizÄ“tu sasaistÄ«to kontu oauth_signin_submit=SasaistÄ«t kontu -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. +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. openid_connect_submit=Pievienoties openid_connect_title=Pievienoties jau esoÅ¡am kontam -openid_connect_desc=IzvÄ“lÄ“tais OpenID URI ir nezinÄms. Tas ir jÄasasaista ar jaunu kontu Å¡eit. +openid_connect_desc=IzvÄ“lÄ“tais OpenID konts sistÄ“mÄ netika atpazÄ«ts, bet JÅ«s to varat piesaistÄ«t esoÅ¡am kontam. openid_register_title=Izveidot jaunu kontu -openid_register_desc=IzvÄ“lÄ“tais OpenID URI ir nezinÄms. Tas ir jÄasasaista ar jaunu kontu Å¡eit. +openid_register_desc=IzvÄ“lÄ“tais OpenID konts sistÄ“mÄ netika atpazÄ«ts, bet JÅ«s to varat piesaistÄ«t esoÅ¡am kontam. openid_signin_desc=JÄievada OpenID URI. PiemÄ“ram, anna.openid.example.org vai https://openid.example.org/anna. -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. +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. email_domain_blacklisted=Nav atļauts reÄ£istrÄ“ties ar Å¡Ädu e-pasta adresi. -authorize_application=Pilnvarot lietotni -authorize_redirect_notice=Notiks pÄrvirzīšana uz %s, ja pilnvaroÅ¡i Å¡o lietotni. +authorize_application=AutorizÄ“t lietotni +authorize_redirect_notice=JÅ«s tiksiet nosÅ«tÄ«ts uz %s, ja autorizÄ“siet Å¡o lietotni. authorize_application_created_by=Å o lietotni izveidoja %s. -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. +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. sspi_auth_failed=SSPI autentifikÄcija neizdevÄs -password_pwned=IzvÄ“lÄ“tÄ parole ir nozagto paroļu sarakstÄ, kas iepriekÅ¡ ir atklÄts pieejamÄs datu noplÅ«dÄ“s. LÅ«gums mēģinÄt vÄ“lreiz ar citu paroli un apsvÄ“rt to nomainÄ«t arÄ« citur. +password_pwned=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_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=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! +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, -activate_account=LÅ«gums aktivÄ“t savu kontu +activate_account=LÅ«dzu, aktivizÄ“jiet savu kontu activate_account.title=%s, aktivizÄ“jiet savu kontu -activate_account.text_1=Sveiciens, %[1]s! Paldies par reÄ£istrēšanos %[2]s! -activate_account.text_2=JÄklikšķina uz šīs saites, lai aktivÄ“tu savu %s kontu: +activate_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_email=Apliecini savu e-pasta adresi +activate_email=Apstipriniet savu e-pasta adresi activate_email.title=%s, apstipriniet savu e-pasta adresi -activate_email.text=LÅ«gums klikšķinÄt uz šīs saites, lai apliecinÄtu savu e-pasta adresi %s: +activate_email.text=Nospiediet uz saites, lai apstiprinÄtu savu e-pasta adresi lapÄ %s: register_notify=Laipni lÅ«dzam %s register_notify.title=%[1]s, esat reÄ£istrÄ“jies %[2]s -register_notify.text_1=Å is ir apstiprinÄjuma e-pasta ziņojums reÄ£istrÄcijai %s. -register_notify.text_2=Tagad var pieteikties ar savu lietotÄjvÄrdu: %s -register_notify.text_3=Ja Å¡o kontu izveidoja kÄds cits, vispirms ir nepiecieÅ¡ams iestatÄ«t savu paroli. +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. reset_password=AtgÅ«t kontu reset_password.title=%s, esat pieprasÄ«jis atjaunot savu kontu -reset_password.text=LÅ«gums klikšķinÄt uz šīs saites, lai atjaunotu savu %s kontu: +reset_password.text=Nospiediet uz saites, lai atjaunotu savu kontu lapÄ %s: -register_success=ReÄ£istrÄcija bija sekmÄ«ga +register_success=VeiksmÄ«ga reÄ£istrÄcija -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_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.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.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.action.close=@%[1]s aizvÄ“ra #%[2]d. issue.action.reopen=@%[1]s atkÄrtoti atvÄ“ra #%[2]d. -issue.action.merge=@%[1]s iekļÄva #%[2]d zarÄ %[3]s. +issue.action.merge=@%[1]s sapludinÄja #%[2]d atzarÄ %[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 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.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.new=@%[1]s izveidoja #%[2]d. issue.in_tree_path=CeÄ¼Ä %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.new.subject=Jauns laidiens %s repozitorijÄ %s +release.new.text=@%[1]s izveidoja jaunu laidienu %[2]s repozitorijÄ %[3]s release.title=Nosaukums: %s release.note=PiezÄ«mes: release.downloads=LejupielÄdes: -release.download.zip=Pirmkods (ZIP) -release.download.targz=Pirmkods (TAR.GZ) +release.download.zip=Izejas kods (ZIP) +release.download.targz=Izejas kods (TAR.GZ) -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.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.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Ä: +repo.collaborator.added.subject=%s pievienoja JÅ«s repozitorijam %s +repo.collaborator.added.text=JÅ«s tikÄt pievienots kÄ lÄ«dzstrÄdnieks repozitorijam: -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. +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. [modal] yes=JÄ @@ -581,21 +499,21 @@ modify=AtjauninÄt [form] UserName=LietotÄjvÄrds -RepoName=GlabÄtavas nosaukums +RepoName=Repozitorija nosaukums Email=E-pasta adrese Password=Parole -Retype=ApstiprinÄt paroli +Retype=Apstipriniet paroli SSHTitle=SSH atslÄ“gas nosaukums HttpsUrl=HTTPS URL PayloadUrl=VÄ“rtuma URL TeamName=Komandas nosaukums -AuthName=PilnvaroÅ¡anas nosaukums -AdminEmail=PÄrvaldÄ«tÄja e-pasta adrese +AuthName=AutorizÄcijas nosaukums +AdminEmail=Admin e-pasta adrese -NewBranchName=Jaunais zara nosaukums -CommitSummary=IesÅ«tÄ«juma kopsavilkums -CommitMessage=IesÅ«tÄ«juma ziņojums -CommitChoice=IesÅ«tÄ«juma izvÄ“le +NewBranchName=Jauna atzara nosaukums +CommitSummary=RevÄ«zijas kopsavilkums +CommitMessage=RevÄ«zijas ziņojums +CommitChoice=RevÄ«zijas izvÄ“le TreeName=Datnes ceļš Content=Saturs @@ -605,103 +523,88 @@ SSPIDefaultLanguage=NoklusÄ“juma valoda require_error=` nedrÄ«kst bÅ«t tukÅ¡s.` alpha_dash_error=` drÄ«kst sastÄvÄ“t tikai no burtiem un cipariem, domuzÄ«mÄ“m ("-") un apakÅ¡svÄ«trÄm ("_").` alpha_dash_dot_error=` drÄ«kst sastÄvÄ“t tikai no burtiem un cipariem, domuzÄ«mÄ“m ('-'), apakÅ¡svÄ«trÄm ('_') un punktiem ('.').` -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.` +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Ä.` email_error=` nav derÄ«ga e-pasta adrese.` -url_error=`"%s" nav derÄ«gs URL.` +url_error=`"%s" nav korekts URL.` include_error=` ir jÄsatur tekstu "%s".` -glob_pattern_error=` glob paraugs nav derÄ«gs: %s.` -regex_pattern_error=` regulÄrÄ izteiksme nav derÄ«ga: %s.` +glob_pattern_error=` glob Å¡ablons nav korekts: %s.` +regex_pattern_error=` regulÄrÄ izteiksme nav korekta: %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` +invalid_group_team_map_error=` sasaiste nav korekta: %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=AtlasÄ«t valodu no saraksta. +lang_select_error=IzvÄ“lieties valodu no saraksta. username_been_taken=LietotÄjvÄrds jau ir aizņemts. -username_change_not_local_user=Ä€rÄ“jie lietotÄji nevar mainÄ«t savu lietotÄjvÄrdu. +username_change_not_local_user=Ne-lokÄlie lietotÄji nevar mainÄ«t savus lietotÄjvÄrdus. username_has_not_been_changed=LietotÄjvÄrds netika mainÄ«ts -repo_name_been_taken=GlabÄtavas nosaukums jau tiek izmantots. -repository_force_private=IespÄ“jots "Uzspiest privÄtÄs": privÄtÄs glabÄtavas nevar padarÄ«t pieejamas visiem. +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=Å 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 divpakÄpju pieteikÅ¡anÄs. -org_name_been_taken=ApvienÄ«bas nosaukums jau ir aizņemts. +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. 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 tiek izmantota. -email_invalid=E-pasta adrese nav derÄ«ga. +email_been_used=E-pasta adrese jau ir izmantota. +email_invalid=Epasta adrese nav korekta. 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 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. +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 Ä«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. +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. 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=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. +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 apliecinÄt. KÄrtÄ«gi jÄpÄrbauda, vai nav pieļautas kļūdas. -auth_failed=AutentificēšanÄs neizdevÄs: %v +auth_failed=AutentifikÄcija neizdevÄs: %v -still_own_repo=Kontam pieder vismaz viena vai vairÄkas glabÄtavas, tÄs vispirms ir jÄizdzēš vai jÄnodod kÄdam. +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=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ēš. +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. -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. +target_branch_not_exist=MÄ“rÄ·a atzars neeksistÄ“ [user] change_avatar=MainÄ«t profila attÄ“lu… joined_on=PievienojÄs %s -repositories=GlabÄtavas -activity=AtklÄti notikumi +repositories=Repozitoriji +activity=PubliskÄ aktivitÄte followers_few=%d sekotÄji -starred=Izlasei pievienotÄs glabÄtavas -watched=VÄ“rotÄs glabÄtavas +starred=AtzÄ«mÄ“ti repozitoriji +watched=VÄ“rotie repozitoriji code=Kods projects=Projekti overview=PÄrskats following_few=%d seko follow=Sekot -unfollow=PÄrtraukt sekot -user_bio=Apraksts par sevi -disabled_public_activity=Å is lietotÄjs ir atspÄ“jojis darbÄ«bu redzamÄ«bu visiem. +unfollow=Nesekot +user_bio=BiogrÄfija +disabled_public_activity=Å is lietotÄjs ir atslÄ“dzies iespÄ“ju aplÅ«kot tÄ aktivitÄti. 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Ä“ @@ -710,25 +613,6 @@ 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 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 @@ -740,154 +624,154 @@ avatar=Profila attÄ“ls ssh_gpg_keys=SSH / GPG atslÄ“gas social=SociÄlie konti applications=Lietotnes -orgs=ApvienÄ«bas -repos=GlabÄtavas -delete=IzdzÄ“st kontu +orgs=PÄrvaldÄ«t apvienÄ«bas +repos=Repozitoriji +delete=DzÄ“st kontu twofa=DivpakÄpju pieteikÅ¡anÄs (TOTP) account_link=SaistÄ«tie konti -organization=ApvienÄ«bas +organization=OrganizÄcijas uid=UID webauthn=DivpakÄpju pieteikÅ¡anÄs (drošības atslÄ“gas) -public_profile=Visiem pieejamais profils -biography_placeholder=PastÄsti citiem mazliet par sevi! (Tiek atbalstÄ«ts Markdown) +public_profile=Publiskais profils +biography_placeholder=PastÄsti mums mazliet par sevi! (Var izmantot Markdown) location_placeholder=KopÄ«got savu aptuveno atraÅ¡anÄs vietu ar citiem -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. +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. full_name=Pilns vÄrds -website=TÄ«mekļvietne +website=MÄjas lapa location=AtraÅ¡anÄs vieta 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=Profils tika atjauninÄts. +update_profile_success=JÅ«su profila informÄcija tika saglabÄta. 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, lÄ«dz kÄds to izmantos. +change_username_redirect_prompt=Iepriekšējais lietotÄjvÄrds tiks pÄrvirzÄ«ts, kamÄ“r neviens cits to neizmanto. continue=TurpinÄt cancel=Atcelt language=Valoda ui=MotÄ«vs -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 +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 comment_type_group_reference=Atsauces -comment_type_group_label=IezÄ«me +comment_type_group_label=EtiÄ·etes comment_type_group_milestone=Atskaites punktus comment_type_group_assignee=AtbildÄ«gos comment_type_group_title=Nosaukuma izmaiņas -comment_type_group_branch=Zars +comment_type_group_branch=Atzara izmaiņas comment_type_group_time_tracking=Laika uzskaitīšana comment_type_group_deadline=Termiņus comment_type_group_dependency=AtkarÄ«bas 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. +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. privacy=PrivÄtums keep_activity_private=Profila lapÄ paslÄ“pt notikumus keep_activity_private_popup=Savu aktivitÄti redzÄ“siet tikai JÅ«s un administratori -lookup_avatar_by_mail=UzmeklÄ“t profila attÄ“lus pÄ“c e-pasta adreses +lookup_avatar_by_mail=MeklÄ“t profila attÄ“lus pÄ“c e-pasta adreses federated_avatar_lookup=Apvienotais profila bilžu meklÄ“tÄjs -enable_custom_avatar=Izmantot pielÄgotu profila attÄ“lu +enable_custom_avatar=izmantot pielÄgotu profila attÄ“lu choose_new_avatar=IzvÄ“lÄ“ties jaunu profila attÄ“lu update_avatar=AtjauninÄt attÄ“lu 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 atjauninÄts. +update_user_avatar_success=LietotÄja profila attÄ“ls tika atjaunots. update_password=AtjauninÄt paroli old_password=PaÅ¡reizÄ“jÄ 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 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Ä“. +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. emails=E-pasta adreses manage_emails=PÄrvaldÄ«t e-pasta adreses 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 +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=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. +activate_email=NosÅ«tÄ«t aktivizēšanas e-pasta ziņojumu +activations_pending=Gaida aktivizēšanu +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. delete_email=Noņemt 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. +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Ä“. openid_deletion=DzÄ“st OpenID adresi -openid_deletion_desc=Å Ä«s OpenID adreses noņemÅ¡ana no konta liegs iespÄ“ju pieteikties ar to. TurpinÄt? +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_success=OpenID adrese tika noņemta. add_new_email=Pievienot e-pasta adresi -add_new_openid=Pievienot jaunu OpenID URI +add_new_openid=Pievienot jaunu OpenID vietrÄdi add_email=Pievienot e-pasta adresi add_openid=Pievienot OpenID vietrÄdi -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. +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. 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 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. +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. 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 tÄdu paÅ¡u nosaukumu jau ir kontÄ. +ssh_key_name_used=SSH atslÄ“ga ar Å¡Ädu nosaukumu Å¡im kontam jau eksistÄ“. ssh_principal_been_used=Å Äda identitÄte jau ir pievienota Å¡ÄjÄ serverÄ«. -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_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_matched_identities=AtbilstoÅ¡Äs identitÄtes: -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_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_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 var izveidot: +gpg_token_help=Parakstu ir iespÄ“jams uzÄ£enerÄ“t izmantojot komandu: gpg_token_code=echo "%s" | gpg -a --default-key %s --detach-sig gpg_token_signature=TekstuÄls GPG paraksts -key_signature_gpg_placeholder=SÄkas ar "-----BEGIN PGP SIGNATURE-----" -verify_gpg_key_success=GPG atslÄ“ga "%s" tika apliecinÄta. -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. +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. 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 var izveidot: +ssh_token_help=Parakstu ir iespÄ“jams uzÄ£enerÄ“t izmantojot komandu: 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" tika apliecinÄta. +key_signature_ssh_placeholder=SÄkas ar '-----BEGIN SSH SIGNATURE-----' +verify_ssh_key_success=SSH atslÄ“ga "%s" veiksmÄ«gi pÄrbaudÄ«ta. subkeys=ApakÅ¡atslÄ“gas key_id=AtslÄ“gas ID key_name=AtslÄ“gas nosaukums @@ -900,9 +784,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=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_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_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. @@ -910,43 +794,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 nesenu darbÄ«bu +no_activity=Nav nesenas aktivitÄtes 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 izmantota pÄ“dÄ“jo 7 dienu laikÄ +principal_state_desc=Å Ä« identitÄte ir lietota pÄ“dÄ“jÄs 7 dienÄs show_openid=RÄdÄ«t profilÄ hide_openid=PaslÄ“pt no profila ssh_disabled=SSH atspÄ“jots -ssh_signonly=SSH paÅ¡laik ir atspÄ“jots, tÄdēļ šīs atslÄ“gas tiek izmantotas tikai iesÅ«tÄ«jumu parakstu apliecinÄÅ¡anai. +ssh_signonly=SSH ir atspÄ“jots, lÄ«dz ar to šīs atslÄ“gas tiks izmantotas tikai revÄ«ziju parakstu pÄrbaudei. ssh_externally_managed=Å im lietotÄjam SSH atslÄ“ga tiek pÄvaldÄ«ta attÄlinÄti manage_social=PÄrvaldÄ«t piesaistÄ«tos sociÄlos kontus social_desc=Å ie sociÄlo tÄ«klu konti var tikt izmantoti, lai pieteiktos. PÄrliecinieties, ka visi ir atpazÄ«stami. unbind=AtsaistÄ«t unbind_success=SociÄlÄ tÄ«kla konts tika veiksmÄ«gi noņemts. -manage_access_token=Piekļuves pilnvaras +manage_access_token=PÄrvaldÄ«t piekļuves pilnvaras generate_new_token=Izveidot jaunu pilnvaru -tokens_desc=Å Ä«s pilnvaras nodroÅ¡ina piekļuvi kontam ar Forgejo API. +tokens_desc=Ar Å¡iem taloniem ir iespÄ“jams piekļūt JÅ«su kontam, izmantojot, Forgejo API. token_name=Pilnvaras nosaukums -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 +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 access_token_deletion_cancel_action=Atcelt access_token_deletion_confirm_action=DzÄ“st -access_token_deletion_desc=Pilnvaras izdzēšana atsauks lietotņu, kas to izmanto, piekļuvi kontam. Å o darbÄ«bu nevar atsaukt. TurpinÄt? -delete_token_success=Pilnvara tika izdzÄ“sta. LietotnÄ“m, kas to izmanto, vairs nav piekļuves kontam. -repo_and_org_access=GlabÄtavas un apvienÄ«bas piekļuve -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 +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 permission_no_access=Nav piekļuves -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Ä. +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Ä. at_least_one_permission=NepiecieÅ¡ams norÄdÄ«t vismaz vienu tiesÄ«bu, lai izveidotu pilnvaru permissions_list=TiesÄ«bas: @@ -954,15 +838,15 @@ 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=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. +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. create_oauth2_application=Izveidot jaunu OAuth2 lietotni create_oauth2_application_button=Izveidot lietotni -create_oauth2_application_success=Ir sekmÄ«gi izveidota jauna OAuth2 lietotne. -update_oauth2_application_success=OAuth2 lietotne ir sekmÄ«gi atjauninÄta. +create_oauth2_application_success=Ir veiksmÄ«gi izveidota jauna OAuth2 lietotne. +update_oauth2_application_success=Ir veiksmÄ«gi atjaunota OAuth2 lietotne. oauth2_application_name=Lietotnes nosaukums 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Ä. +oauth2_redirect_uris=PÄrsÅ«tīšanas URI. NorÄdiet katru URI savÄ rindÄ. save_application=SaglabÄt oauth2_client_id=Klienta ID oauth2_client_secret=Klienta noslÄ“pums @@ -971,366 +855,318 @@ 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Ä 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. +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. -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. +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. revoke_key=Atsaukt revoke_oauth2_grant=Atsaukt piekļuvi -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. +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. -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_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=AtspÄ“jot divpakÄpju pieteikÅ¡anos -twofa_scratch_token_regenerate=AtkÄrtoti izveidot vienreizÄ“jas izmantoÅ¡anas atkopes atslÄ“gu +twofa_scratch_token_regenerate=AtkÄrtoti izveidot vienreizÄ“jas izmantoÅ¡anas atkopÅ¡anas 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 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_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_failed_get_secret=NeizdevÄs ielÄdÄ“t noslÄ“pumu. -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_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_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 autentificēšanÄs veidu. +webauthn_alternative_tip=Ir vÄ“lams uzstÄdÄ«t papildu autentifikÄcijas veidu. manage_account_links=SasaistÄ«tie konti -manage_account_links_desc=Å ie ÄrÄ“jie konti ir sasaistÄ«ti ar Tavu Forgejo kontu. +manage_account_links_desc=Å Ädi ÄrÄ“jie konti ir piesaistÄ«ti JÅ«su Forgejo kontam. account_links_not_available=PaÅ¡laik nav neviena ÄrÄ“jÄ konta piesaistÄ«ta Å¡im kontam. link_account=SasaistÄ«t kontu remove_account_link=Noņemt sasaistÄ«to kontu -remove_account_link_desc=SasaistÄ«tÄ konta noņemÅ¡ana atsauks tÄ piekļuvi Tavam Forgejo kontam. TurpinÄt? -remove_account_link_success=SasaistÄ«tais konts tika noņemts. +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. -hooks.desc=Pievienot tÄ«mekļa aizÄ·eres, kas izpildÄ«sies visÄs piederoÅ¡ajÄs glabÄtavÄs. +hooks.desc=Pievienot tÄ«mekļa ÄÄ·us, kas izpildÄ«sies visos repozitorijos, kas jums pieder. -orgs_none=Nav dalÄ«bas nevienÄ apvienÄ«bÄ. -repos_none=Tev nav nevienas glabÄtavas. +orgs_none=JÅ«s neesat nevienas organizÄcijas biedrs. +repos_none=Jums nepieder neviens repozitorijs. 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. +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 izdzēšanu delete_account_title=IzdzÄ“st lietotÄja kontu -delete_account_desc=Vai tieÅ¡Äm neatgriezeniski izdzÄ“st Å¡o lietotÄja kontu? +delete_account_desc=Vai tieÅ¡Äm vÄ“laties dzÄ“st Å¡o kontu? email_notifications.enable=IespÄ“jot e-pasta paziņojumus -email_notifications.onmention=Tikai, ja mani piemin +email_notifications.onmention=Tikai, ja piemin mani 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=AtklÄta +visibility.public=Publisks visibility.public_tooltip=Redzams ikvienam visibility.limited=Ierobežota -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? +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 [repo] -new_repo_helper=GlabÄtava satur visas projekta datnes, tajÄ skaitÄ izmaiņu vÄ“sturi. Jau tiek izmantota kaut kur citur? PÄrcelt glabÄtavu. +new_repo_helper=GlabÄtava satur visas projekta datnes, tajÄ skaitÄ izmaiņu vÄ“sturi. Jau tiek izmantota kaut kur citur? PÄrnest glabÄtavu. owner=ĪpaÅ¡nieks -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 +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 template=Sagatave template_select=AtlasÄ«t sagatavi -template_helper=PadarÄ«t glabÄtavu par sagatavi +template_helper=PadarÄ«t repozitoriju 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 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.) +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.) clone_helper=NepiecieÅ¡ama palÄ«dzÄ«ba klonēšanÄ? ApmeklÄ“ palÄ«dzÄ«bas sadaļu. -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. +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. 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=Izveidot glabÄtavu +generate_repo=Ä¢enerÄ“t repozitoriju generate_from=Izveidot no repo_desc=Apraksts -repo_desc_helper=Īss apraksts (pÄ“c izvÄ“les) +repo_desc_helper=Ievadiet Ä«su aprakstu (neobligÄts) repo_lang=Valoda -repo_gitignore_helper=AtlasÄ«t .gitignore sagataves +repo_gitignore_helper=AtlasÄ«t .gitignore sagatavi 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=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. +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. readme=LASIMANI readme_helper=AtlasÄ«t README datnes sagatavi -readme_helper_desc=Å Ä« ir vieta, kurÄ var ievietot izvÄ“rstu aprakstu par projektu. -auto_init=SÄknÄ“t glabÄtavu +readme_helper_desc=Å ajÄ vietÄ ir iespÄ“jams detalizÄ“ti aprakstÄ«t Å¡o projektu. +auto_init=InicializÄ“t repozitoriju (Pievieno .gitignore, licenci un README) trust_model_helper=IzvÄ“lieties parakstu pÄrbaudes uzticamÄ«bas modeli. IespÄ“jamie varianti ir: trust_model_helper_collaborator=LÄ«dzstrÄdnieka: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem trust_model_helper_committer=RevÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjam trust_model_helper_collaborator_committer=LÄ«dzstrÄdnieka un revÄ«zijas iesÅ«tÄ«tÄja: UzticÄ“ties lÄ«dzstrÄdnieku parakstiem, kas atbilst revÄ«zijas iesÅ«tÄ«tÄjam trust_model_helper_default=NoklusÄ“tais: Izmantojiet šī servera noklusÄ“to uzticamÄ«bas modeli -create_repo=Izveidot glabÄtavu +create_repo=Izveidot repozitoriju default_branch=NoklusÄ“juma zars default_branch_label=noklusÄ“juma -default_branch_helper=NoklusÄ“juma zars ir pamata zars izmaiņu pieprasÄ«jumiem un koda iesÅ«tÄ«jumiem. +default_branch_helper=NoklusÄ“tais atzars nosaka pamata atzaru uz kuru tiks veidoti izmaiņu pieprasÄ«jumi un koda revÄ«ziju iesÅ«tīšana. mirror_prune=Izmest -mirror_prune_desc=Noņemt novecojuÅ¡as attÄlÄs izsekoÅ¡anas atsauces +mirror_prune_desc=IzdzÄ“st visas ÄrÄ“jÄs atsauces, kas ÄrÄ“jÄ repozitorijÄ vairs neeksistÄ“ 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_interval_invalid=Nekorekts spoguļoÅ¡anas intervÄls. +mirror_sync_on_commit=SinhronizÄ“t, kad revÄ«zijas tiek iesÅ«tÄ«tas mirror_address=KlonÄ“t no URL -mirror_address_desc=NepiecieÅ¡amie pieslÄ“gÅ¡anÄs dati jÄnorÄda pilnvaroÅ¡anas sadaļÄ. +mirror_address_desc=PieslÄ“gÅ¡anÄs rekvizÄ«tus norÄdiet autorizÄcijas 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 datņu krÄtuve (LFS) -mirror_lfs_desc=AktivÄ“t LFS datu spoguļoÅ¡anu. +mirror_lfs_desc=AktivizÄ“t LFS datu spoguļoÅ¡anu. mirror_lfs_endpoint=LFS galapunkts -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_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_password_placeholder=(bez izmaiņÄm) mirror_password_blank_placeholder=(nav uzstÄdÄ«ts) -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 +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 reactions_more=un vÄ“l %d -unit_disabled=Vietnes pÄrvaldÄ«tÄjs ir atspÄ“jojis Å¡o glabÄtavas sadaļu. +unit_disabled=Administrators ir atspÄ“jojies Å¡o repozitorija sadaļu. language_other=Citas -adopt_search=JÄievada lietotÄjvÄrds, lai meklÄ“tu nepieņemtÄs glabÄtavas… (atstÄt tukÅ¡u, lai atrastu visas) +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 datnes adopt_preexisting=Pieņemt jau esoÅ¡as datnes -adopt_preexisting_content=Izveidot glabÄtavu no %s +adopt_preexisting_content=Izveidot repozitoriju no direktorijas %s adopt_preexisting_success=Pieņemtas datnes un izveidota glabÄtava no %s -delete_preexisting_label=IzdzÄ“st +delete_preexisting_label=DzÄ“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_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. 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=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 +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 -transfer.accept=Pieņemt nodoÅ¡anu +transfer.accept=ApstiprinÄt Ä«paÅ¡nieka maiņu transfer.accept_desc=`MainÄ«t Ä«paÅ¡nieku uz "%s"` -transfer.reject=NoraidÄ«t nodoÅ¡anu +transfer.reject=NoraidÄ«t Ä«paÅ¡nieka maiņu transfer.reject_desc=`Atcelt Ä«paÅ¡nieka maiņu uz "%s"` -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. +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. desc.private=PrivÄts -desc.public=AtklÄts +desc.public=Publisks desc.template=Sagatave desc.internal=Iekšējs desc.archived=ArhivÄ“ts desc.sha256=SHA256 -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.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.topics=TÄ“mas template.avatar=Profila attÄ“ls -template.issue_labels=Pieteikumu iezÄ«mes -template.one_item=JÄatlasa vismaz viens sagataves vienums -template.invalid=JÄatlasa sagataves glabÄtava +template.issue_labels=ProblÄ“mu etiÄ·etes +template.one_item=NorÄdiet vismaz vienu sagataves vienÄ«bu +template.invalid=NorÄdiet sagataves repozitoriju -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. +archive.title=Å Ä« glabÄtava ir arhivÄ“ta. TajÄ var apskatÄ«t datnes, un to var klonÄ“t, bet nevar aizgÄdÄt izmaiņas vai izveidot pieteikumus vai izmaiņu pieprasÄ«jumus. +archive.title_date=Å Ä« glabÄtava tika arhivÄ“ta %s. TajÄ var apskatÄ«t datnes, un to var klonÄ“t, bet nevar aizgÄdÄt izmaiņas vai izveidot pieteikumus 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. -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Ä. +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. -need_auth=PilnvaroÅ¡ana -migrate_options=PÄrcelÅ¡anas iespÄ“jas +need_auth=AutorizÄcija +migrate_options=MigrÄcijas opcijas migrate_service=MigrÄcijas serviss -migrate_options_mirror_helper=Å Ä« glabÄtava bÅ«s spoguļglabÄtava +migrate_options_mirror_helper=Å is repozitorijs bÅ«s spogulis migrate_options_lfs=PÄrcelt LFS datnes migrate_options_lfs_endpoint.label=LFS galapunkts -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=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.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=PÄrcelÅ¡anas vienumi +migrate_items=VienÄ«bas, ko pÄrņemt migrate_items_wiki=Vikivietni migrate_items_milestones=Atskaites punktus -migrate_items_labels=IezÄ«mes -migrate_items_issues=Pieteikumi +migrate_items_labels=EtiÄ·etes +migrate_items_issues=ProblÄ“mas migrate_items_pullrequests=Izmaiņu pieprasÄ«jumus -migrate_items_merge_requests=IekļauÅ¡anas pieprasÄ«jumi +migrate_items_merge_requests=SapludinÄÅ¡anas pieprasÄ«jumi migrate_items_releases=Laidienus -migrate_repo=PÄrcelt glabÄtavu -migrate.clone_address=PÄrcelt/klonÄ“t no URL -migrate.clone_address_desc=EsoÅ¡as glabÄtavas HTTP(S) vai Git "clone" URL -migrate.github_token_desc=Å eit var pievienot vienu vai vairÄkas ar komatiem atdalÄ«tas pilnvaras, lai pÄrcelÅ¡ana bÅ«tu ÄtrÄka, ja tÄ tiek ierobežota no GitHub API puses. UzmanÄ«bu: šīs iespÄ“jas ļaunprÄtÄ«ga izmantoÅ¡ana var pÄrkÄpt pakalpojumu sniedzÄ“ja noteikumus un novest pie piekļuves liegÅ¡anas kontam. +migrate_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.clone_local_path=vai servera lokÄlais ceļš -migrate.permission_denied=Nav ļauts ievietot vietÄ“jas glabÄtavas. -migrate.permission_denied_blocked=Nav iespÄ“jams ievietot no neatļautiem saimniekdatoriem, lÅ«gums vaicÄt pÄrvaldÄ«tÄjam pÄrbaudÄ«t ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS iestatÄ«jumus. -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? +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? -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. +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. unwatch=NevÄ“rot watch=VÄ“rot -unstar=Noņemt no izlases +unstar=Noņemt zvaigznÄ«ti star=Pievienot izlasei -fork=Atzarojums -download_archive=LejupielÄdÄ“t glabÄtavu +fork=AtdalÄ«ts +download_archive=LejupielÄdÄ“t repozitoriju more_operations=VairÄk darbÄ«bu no_desc=Nav apraksta quick_guide=Īsa pamÄcÄ«ba -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. +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. code=Kods code.desc=Piekļuve pirmkodam, datnÄ“m, iesÅ«tÄ«jumiem un zariem. -branch=Zars +branch=Atzars tree=Koks clear_ref=`NotÄ«rÄ«t paÅ¡reizÄ“jo atsauci` -filter_branch_and_tag=AtlasÄ«t zaru vai birku -find_tag=Atrast birku -branches=Zari -tags=Birkas -issues=Pieteikumi +filter_branch_and_tag=FiltrÄ“t atzarus vai tagus +find_tag=Atrast tagu +branches=Atzari +tags=Tagi +issues=ProblÄ“mas pulls=Izmaiņu pieprasÄ«jumi project_board=Projekti packages=Pakotnes actions=DarbÄ«bas -labels=IezÄ«mes -org_labels_desc=ApvienÄ«bas lÄ«meņa iezÄ«mes var tikt izmantotas šīs apvienÄ«bas visÄs glabÄtavÄs +labels=EtiÄ·etes +org_labels_desc=OrganizÄcijas lÄ«meņa etiÄ·etes var tikt izmantotas visiem repozitorijiem Å¡ajÄ organizÄcijÄ org_labels_desc_manage=pÄrvaldÄ«t milestones=Atskaites punkti -commits=IesÅ«tÄ«jumi -commit=IesÅ«tÄ«jums +commits=RevÄ«zijas +commit=RevÄ«zija release=Laidiens releases=Laidieni -tag=Birka +tag=Tags released_this=izveidoja Å¡o laidienu tagged_this=izveidoja tagu revÄ«zijai -file.title=%s zarÄ %s -file_raw=NeapstrÄdÄta +file.title=%s atzarÄ %s +file_raw=NeapstrÄdÄts file_history=VÄ“sture file_view_source=SkatÄ«t avotu -file_view_rendered=SkatÄ«t atveidojumu -file_view_raw=ApskatÄ«t neapstrÄdÄtu +file_view_rendered=SkatÄ«t rezultÄtu +file_view_raw=RÄdÄ«t neapstrÄdÄtu file_permalink=PatstÄvÄ«gÄ saite file_too_large=Datne ir pÄrÄk liela, lai to parÄdÄ«tu. invisible_runes_header=Å Ä« datne satur neredzamas unikoda rakstzÄ«mes @@ -1352,28 +1188,28 @@ stored_annex=SaglabÄts Git Annex symbolic_link=Simboliska saite executable_file=IzpildÄma datne commit_graph=IesÅ«tÄ«jumu karte -commit_graph.select=AtlasÄ«t zarus +commit_graph.select=IzvÄ“lieties atzarus commit_graph.hide_pr_refs=PaslÄ“pt izmaiņu pieprasÄ«jumus commit_graph.monochrome=Melnbalts commit_graph.color=KrÄsa -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 +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 datni normal_view=Parastais skats line=rinda lines=rindas -from_comment=(piebilde) +from_comment=(komentÄrs) editor.add_file=Pievienot datni editor.new_file=Jauna datne 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 datnes nevar labot tÄ«mekļa saskarnÄ“. +editor.cannot_edit_lfs_files=LFS datnes tÄ«mekļa saskarnÄ“ nevar labot. 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.cannot_edit_non_text_files=BinÄrÄs datnes tÄ«mekļa saskarnÄ“ nevar labot. 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. @@ -1381,66 +1217,65 @@ editor.fork_before_edit=JÄizveido šīs glabÄtavas atzarojums, lai Å¡ajÄ datn 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.name_your_file=JÄpiešķir datnei nosaukums… 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=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_tmpl=Pievienot '' editor.add=Pievienot %s -editor.update=AtjauninÄt %s -editor.delete=IzdzÄ“st %s +editor.update=Atjaunot %s +editor.delete=DzÄ“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=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.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=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.new_branch_name=JaunÄ atzara nosaukums Å¡ai revÄ«zijai +editor.new_branch_name_desc=JaunÄ atzara nosaukums… editor.cancel=Atcelt 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.branch_does_not_exist=Å ajÄ repozitorijÄ neeksistÄ“ atzars "%s". +editor.branch_already_exists=Atzars "%s" Å¡ajÄ repozitorijÄ jau eksistÄ“. 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.file_changed_while_editing=Datnes saturs ir mainÄ«jies kopÅ¡ laboÅ¡anas uzsÄkÅ¡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Ä repozitorijÄ. 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 atjauninÄt/izveidot datni "%s". editor.fail_to_update_file_summary=Kļūdas ziņojums: -editor.push_rejected_no_message=Serveris bez paziņojuma noraidÄ«ja izmaiņas. LÅ«gums pÄrbaudÄ«t Git aizÄ·eres. +editor.push_rejected_no_message=Serveris noraidÄ«ja izmaiņas bez paziņojuma. 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 mapi… +editor.add_subdir=Pievienot direktoriju… 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_file_is_locked=Datni "%s" ir 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.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.cherry_pick=IzlasÄ«t %s uz: editor.revert=Atgriezt %s uz: commits.desc=PÄrlÅ«kot pirmkoda izmaiņu vÄ“sturi. -commits.commits=IesÅ«tÄ«jumi -commits.no_commits=Nav kopÄ«gu iesÅ«tÄ«jumu. "%s" un "%s" ir pilnÄ«gi atšķirÄ«ga vÄ“sture. -commits.nothing_to_compare=Å ie zari ir vienÄdi. +commits.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.search=MeklÄ“t revÄ«zijas… -commits.search.tooltip=AtslÄ“gvÄrdu sÄkumÄ var pievienot "author:", "committer:", "after:" vai "before:", piemÄ“ram, "revert author:Anna before:2019-01-13". +commits.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.find=MeklÄ“t commits.search_all=Visi zari commits.author=Autors @@ -1450,41 +1285,41 @@ 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, kurÅ¡ neatbilst iesÅ«tÄ«tÄjam -commits.gpg_key_id=GPG atslÄ“gas identifikators +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 nospiedums -commits.view_path=ApskatÄ«t Å¡ajÄ vÄ“stures punktÄ +commits.view_path=SkatÄ«t Å¡ajÄ vÄ“stures punktÄ commit.operations=DarbÄ«bas commit.revert=Atgriezt commit.revert-header=Atgriezt: %s -commit.revert-content=AtlasÄ«t zaru, no kura atjaunot: +commit.revert-content=NorÄdiet atzaru uz kuru atgriezt: commit.cherry-pick=IzlasÄ«t commit.cherry-pick-header=IzlasÄ«t: %s -commit.cherry-pick-content=AtlasÄ«t zaru, uz kuru izlasÄ«t: +commit.cherry-pick-content=NorÄdiet atzaru uz kuru izlasÄ«t: commitstatus.error=Kļūda -commitstatus.failure=Atteice +commitstatus.failure=Kļūme commitstatus.pending=Nav iesÅ«tÄ«ts commitstatus.success=Pabeigts -ext_issues=Ä€rÄ“ji pieteikumi +ext_issues=Piekļuve ÄrÄ“jiem pieteikumiem ext_issues.desc=Saite uz ÄrÄ“jo problÄ“mu sekotÄju. projects=Projekti -projects.desc=PÄrvaldÄ«t pieteikumus un izmaiņu pieprasÄ«jumus projektos. -projects.description=Apraksts (pÄ“c izvÄ“les) +projects.desc=PÄrvaldÄ«t problÄ“mu un izmaiņu pieprasÄ«jumu projektu dēļus. +projects.description=Apraksts (neobligÄts) projects.description_placeholder=Apraksts projects.create=Izveidot projektu projects.title=Nosaukums projects.new=Jauns projekts -projects.new_subheader=Saskaņo, pÄrraugi un atjaunini savu darbu vienÄ vietÄ, lai projekti bÅ«tu caurskatÄmi un vienmÄ“r laikÄ. +projects.new_subheader=KoordinÄ“, seko un atjauno savu darbu centralizÄ“ti, lai projekts bÅ«tu izsekojams un vienmÄ“r laikÄ. projects.create_success=Projekts "%s" tika izveidots. projects.deletion=IzdzÄ“st projektu -projects.deletion_desc=Projekta izdzēšana noņem to no visiem saistÄ«tajiem pieteikumiem. TurpinÄt? +projects.deletion_desc=Dzēšot projektu no tÄ tiks atsaistÄ«tÄs visas tam piesaistÄ«tÄs problÄ“mas. Vai turpinÄt? projects.deletion_success=Å is projekts tika izdzÄ“sts. projects.edit=Labot projektu -projects.edit_subheader=Projektos var sakÄrtot pieteikumus un sekot attÄ«stÄ«bai. +projects.edit_subheader=Projekti organizÄ“ problÄ“mas un ļauj izsekot to progresam. projects.modify=Labot projektu projects.edit_success=Projekta "%s" izmaiņas tika saglabÄtas. projects.type.none=Nav @@ -1493,36 +1328,36 @@ projects.type.bug_triage=Kļūdu šķiroÅ¡ana projects.template.desc=Sagatave projects.template.desc_helper=JÄatlasa projekta sagatave, lai uzsÄktu projects.type.uncategorized=Bez kategorijas -projects.column.edit=Labot aili +projects.column.edit=Labot kolonnu projects.column.edit_title=Nosaukums projects.column.new_title=Nosaukums -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.new_submit=Izveidot kolonnu +projects.column.new=Jauna kolonna +projects.column.set_default=IestatÄ«t kÄ noklusÄ“jumu +projects.column.set_default_desc=IestatÄ«t Å¡o kolonnu kÄ noklusÄ“jumu neapkopotiem pieteikumiem un izmaiņu pieprasÄ«jumiem projects.column.unset_default=AtiestatÄ«t noklusÄ“to projects.column.unset_default_desc=Noņemt Å¡o kolonnu kÄ noklusÄ“to -projects.column.delete=IzdzÄ“st aili -projects.column.deletion_desc=Projekta ailes izdzēšana pÄrvietos visus saistÄ«tos pieteikumus uz noklusÄ“juma aili. TurpinÄt? +projects.column.delete=IzdzÄ“st kolonnu +projects.column.deletion_desc=Projekta kolonnas izdzēšana pÄrvietos visus saistÄ«tos pieteikumus uz noklusÄ“juma kolonnu. TurpinÄt? projects.column.color=KrÄsa -projects.open=AtvÄ“rtie +projects.open=AktÄ«vie projects.close=Pabeigtie projects.column.assigned_to=Piešķirts 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=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.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=Jauns pieteikums issues.new.title_empty=Nosaukums nevar bÅ«t tukÅ¡s -issues.new.labels=IezÄ«mes +issues.new.labels=EtiÄ·etes issues.new.no_label=Nav iezÄ«mju -issues.new.clear_labels=NotÄ«rÄ«t iezÄ«mes +issues.new.clear_labels=Noņemt etiÄ·etes issues.new.projects=Projekti issues.new.clear_projects=NotÄ«rÄ«t projektus issues.new.no_projects=Nav projektu @@ -1530,58 +1365,58 @@ 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 punkta +issues.new.no_milestone=Nav atskaites punktu issues.new.clear_milestone=NotÄ«rÄ«t 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 izskatÄ«tÄju +issues.new.no_reviewers=Nav recenzentu issues.choose.get_started=UzsÄkt darbu issues.choose.open_external_link=AtvÄ“rt issues.choose.blank=NoklusÄ“juma -issues.choose.blank_about=Izveidot pieteikumu no noklusÄ“juma sagataves. +issues.choose.blank_about=Izveidot problÄ“mu ar noklusÄ“juma sagatavi. issues.choose.ignore_invalid_templates=KļūdainÄs sagataves tika izlaistas -issues.choose.invalid_templates=atrasta(s) %v nederÄ«gas(s) sagatave(s) -issues.choose.invalid_config=Pieteikumu konfigurÄcija satur kļūdas: +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 zars/birka issues.create=Izveidot pieteikumu issues.new_label=Jauna iezÄ«me -issues.new_label_placeholder=IezÄ«mes nosaukums +issues.new_label_placeholder=EtiÄ·etes nosaukums issues.new_label_desc_placeholder=Apraksts 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.title=IelÄdÄ“t iepriekÅ¡ noteiktu iezÄ«mju 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 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_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.add_milestone_at=`pievienoja atskaites punktu %s %s` -issues.add_project_at=`pievienoja Å¡o projektam %s %s` +issues.add_project_at=`pievienoja Å¡o problÄ“mu %s projektam %s` issues.change_milestone_at=`nomainÄ«ja atskaites punktu no %s uz %s %s` -issues.change_project_at=`nomainÄ«ja projektu no %s uz %s %s` +issues.change_project_at=`pÄrvietoja Å¡o problÄ“mu no %s projekta uz %s %s` issues.remove_milestone_at=`noņēma atskaites punktu %s %s` -issues.remove_project_at=`noņēma Å¡o no projekta %s %s` -issues.deleted_milestone=`(izdzÄ“sts)` -issues.deleted_project=`(izdzÄ“sts)` +issues.remove_project_at=`noņēma Å¡o problÄ“mu no %s projekta %s` +issues.deleted_milestone=`(dzÄ“sts)` +issues.deleted_project=`(dzÄ“sts)` issues.self_assign_at=`piešķīra sev %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.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.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 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.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.filter_milestone=Atskaites punkts issues.filter_milestone_all=Visi atskaites punkti issues.filter_milestone_none=Nav atskaites punkta @@ -1596,481 +1431,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=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_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_sort=KÄrtot issues.filter_sort.latest=JaunÄkie issues.filter_sort.oldest=Vecakie -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.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.nearduedate=TuvÄkais termiņš issues.filter_sort.farduedate=TÄlÄkais termiņš -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.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.keyword_search_unavailable=Meklēšana pÄ“c atslÄ“gvÄrda paÅ¡reiz nav pieejama. LÅ«gums sazinÄties ar vietnes administratoru. issues.action_open=AtvÄ“rt issues.action_close=AizvÄ“rt -issues.action_label=IezÄ«me +issues.action_label=EtiÄ·ete 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 vienumus +issues.action_check_all=AtzÄ«mÄ“t/NotÄ«rÄ«t visus ierakstus issues.opened_by=%[3]s atvÄ“ra %[1]s -pulls.merged_by=%[3]s iekļÄva %[1]s -pulls.merged_by_fake=%[2]s iekļÄva %[1]s +pulls.merged_by=%[3]s sapludinÄja %[1]s +pulls.merged_by_fake=%[2]s sapludinÄja %[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Ä“rti -issues.closed_title=AizvÄ“rts +issues.open_title=AtvÄ“rta +issues.closed_title=SlÄ“gta issues.draft_title=Melnraksts -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.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.context.edit=Labot -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.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.reopen_issue=AtvÄ“rt atkÄrtoti -issues.reopen_comment_issue=AtkÄrtoti atvÄ“rt ar piebildi -issues.create_comment=Pievienot piebildi -issues.closed_at=`aizvÄ“ra Å¡o pieteikumu %[2]s` -issues.reopened_at=`atkÄrtoti atvÄ“ra Å¡o pieteikumu %[2]s` -issues.commit_ref_at=`atsaucÄs uz Å¡o pieteikumu iesÅ«tÄ«jumÄ %[2]s` -issues.ref_issue_from=`atsaucÄs uz Å¡o pieteikumu %[4]s %[2]s` +issues.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.ref_pull_from=`atsaucÄs uz Å¡o izmaiņu pieprasÄ«jumu %[4]s %[2]s` -issues.ref_closing_from=`atsaucÄs uz Å¡o pieteikumu izmaiņu pieprasÄ«jumÄ %[4]s, kas aizvÄ“rs to, %[2]s` -issues.ref_reopening_from=`atsaucÄs uz Å¡o pieteikumu izmaiņu pieprasÄ«jumÄ %[4]s, kas atkÄrtoti atvÄ“rs to, %[2]s` -issues.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_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_from=`no %[1]s` issues.author=Autors issues.author_helper=Å is lietotÄjs ir autors. issues.role.owner=ĪpaÅ¡nieks -issues.role.owner_helper=Å is lietotÄjs ir šīs glabÄtavas Ä«paÅ¡nieks. +issues.role.owner_helper=Å is lietotÄjs ir šī repozitorija Ä«paÅ¡nieks. issues.role.member=DalÄ«bnieks -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.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.sign_in_require_desc=NepiecieÅ¡ams pieteikties, lai pievienotos Å¡ai sarunai. issues.edit=Labot issues.cancel=Atcelt issues.save=SaglabÄt -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_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_edit=Labot -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_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.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=`KlikšķinÄt, lai apskatÄ«tu "%s" jaunÄ cilnÄ“` -issues.attachment.download=`KlikšķinÄt, lai lejupielÄdÄ“tu "%s"` +issues.attachment.open_tab=`Noklikšķiniet, lai apskatÄ«tos "%s" jaunÄ logÄ` +issues.attachment.download=`Noklikšķiniet, lai lejupielÄdÄ“tu "%s"` issues.subscribe=AbonÄ“t issues.unsubscribe=AtrakstÄ«ties -issues.unpin_issue=Atspraust pieteikumu -issues.max_pinned=Nevar piespraust vairÄk pieteikumu +issues.unpin_issue=Atspraust problÄ“mu +issues.max_pinned=Nevar piespraust vairÄk problÄ“mas issues.pin_comment=piesprauda Å¡o %s issues.unpin_comment=atsprauda Å¡o %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=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_confirm=SlÄ“gt -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.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.lock.reason=SlÄ“gÅ¡anas iemesls -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.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.tracker=Laika uzskaite -issues.start_tracking_short=UzsÄkt laika uzskaitīšanu +issues.start_tracking_short=UzsÄkt taimeri issues.start_tracking=UzsÄkt laika uzskaiti issues.start_tracking_history=` uzsÄka darbu %s` -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.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.stop_tracking_history=` beidza strÄdÄt %s` issues.cancel_tracking=Atmest -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.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.add_time_short=Pievienot laiku issues.add_time_cancel=Atcelt issues.add_time_history=` pievienoja patÄ“rÄ“to laiku %s` -issues.del_time_history=`izdzÄ“sa patÄ“rÄ“to laiku %s` +issues.del_time_history=`dzÄ“sts patÄ“rÄ“tais laiks %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 datums +issues.due_date=Izpildes termiņš issues.invalid_due_date_format=Izpildes termiņam ir jÄbÅ«t formÄta 'yyyy-mm-dd'. issues.error_modifying_due_date=NeizdevÄs izmainÄ«t izpildes termiņu. issues.error_removing_due_date=NeizdevÄs noņemt izpildes termiņu. -issues.push_commit_1=pievienoja %d iesÅ«tÄ«jumu %s -issues.push_commits_n=pievienoja %d iesÅ«tÄ«jumus %s -issues.force_push_codes=`veica uzspiestu aizgÄdÄÅ¡anu zarÄ %[1]s no %[2]s uz %[4]s %[6]s` +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.force_push_compare=SalÄ«dzinÄt -issues.due_date_form=dd.mm.gggg. +issues.due_date_form=dd.mm.yyyy issues.due_date_form_add=Pievienot izpildes termiņu issues.due_date_form_edit=Labot issues.due_date_form_remove=Noņemt issues.due_date_not_writer=Ir nepiecieÅ¡ama rakstīšanas piekļuve Å¡im repozitorijam, lai varÄ“tu mainÄ«t problÄ“mas plÄnoto izpildes datumu. -issues.due_date_not_set=Nav uzstÄdÄ«ts izpildes datums. -issues.due_date_added=pievienoja izpildes datumu %s %s -issues.due_date_modified=mainÄ«ja izpildes datumu no %[2]s uz %[1]s %[3]s -issues.due_date_remove=noņēma izpildes datumu %s %s +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_overdue=NokavÄ“ts -issues.due_date_invalid=Izpildes datums nav derÄ«gs vai tas ir Ärpus datumu apgabala. LÅ«gums izmantot pierakstu "gggg-mm-dd". +issues.due_date_invalid=Datums lÄ«dz nav korekts. Izmantojiet formÄtu '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 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.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.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=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.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.blocked_by_short=AtkarÄ«gs no issues.dependency.remove_header=Noņemt atkarÄ«bu -issues.dependency.issue_remove_text=Tas noņems atkarÄ«bu no šī pieteikuma. TurpinÄt? +issues.dependency.issue_remove_text=Å Ä« darbÄ«ba noņems atkarÄ«bu no šīs problÄ“mas. 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 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.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.add_error_dep_exists=AtkarÄ«ba jau ir pievienota. -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.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.review.self.rejection=Nevar pieprasÄ«t izmaiņas savam izmaiņu pieprasÄ«jumam. -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.approve=apstiprinÄja izmaiņas %s +issues.review.comment=recenzÄ“ja %s +issues.review.dismissed=atmeta %s recenziju %s issues.review.dismissed_label=Atmesta -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.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.pending=Nav iesÅ«tÄ«ts -issues.review.pending.tooltip=Å Ä« piebilde pagaidÄm nav redzama citiem lietotÄjiem. Lai iesniegtu savas ierindotÄs piebildes, lapas augÅ¡daÄ¼Ä jÄatlasa "%s" -> "%s/%s/%s". -issues.review.review=Izskatīšana -issues.review.reviewers=IzskatÄ«tÄji -issues.review.outdated=Novecojusi -issues.review.outdated_description=PÄ“c šīs piebildes pievienoÅ¡anas ir mainÄ«jies saturs -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.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.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 Å¡o sarunu kÄ atrisinÄtu +issues.review.resolved_by=atzÄ«mÄ“ja sarunu kÄ atrisinÄtu issues.assignee.error=Ne visi atbildÄ«gie tika pievienoti, jo radÄs neparedzÄ“ta kļūda. issues.reference_issue.body=Saturs -issues.content_history.deleted=izdzÄ“sts -issues.content_history.edited=labots +issues.content_history.deleted=dzÄ“sts +issues.content_history.edited=rediģēts issues.content_history.created=izveidots -issues.content_history.delete_from_history=IzdzÄ“st no vÄ“stures -issues.content_history.delete_from_history_confirm=IzdzÄ“st no vÄ“stures? +issues.content_history.delete_from_history=DzÄ“st no vÄ“stures +issues.content_history.delete_from_history_confirm=Vai dzÄ“st no vÄ“stures? issues.content_history.options=IespÄ“jas -issues.reference_link=Atsauce: %s +issues.reference_link=Atsaucas uz: %s compare.compare_base=pamata compare.compare_head=salÄ«dzinÄt -pulls.desc=IespÄ“jot izmaiņu pieprasÄ«jumus un koda izskatīšanu. +pulls.desc=IespÄ“jot izmaiņu pieprasÄ«jumus un koda recenzēšanu. pulls.new=Jauns izmaiņu pieprasÄ«jums -pulls.view=ApskatÄ«t izmaiņu pieprasÄ«jumu +pulls.view=SkatÄ«ties 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 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.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=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=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.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.no_results=Nekas netika atrasts. -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.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.create=Izveidot izmaiņu pieprasÄ«jumu -pulls.title_desc_few=vÄ“las iekļaut %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s -pulls.merged_title_desc_few=IekļÄva %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s %[4]s -pulls.change_target_branch_at=`nomainÄ«ja mÄ“rÄ·a zaru no %s uz %s %s` +pulls.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.tab_conversation=Saruna -pulls.tab_commits=IesÅ«tÄ«jumi +pulls.tab_commits=RevÄ«zijas 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.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.closed=Izmaiņu pieprasÄ«jums aizvÄ“rts -pulls.manually_merged=PaÅ¡rocÄ«gi apvienots -pulls.merged_info_text=Zaru %s tagad var izdzÄ“st. +pulls.manually_merged=ManuÄli sapludinÄts +pulls.merged_info_text=Atzaru %s tagad var dzÄ“st. pulls.is_closed=Izmaiņu pieprasÄ«jums tika aizvÄ“rts. -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.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.still_in_progress=JoprojÄm notiek izstrÄde? -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.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.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 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_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 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.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 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 labojumu pieprasÄ«jums +pulls.reject_count_1=%d izmaiņu 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.wrong_commit_id=iesÅ«tÄ«juma identifikatoram jÄbÅ«t mÄ“rÄ·a zara iesÅ«tÄ«juma identifikatoram -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.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.invalid_merge_option=Å im izmaiņu pieprasÄ«jumam nevar izmantot Å¡o apvienoÅ¡anas iespÄ“ju. +pulls.invalid_merge_option=Nav iespÄ“jams izmantot Å¡Ädu sapludinÄÅ¡anas veidu Å¡im izmaiņu pieprasÄ«jumam. 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.merge_out_of_date=ApvienoÅ¡ana neizdevÄs: apvienoÅ¡anas laikÄ pamata zars tika atjauninÄts. NorÄde: jÄmēģina vÄ“lreiz. +pulls.head_out_of_date=ApvienoÅ¡ana neizdevÄs: apvienoÅ¡anas laikÄ galotne tika atjauninÄta. NorÄde: jÄmēģina vÄ“lreiz. +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=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=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.push_rejected_no_message=ApvienoÅ¡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=`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.status_checking=Dažas pÄrbaudes vÄ“l tiek veiktas -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_success=Visas pÄrbaudes ir veiksmÄ«gas +pulls.status_checks_warning=Dažas pÄrbaudes ziņoja brÄ«dinÄjumus pulls.status_checks_failure=Dažas pÄrbaudes neizdevÄs izpildÄ«t -pulls.status_checks_error=Dažas pÄrbaudes atgrieza kļūdas -pulls.status_checks_requested=NepiecieÅ¡ama +pulls.status_checks_error=Dažu pÄrbaužu izpildes laikÄ, radÄs kļūdas +pulls.status_checks_requested=ObligÄts 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=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.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.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_checkout_title=Paņemt -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.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.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_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_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_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_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.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.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.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.recently_pushed_new_branches=Tu aizgÄdÄji izmaiņas zarÄ %[1]s %[2]s +pulls.recently_pushed_new_branches=Tu iesÅ«tÄ«ji izmaiņas atzarÄ %[1]s %[2]s pull.deleted_branch=(izdzÄ“sts):%s milestones.new=Jauns atskaites punkts milestones.closed=AizvÄ“rts %s -milestones.update_ago=AtjauninÄts %s +milestones.update_ago=Atjaunots %s milestones.no_due_date=Bez termiņa -milestones.open=AtvÄ“rts +milestones.open=AtvÄ“rta milestones.close=AizvÄ“rt -milestones.new_subheader=Atskaites punkti var palÄ«dzÄ“t pÄrvaldÄ«t pieteikumus un sekot to attÄ«stÄ«bai. -milestones.completeness=Pabeigtni %d%% +milestones.new_subheader=Atskaites punkti var palÄ«dzÄ“t pÄrvaldÄ«t problÄ“mas un sekot to virzÄ«bai. +milestones.completeness=%d%% pabeigti milestones.create=Izveidot atskaites punktu milestones.title=Virsraksts milestones.desc=Apraksts milestones.due_date=Beigu datums (pÄ“c izvÄ“les) milestones.clear=NotÄ«rÄ«t -milestones.invalid_due_date_format=Beigu datuma pierakstam ir jÄbÅ«t "yyyy-mm-dd". -milestones.create_success=Tika izveidots atskaites punkts "%s". +milestones.invalid_due_date_format=Beigu datuma pierakstam ir jÄbÅ«t 'yyyy-mm-dd'. +milestones.create_success=Atskaites punkts "%s" tika veiksmÄ«gi izveidots. milestones.edit=Labot atskaites punktu -milestones.edit_subheader=Atskaites punkti ļauj sakÄrtot pieteikumus un sekot attÄ«stÄ«bai. +milestones.edit_subheader=Atskaites punkti, ļauj organizÄ“t problÄ“mas un sekot to progresam. milestones.cancel=Atcelt milestones.modify=AtjauninÄt atskaites punktu -milestones.edit_success=Atskaites punkts "%s" tika atjauninÄts. +milestones.edit_success=Izmaiņas atskaites punktÄ "%s" tika veiksmÄ«gi saglabÄtas. 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.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=TuvÄkais izpildes datums +milestones.filter_sort.latest_due_date=TÄ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 pieteikumu -milestones.filter_sort.least_issues=VismazÄk pieteikumu +milestones.filter_sort.most_issues=VisvairÄk problÄ“mu +milestones.filter_sort.least_issues=VismazÄk problÄ“mu -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.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 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. +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. -ext_wiki=Ä€rÄ“ja vikivietne +ext_wiki=Piekļuve ÄrÄ“jai vikivietnei ext_wiki.desc=Ä€rÄ“jÄ vikivietne norÄda uz ÄrÄ“jo vikivietnes adresi. wiki=Vikivietne -wiki.welcome=Laipni lÅ«dzam vikivietnÄ“. -wiki.welcome_desc=Vikivietne ļauj rakstÄ«t un kopÄ«got dokumentÄciju ar lÄ«dzdalÄ«bniekiem. -wiki.desc=DokumentÄcijas rakstīšana un kopÄ«goÅ¡ana ar lÄ«dzdalÄ«bniekiem. +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.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=RakstÄ«t piezÄ«mes par šīs lapas izmaiņÄm (pÄ“c izvÄ“les). +wiki.default_commit_message=Ierakstiet piezÄ«mes par šīs lapas izmaiņÄm (neobligÄts). 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 labojums -wiki.wiki_page_revisions=Vikivietnes lapas labojumi +wiki.file_revision=Lapas rediģējums +wiki.wiki_page_revisions=Vikivietnes lapas rediģējumi wiki.back_to_wiki=Atpakaļ uz vikivietnes lapu -wiki.delete_page_button=IzdzÄ“st lapu +wiki.delete_page_button=DzÄ“st lapu wiki.delete_page_notice_1=Å Ä« darbÄ«ba izdzÄ“sÄ«s vikivietnes lapu "%s". Vai turpinÄt? -wiki.page_already_exists=Jau pastÄv vikivietnes lapa ar tÄdu paÅ¡u nosaukumu. +wiki.page_already_exists=Vikivietnes lapa ar Å¡Ädu nosaukumu jau eksistÄ“. 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=JÄievada šīs vikivietnes lapas nosaukums. Daži Ä«paÅ¡ie nosaukumi ir: "Home", "_Sidebar" un "_Footer". +wiki.page_name_desc=Ievadiet vikivietnes lapas nosaukumu. SpeciÄlie 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=Notikumi -activity.period.filter_label=Laika posms: +activity=AktivitÄte +activity.period.filter_label=Laika periods: activity.period.daily=1 diena activity.period.halfweekly=3 dienas activity.period.weekly=1 nedēļa @@ -2079,51 +1914,51 @@ 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 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.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.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 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.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.issues_created_by=%s izveidoja %s -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.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.unresolved_conv_label=AtvÄ“rts -activity.title.releases_1=%d laidiens +activity.title.releases_1=%d versiju activity.title.releases_n=%d laidieni -activity.title.releases_published_by=%s laida klÄjÄ %s +activity.title.releases_published_by=%s publicÄ“ja %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 apvienoÅ¡anas iesÅ«tÄ«jumus, +activity.git_stats_exclude_merges=Neskaitot sapludinÄÅ¡anas revÄ«zijas, activity.git_stats_author_1=%d autors activity.git_stats_author_n=%d autori -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_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 datne activity.git_stats_file_n=%d datnes activity.git_stats_files_changed_1=tika izmainÄ«ts @@ -2132,10 +1967,10 @@ 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 izdzēšana -activity.git_stats_deletion_n=%d izdzēšanas +activity.git_stats_deletion_1=%d dzēšana +activity.git_stats_deletion_n=%d dzēšanas -contributors.contribution_type.commits=IesÅ«tÄ«jumi +contributors.contribution_type.commits=RevÄ«zijas search=MeklÄ“t search.search_repo=Meklēšana repozitorijÄ @@ -2149,46 +1984,46 @@ search.code_no_results=Netika atrasts pirmkods, kas atbilstu kritÄ“rijiem. search.code_search_unavailable=PaÅ¡laik koda meklēšana nav pieejama. Sazinieties ar lapas administratoru. settings=IestatÄ«jumi -settings.desc=IestatÄ«jumi ir vieta, kur pÄrvaldÄ«t glabÄtavas iestatÄ«jumus -settings.options=GlabÄtava -settings.collaboration=LÄ«dzdalÄ«bnieki -settings.collaboration.admin=PÄrvaldÄ«tÄjs -settings.collaboration.write=RakstÄ«t -settings.collaboration.read=LasÄ«t +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.collaboration.owner=ĪpaÅ¡nieks settings.collaboration.undefined=NedefinÄ“tas -settings.hooks=TÄ«mekļa aizÄ·eres +settings.hooks=TÄ«mekļa ÄÄ·i settings.githooks=Git aizÄ·eres settings.basic_settings=PamatiestatÄ«jumi -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=Spoguļservera 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.direction=Virziens -settings.mirror_settings.direction.pull=AtgÄdÄÅ¡ana -settings.mirror_settings.direction.push=AizgÄdÄÅ¡ana +settings.mirror_settings.direction.pull=Izmaiņu saņemÅ¡ana +settings.mirror_settings.direction.push=Izmaiņu nosÅ«tīšana settings.mirror_settings.last_update=PÄ“dÄ“jÄs izmaiņas -settings.mirror_settings.push_mirror.none=Nav pievienotu aizgÄdÄÅ¡anas spoguļglabÄtavu +settings.mirror_settings.push_mirror.none=Nav konfigurÄ“ts iesÅ«tīšanas spogulis 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.mirror_settings.push_mirror.add=Pievienot aizgÄdÄÅ¡anas spoguļserveri +settings.mirror_settings.push_mirror.edit_sync_time=Labot spoguļa sinhronizÄcijas intervÄlu settings.sync_mirror=SinhronizÄ“t tagad -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.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=SaglabÄt iestatÄ«jumus -settings.update_mirror_settings=AtjauninÄt spoguļglabÄtavas iestatÄ«jumus +settings.update_mirror_settings=AtjauninÄt spoguļservera 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 @@ -2197,219 +2032,219 @@ settings.wiki_desc=IespÄ“jot glabÄtavas vikivietni settings.use_internal_wiki=Izmantot iebÅ«vÄ“to vikivietni 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_error=Ä€rÄ“jÄs vikivietnes URL nav korekts 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 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.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Ä pieteikumu izsekotÄja URL veidols +settings.tracker_url_format_error=Ä€rÄ“jÄ problÄ“mu sekotÄja URL formÄts nav korekts URL. +settings.tracker_issue_style=Ä€rÄ“jÄ pieteikumu izsekotÄjas numuru veidols 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 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.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.enable_timetracker=IespÄ“jot laika uzskaiti 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.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.pulls.default_allow_edits_from_maintainers=Atļaut uzturÄ“tÄjiem labot pÄ“c noklusÄ“juma 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.actions_desc=IespÄ“jot iekļautos CI/CD cauruļvadus ar Forgejo darbÄ«bÄm 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 rindsarakstam +settings.reindex_button=Pievienot pÄrindeksēšanas rindai settings.reindex_requested=PieprasÄ«ta pÄrindeksēšana -settings.admin_enable_close_issues_via_commit_in_any_branch=AizvÄ“rt pieteikumu ar iesÅ«tÄ«jumu ne noklusÄ“juma zarÄ +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Ä«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.new_owner_has_same_repo=Jaunajam Ä«paÅ¡niekam jau ir repozitorijs ar Å¡Ädu 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_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=PÄrveidot glabÄtavu -settings.convert_succeed=SpoguļglabÄtava tika pÄrveidota par parastu glabÄtavu. +settings.convert_succeed=Spogulis tika izmainÄ«ts par parastu repozitoriju. 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_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=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.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.transfer_form_title=Ievadiet repozitorija nosaukumu, lai apstiprinÄtu: -settings.transfer_in_progress=PaÅ¡laik jau ir notiekoÅ¡a nodoÅ¡ana. LÅ«gums to atcelt, ja ir vÄ“lme nodot Å¡o glabÄtavu citam lietotÄjam. -settings.transfer_notices_1=- Tiks zaudÄ“ta piekļuve glabÄtavai, ja tÄ tiks nodota atsevišķam lietotÄjam. -settings.transfer_notices_2=- Tiks saglabÄta piekļuve glabÄtavai, ja tÄ tiks nodota apvienÄ«bai, kurai esi (lÄ«dz)Ä«paÅ¡nieks. -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_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_owner=Jaunais Ä«paÅ¡nieks 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.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 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Ä“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.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=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.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=IzdzÄ“st vikivietnes datus -settings.wiki_deletion_success=GlabÄtavas vikivietnes dati tika izdzÄ“sti. +settings.wiki_deletion_success=Repozitorija 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_desc=Repozitorija dzēšana ir neatgriezeniska un nav atsaucama. settings.delete_notices_1=- Å Ä« darbÄ«ba ir NEATGRIEZENISKA. -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.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=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.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_collaborator=Noņemt -settings.collaborator_deletion=Noņemt lÄ«dzdalÄ«bnieku -settings.collaborator_deletion_desc=LÄ«dzdalÄ«bnieka noņemÅ¡ana atsauks tÄ piekļuvi Å¡ai glabÄtavai. TurpinÄt? -settings.remove_collaborator_success=LÄ«dzdalÄ«bnieks tika noņemts. +settings.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.search_user_placeholder=MeklÄ“t lietotÄju… -settings.org_not_allowed_to_be_collaborator=ApvienÄ«bas nevar tikt pievienotas kÄ lÄ«dzdalÄ«bnieki. -settings.change_team_access_not_allowed=Komandu piekļuves mainīšana glabÄtavai ir pieejama tikai apvienÄ«bas Ä«paÅ¡niekam -settings.team_not_in_organization=Komanda nav tajÄ paÅ¡Ä apvienÄ«bÄ kÄ glabÄtava +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.teams=Komandas settings.add_team=Pievienot komandu -settings.add_team_duplicate=Komandai jau ir piekļuve glabÄtavai -settings.add_team_success=Komandai tagad ir piekļuve glabÄtavai. +settings.add_team_duplicate=Komandai jau ir piekļuve Å¡im repozitorijam +settings.add_team_success=Komandai tagad ir piekļuve Å¡im repozitorijam. settings.search_team=MeklÄ“t komandu… -settings.change_team_permission_tip=Komandas atļauja ir iestatÄ«ta komandas iestatÄ«jumu lapÄ un nav mainÄma katrai glabÄtavai atsevišķi -settings.delete_team_tip=Komandai ir piekļuve visÄm glabÄtavÄm, un to nevar noņemt -settings.remove_team_success=Tika noņemta komandas piekļuve glabÄtavai. +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 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.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 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_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=IzmēģinÄt piegÄdi +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.webhook.request=PieprasÄ«jums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes settings.webhook.payload=Saturs settings.webhook.body=Saturs -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.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 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_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=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.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.payload_url=SaņēmÄ“ja URL settings.http_method=HTTP metode -settings.content_type=POST satura veids +settings.content_type=POST satura tips 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=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_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_create=Izveidot -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_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_wiki=Vikivietni settings.event_wiki_desc=Vikivietnes lapa izveidota, pÄrsaukta, labota vai dzÄ“sta. settings.event_release=Laidiens -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_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_header_pull_request=Izmaiņu pieprasÄ«juma notikumi -settings.event_pull_request=Izmaiņas +settings.event_pull_request=Izmaiņu pieprasÄ«jums 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=Piešķīrums +settings.event_pull_request_assign=Izmaiņu pieprasÄ«juma atbildÄ«gie settings.event_pull_request_assign_desc=Izmaiņu pieprasÄ«jumam piešķirti vai noņemti atbildÄ«gie. -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_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_package=Pakotne -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.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.active=AktÄ«vs -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.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.slack_token=Pilnvara settings.slack_domain=DomÄ“ns settings.slack_channel=KanÄls -settings.add_web_hook_desc=Iekļaut %s savÄ glabÄtavÄ. +settings.add_web_hook_desc=IntegrÄ“t %s repozitorijÄ. settings.web_hook_name_gitea=Gitea settings.web_hook_name_forgejo = Forgejo settings.web_hook_name_gogs=Gogs @@ -2419,7 +2254,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) @@ -2427,174 +2262,174 @@ 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=IzvietoÅ¡anas atslÄ“gas +settings.deploy_keys=Izvietot 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 glabÄtavai. +settings.deploy_key_desc=IzvietoÅ¡anas atslÄ“gÄm ir lasīšanas piekļuve repozitorijam. settings.is_writable=IespÄ“jot rakstīšanas piekļuvi -settings.is_writable_info=Atļaut Å¡ai izvietoÅ¡anas atslÄ“gai aizgÄdÄt uz glabÄtavu. +settings.is_writable_info=Atļaut Å¡ai izvietoÅ¡anas atslÄ“gai nosÅ«tÄ«t izmaiņas uz repozitoriju. 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=Jau pastÄv izvietoÅ¡anas atslÄ“ga ar tÄdu paÅ¡u nosaukumu. +settings.key_name_used=IzvietoÅ¡anas atslÄ“ga ar Å¡Ädu nosaukumu jau eksistÄ“. 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=IzvietoÅ¡anas atslÄ“gas noņemÅ¡ana atsauks tÄs piekļuvi Å¡ai glabÄtavai. TurpinÄt? +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_success=IzvietoÅ¡anas atslÄ“ga tika noņemta. -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.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.protected_branch_can_push=Atļaut izmaiņu nosÅ«tīšanu? settings.protected_branch_can_push_yes=JÅ«s varat nosÅ«tÄ«t izmaiņas settings.protected_branch_can_push_no=JÅ«s nevarat nosÅ«tÄ«t izmaiņas -settings.branch_protection=Zara "%s" aizsargÄÅ¡anas kÄrtulas +settings.branch_protection=Atzara aizsardzÄ«ba atzaram '%s' settings.protect_this_branch=IespÄ“jot atzara aizsardzÄ«bu settings.protect_this_branch_desc=Neļauj atzara dzēšanu, kÄ arÄ« ierobežo izmaiņu iesÅ«tīšanu un sapludinÄÅ¡anu Å¡ajÄ atzarÄ. -settings.protect_disable_push=AtspÄ“jot aizgÄdÄÅ¡anu -settings.protect_disable_push_desc=AizgÄdÄÅ¡ana Å¡ajÄ zarÄ netiks ļauta. -settings.protect_enable_push=IespÄ“jot aizgÄdÄÅ¡anu -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_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_whitelist_search_users=MeklÄ“t lietotÄjus… -settings.protect_whitelist_teams=Komandas, kurÄm ir ļauts aizgÄdÄt izmaiņas +settings.protect_whitelist_teams=Komandas, kas var veikt izmaiņu nosÅ«tīšanu: settings.protect_whitelist_search_teams=MeklÄ“t komandas… -settings.protect_merge_whitelist_committers=IespÄ“jot apvienoÅ¡anas atļauÅ¡anas sarakstu -settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotÄjiem vai komandÄm apvienot izmaiņu pieprasÄ«jumus ar Å¡o zaru. -settings.protect_merge_whitelist_users=LietotÄji, kuri var veikt apvienoÅ¡anu -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_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_status_check_matched=Atbilst -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_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_approvals_whitelist_enabled=Ierobežot apstiprinÄjumus norÄdÄ«tajiem lietotÄjiem vai komandÄm -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_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 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.protect_protected_file_patterns_desc=AizsargÄtÄs datnes nav ļauts tieÅ¡Ä veidÄ mainÄ«t, pat ja lietotÄjam Å¡ajÄ zarÄ ir tiesÄ«bas pievienot, labot vai izdzÄ“st datnes. VairÄkus paraugus var atdalÄ«t ar semikolu (';'). Paraugu pieraksts ir skatÄms %[2]s dokumentÄcijÄ. PiemÄ“ri: .drone.yml, /docs/**/*.txt. +settings.protect_unprotected_file_patterns=NeaizsargÄto datņu paraugs (vairÄkus atdala ar semikolu ';') +settings.protect_unprotected_file_patterns_desc=NeaizsargÄtÄs datnes, kuras ir ļauts izmainÄ«t tieÅ¡Ä veidÄ, apejot aizgÄdÄÅ¡anas ierobežojumu, ja lietotÄjam ir rakstīšanas piekļuve. VairÄki paraugi ir atdalÄmi ar semikolu (';'). Paraugu pierakstu skatÄ«t %[2]s dokumentÄcijÄ. PiemÄ“ri: .drone.yml, /docs/**/*.txt. settings.add_protected_branch=IespÄ“jot aizsargÄÅ¡anu settings.delete_protected_branch=AtspÄ“jot aizsargÄÅ¡anu -settings.update_protect_branch_success=Zara aizsargÄÅ¡anas kÄrtula "%s" tika atjauninÄta. -settings.remove_protected_branch_success=Zara aizsargÄÅ¡anas kÄrtula "%s" tika noņemta. -settings.remove_protected_branch_failed=Zara aizsargÄÅ¡anas kÄrtulas "%s" noņemÅ¡ana neizdevÄs. -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.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=IzdzÄ“st zara 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=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.choose_branch=IzvÄ“lieties atzaru… +settings.no_protected_branch=Nav neviena aizsargÄtÄ atzara. settings.edit_protected_branch=Labot -settings.protected_branch_required_rule_name=JÄnorÄda kÄrtulas nosaukums +settings.protected_branch_required_rule_name=Nav norÄdÄ«ts noteikuma 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.protected_branch_required_approvals_min=PieprasÄ«to recenziju skaits nevar bÅ«t negatÄ«vs. +settings.tags=Tagi 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=Neviens +settings.tags.protection.allowed.noone=Nevienam 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.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=RobotprogrammatÅ«ras pilnvara settings.chat_id=TÄ“rzēšanas ID -settings.thread_id=Pavediena identifikators +settings.thread_id=Pavediena ID settings.matrix.homeserver_url=MÄjas servera URL settings.matrix.room_id=Istabas ID 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.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.lfs=LFS 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_no_lfs_files=Å ajÄ glabÄtavÄ nav uzglabÄtu LFS datņu +settings.lfs_findcommits=Atrast revÄ«zijas 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_noattribute=NorÄdÄ«tÄjam ceļam nav bloķēšanas atribÅ«ta noklusÄ“tajÄ atzarÄ 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_delete_warning=LFS datnes izdzēšana var izraisÄ«t kļūdu "object does not exist" veicot paņemÅ¡anu. 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_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=SlÄ“dzene jau pastÄv: %s -settings.lfs_lock=SlÄ“gt -settings.lfs_lock_path=SlÄ“dzamÄs datnes ceļš… +settings.lfs_lock=BloÄ·Ä“t +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_force_unlock=Piespiedu atslÄ“gÅ¡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 jaucÄ“jkods settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=GlabÄtavÄ -settings.lfs_pointers.exists=PastÄv krÄtuvÄ“ +settings.lfs_pointers.exists=EksistÄ“ glabÄ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Ä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_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_from=no vecÄ atzara nosaukuma settings.rename_branch_to=jaunais atzara nosaukums -settings.rename_branch=PÄrdÄ“vÄ“t zaru +settings.rename_branch=PÄrsaukt atzaru diff.browse_source=PÄrlÅ«kot avotu diff.parent=vecÄks -diff.commit=iesÅ«tÄ«jums +diff.commit=revÄ«zija diff.git-notes=PiezÄ«mes diff.data_not_available=Satura salÄ«dzinÄÅ¡ana nav pieejama diff.options_button=SalÄ«dzinÄÅ¡anas iespÄ“jas -diff.show_diff_stats=RÄdÄ«t apkopojumu +diff.show_diff_stats=RÄdÄ«t statistiku 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=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.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 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.stats_desc_file=%d izmaiņas: %d pievienotas un %d dzÄ“stas diff.bin=BinÄrs diff.bin_not_shown=BinÄrÄ datne netiek rÄdÄ«ta. diff.view_file=ApskatÄ«t datni @@ -2608,58 +2443,58 @@ diff.file_suppressed_line_too_long=Datnes izmaiņas netiek rÄdÄ«tas, jo viena v 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.generated=Ä£enerÄ“ts diff.vendored=ÄrÄ“js -diff.comment.add_line_comment=Pievienot piebildi par rindu -diff.comment.placeholder=IerakstÄ«t piebildi +diff.comment.add_line_comment=Pievienot rindas komentÄru +diff.comment.placeholder=Ievadiet komentÄru 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.add_single_comment=Pievienot vienu komentÄru +diff.comment.add_review_comment=Pievienot komentÄru +diff.comment.start_review=SÄkt recenziju diff.comment.reply=AtbildÄ“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.header=IesÅ«tÄ«t recenziju +diff.review.placeholder=Recenzijas komentÄrs +diff.review.comment=KomentÄ“t diff.review.approve=ApstiprinÄt -diff.review.self_reject=Izmaiņu pieprasÄ«juma iesniedzÄ“ji nevar pieprasÄ«t izmaiņas savam izmaiņu pieprasÄ«jumam +diff.review.self_reject=Izmaiņu pieprasÄ«juma autors 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 iesniedzÄ“ji nevar apstiprinÄt savu izmaiņu pieprasÄ«jumu -diff.committed_by=iesÅ«tÄ«ja +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.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Ä rindÄ ir slÄ“ptas unikoda rakstzÄ«mes +diff.has_escaped=Å ajÄ lÄ«nijÄ ir paslÄ“pti unikoda simboli diff.show_file_tree=ParÄdÄ«t datņu koku diff.hide_file_tree=PaslÄ“pt datņu koku -releases.desc=Projekta versiju un lejupielÄžu pÄrraudzīšana. +releases.desc=PÄrvaldiet projekta versijas un lejupielÄdes. release.releases=Laidieni -release.detail=InformÄcija par laidienu -release.tags=Birkas +release.detail=Laidiena papildus informÄcija +release.tags=Tagi release.new_release=Jauns laidiens release.draft=Melnraksts -release.prerelease=Pirmsizlaide +release.prerelease=Pirmslaidiens release.stable=Stabila release.compare=SalÄ«dzinÄt 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.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=Pirmkods -release.new_subheader=Laidieni apkopo projekta versijas. -release.edit_subheader=Laidieni apkopo projekta versijas. +release.new_subheader=Laidieni palÄ«dz organizÄ“t projekta versijas. +release.edit_subheader=Laidieni palÄ«dz organizÄ“t projekta versijas. release.tag_name=Taga nosaukums release.target=MÄ“rÄ·is -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.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.title=Laidiena nosaukums release.title_empty=Nosaukums nevar bÅ«t tukÅ¡s. -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.message=Aprakstiet Å¡o laidienu +release.prerelease_desc=AtzÄ«mÄ“t kÄ pirmslaidienu +release.prerelease_helper=AtzÄ«mÄ“t, ka Å¡o laidienu nav ieteicams lietot produkcijÄ. release.cancel=Atcelt release.publish=Laist klajÄ laidienu release.save_draft=SaglabÄt melnrakstu @@ -2667,68 +2502,68 @@ 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_desc=Laidiena izdzēšana tikai noņem to no Gitea. TÄ neietekmÄ“s Git tagu, repozitorija saturu vai vÄ“sturi. Vai turpinÄt? release.deletion_success=Laidiens tika izdzÄ“sts. -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.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.downloads=LejupielÄdes release.download_count=LejupielÄdes: %s -release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kÄ birkas ziņojumu. +release.add_tag_msg=Izmantot laidiena nosaukumu un saturu kÄ taga aprakstu. release.add_tag=Izveidot birku -release.releases_for=GlabÄtavas %s laidieni -release.tags_for=%s birkas +release.releases_for=Repozitorja %s laidieni +release.tags_for=Repozitorija %s tagi branch.name=Zara nosaukums -branch.already_exists=Jau pastÄv zars ar nosaukumu "%s". -branch.delete_head=IzdzÄ“st +branch.already_exists=Atzars ar nosaukumu "%s" jau eksistÄ“. +branch.delete_head=DzÄ“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.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.create_from=`no "%s"` -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.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.deleted_by=IzdzÄ“sa %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_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 zaru "%s" branch.download=LejupielÄdÄ“t zaru "%s" -branch.rename=PÄrdÄ“vÄ“t zaru "%s" +branch.rename=PÄrsaukt zaru "%s" branch.search=MeklÄ“t atzarÄ -branch.included_desc=Å is zars ir daļa no noklusÄ“juma zara +branch.included_desc=Å is atzars ir daļa no noklusÄ“ta atzara branch.included=Iekļauts -branch.create_new_branch=Izveidot zaru no zara: -branch.confirm_create_branch=Izveidot zaru -branch.warning_rename_default_branch=Tiek pÄrdÄ“vÄ“ts noklusÄ“juma zars. -branch.rename_branch_to=PÄrdÄ“vÄ“t "%s" par: +branch.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.confirm_rename_branch=PÄrdÄ“vÄ“t atzaru -branch.create_branch_operation=Izveidot zaru -branch.new_branch=Izveidot jaunu zaru -branch.new_branch_from=Izveidot jaunu zaru no "%s" -branch.renamed=Zars %s tika pÄrdÄ“vÄ“ts par %s. +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. -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_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_success=Birka "%s" tika izveidota. +tag.create_success=Tags "%s" tika izveidots. 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. JÄizmanto mazie burti. +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. find_file.go_to_file=Atrast datni find_file.no_matching=Netika atrasta neviena atbilstoÅ¡a datne @@ -2736,341 +2571,161 @@ find_file.no_matching=Netika atrasta neviena atbilstoÅ¡a datne 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=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 +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 members=DalÄ«bnieki teams=Komandas code=Kods lower_members=dalÄ«bnieki -lower_repositories=glabÄtavas +lower_repositories=repozitoriji 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=Komandas nolÅ«ka vai lomas apraksts. -team_access_desc=GlabÄtavu piekļuve +team_desc_helper=Aprakstiet komandas mÄ“rÄ·i vai lomu. +team_access_desc=Piekļuve repozitorijiem team_permission_desc=Atļauja -team_unit_desc=Atļaut piekļuvi glabÄtavas sadaļÄm +team_unit_desc=Atļaut piekļuvi repozitorija sadaļÄm team_unit_disabled=(AtspÄ“jots) -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. +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. settings=IestatÄ«jumi -settings.options=ApvienÄ«ba -settings.full_name=Pilns vÄrds +settings.options=OrganizÄcija +settings.full_name=Pilns vÄrds, uzvÄrds settings.email=E-pasta adrese saziņai -settings.website=TÄ«mekļvietne +settings.website=MÄjas lapa settings.location=AtraÅ¡anÄs vieta settings.permission=TiesÄ«bas -settings.repoadminchangeteam=GlabÄtavas pÄrvaldÄ«tÄjs var pievienot un noņemt komandu piekļuvi +settings.repoadminchangeteam=Repozitorija administrators var pievienot vai noņemt piekļuvi komandÄm settings.visibility=RedzamÄ«ba -settings.visibility.public=AtklÄta -settings.visibility.limited=Ierobežota (redzama tikai lietotÄjiem, kuri ir pieteikuÅ¡ies) +settings.visibility.public=Publiska +settings.visibility.limited=Ierobežots (redzams tikai autentificÄ“tiem lietotÄjiem) settings.visibility.limited_shortname=Ierobežota -settings.visibility.private=PrivÄta (redzama tikai apvienÄ«bas dalÄ«bniekiem) +settings.visibility.private=PrivÄta (redzama tikai organizÄcijas dalÄ«bniekiem) settings.visibility.private_shortname=PrivÄta 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.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.labels_desc=Pievienot iezÄ«mes, kas var tikt izmantotas pieteikumos šīs apvienÄ«bas visÄs glabÄtavÄs. +settings.labels_desc=Pievienojiet etiÄ·etes, kas var tikt izmantotas visos šīs organizÄcijas repozitorijos. -members.membership_visibility=DalÄ«bnieku redzamÄ«ba: +members.membership_visibility=DalÄ«bnieka 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 redzamu +members.private_helper=padarÄ«t redzemu members.member_role=DalÄ«bnieka loma: members.owner=ĪpaÅ¡nieks members.member=DalÄ«bnieks members.remove=Noņemt -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.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.invite_now=UzaicinÄt tagad teams.join=Pievienoties -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.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.none_access=Nav piekļuves -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.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.general_access_helper=Komandas tiesÄ«bas tiks noteiktas pÄ“c tabulas zemÄk. -teams.read_access=LasÄ«t +teams.read_access=SkatīšanÄs teams.read_access_helper=Komanda varÄ“s skatÄ«ties un klonÄ“t šīs organizÄcijas repozitorijus. -teams.write_access=RakstÄ«t +teams.write_access=Rakstīšanas teams.write_access_helper=Å Ä« komanda varÄ“s lasÄ«t un nosÅ«tÄ«t izmaiņas uz tÄs repozitorijiem. -teams.admin_access=PÄrvaldÄ«tÄja piekļuve -teams.admin_access_helper=DalÄ«bnieki var atgÄdÄt un aizgÄdÄt izmaiņas uz komandas glabÄtavÄm un pievienot tÄm lÄ«dzdalÄ«bniekus. +teams.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.no_desc=Komandai nav apraksta teams.settings=IestatÄ«jumi -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.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=AtjauninÄt iestatÄ«jumus -teams.delete_team=IzdzÄ“st komandu -teams.add_team_member=Pievienot komandas dalÄ«bnieku +teams.delete_team=DzÄ“st komandu +teams.add_team_member=Pievienot komandas biedru teams.invite_team_member=`UzaicinÄt komandÄ "%s"` -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.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.delete_team_success=Komanda tika izdzÄ“sta. -teams.read_permission_desc=Å Ä« komanda nodroÅ¡ina lasīšanas piekļuvi: dalÄ«bnieki var apskatÄ«t un klonÄ“t komandas glabÄtavas. -teams.write_permission_desc=Å Ä« komanda nodroÅ¡ina rakstīšanas piekļuvi: dalÄ«bnieki var lasÄ«t un aizgÄdÄt izmaiņas uz komandas glabÄtavÄm. -teams.admin_permission_desc=Å Ä« komanda nodroÅ¡ina pÄrvaldÄ«tÄja piekļuvi: dalÄ«bnieki var lasÄ«t no, aizgÄdÄt izmaiņas uz un pievienot lÄ«dzdalÄ«bniekus komandas glabÄtavÄm. -teams.create_repo_permission_desc=Papildus šī komanda nodroÅ¡ina atļauju Izveidot glabÄtavu: dalÄ«bnieki apvienÄ«bÄ var izveidot jaunas glabÄtavas. -teams.repositories=Komandas glabÄtavas +teams.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.search_repo_placeholder=MeklÄ“t repozitorijÄ… -teams.remove_all_repos_title=Noņemt visas komandas glabÄtavas -teams.remove_all_repos_desc=Å Ä« darbÄ«ba noņems visas komandas glabÄtavas. -teams.add_all_repos_title=Pievienot visas glabÄtavas -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.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.add_duplicate_users=LietotÄjs jau ir Å¡ajÄ komandÄ. -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.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.all_repositories_read_permission_desc=Å Ä« komanda piešķirt skatīšanÄs tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties un klonÄ“t visus organizÄcijas repozitorijus. teams.all_repositories_write_permission_desc=Å Ä« komanda piešķirt laboÅ¡anas tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties un nosÅ«tÄ«t izmaiņas visiem organizÄcijas repozitorijiem. teams.all_repositories_admin_permission_desc=Å Ä« komanda piešķirt administratora tiesÄ«bas visiem repozitorijiem: komandas biedri var skatÄ«ties, nosÅ«tÄ«t izmaiņas un mainÄ«t iestatÄ«jumus visiem organizÄcijas repozitorijiem. -teams.invite.title=Tevi uzaicinÄja pievienoties komandai %s apvienÄ«bÄ %s. +teams.invite.title=Tu esi uzaicinÄts pievienoties organizÄcijas %[2]s komandai %[1]s. teams.invite.by=UzaicinÄja %s -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. +teams.invite.description=Nospiediet pogu zemÄk, lai pievienotos komandai. [admin] -dashboard=PÄrskata panelis +dashboard=Infopanelis self_check=PaÅ¡pÄrbaude identity_access=IdentitÄte un piekļuve users=LietotÄju konti -organizations=ApvienÄ«bas -assets=Koda lÄ«dzekļi -repositories=GlabÄtavas -hooks=TÄ«mekļa aizÄ·eres +organizations=OrganizÄcijas +assets=Koda aktÄ«vi +repositories=Repozitoriji +hooks=TÄ«mekļa ÄÄ·i integrations=IntegrÄcijas authentication=Autentificēšanas avoti -emails=LietotÄju e-pasta adreses +emails=LietotÄja e-pasts config=KonfigurÄcija notices=SistÄ“mas paziņojumi -monitor=PÄrraudzīšana +monitor=UzraudzÄ«ba first_page=PirmÄ last_page=PÄ“dÄ“jÄ total=KopÄ: %d -settings=PÄrvaldīšanas iestatÄ«jumi +settings=Administratora iestatÄ«jumi -dashboard.new_version_hint=Ir pieejama Forgejo %s, paÅ¡laik darbojas %s. VairÄk informÄcijas ir atrodama emuÄrÄ. +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.statistic=Kopsavilkums dashboard.operations=Uzturēšanas darbÄ«bas -dashboard.system_status=SistÄ“mas stÄvoklis +dashboard.system_status=SistÄ“mas statuss dashboard.operation_name=DarbÄ«bas nosaukums dashboard.operation_switch=PÄrslÄ“gt dashboard.operation_run=Palaist @@ -3085,38 +2740,38 @@ 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=Cron kļūda: %s: %[3]s +dashboard.cron.error=Kļūda Cron: %s: %[3]s dashboard.cron.finished=Cron: %[1]s pabeigts -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_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=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.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=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.resync_all_hooks=AtkÄrtoti sinhroznÄ“t pirmssaņemÅ¡anas, atjauninÄÅ¡anas un pÄ“csaņemÅ¡ans aizÄ·eres visÄs glabÄtavÄs +dashboard.reinit_missing_repos=AtkÄrtoti inicializÄ“t visus pazaudÄ“tos Git repozitorijus par kuriem eksistÄ“ ieraksti dashboard.sync_external_users=SinhronizÄ“t ÄrÄ“jo lietotÄju datus -dashboard.cleanup_hook_task_table=IztÄ«rÄ«t tabulu hook_task +dashboard.cleanup_hook_task_table=IztÄ«rÄ«t tÄ«mekļa ÄÄ·u vÄ“sturi 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=PaÅ¡reizÄ“jÄs gorutÄ«nas +dashboard.current_goroutine=IzmantotÄ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 uzmeklēšanas reizes -dashboard.memory_allocate_times=Atmiņas iedalīšanas +dashboard.pointer_lookup_times=RÄdÄ«tÄju pÄrlÅ«koÅ¡anas reizes +dashboard.memory_allocate_times=Atmiņas piešķīrumi 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 @@ -3124,303 +2779,303 @@ 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.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.mspan_structures_obtained=IegÅ«tÄs MSpan struktÅ«ras -dashboard.mcache_structures_usage=MCache struktÅ«ru lietojums +dashboard.mcache_structures_usage=IzmantotÄs MCache struktÅ«ras dashboard.mcache_structures_obtained=IegÅ«tÄs MCache struktÅ«ras -dashboard.profiling_bucket_hash_table_obtained=IegÅ«tÄ profilēšanas groza jaucÄ“jtabula +dashboard.profiling_bucket_hash_table_obtained=IegÅ«tÄ profilēšanas kausa jaucÄ“jtabula dashboard.gc_metadata_obtained=IegÅ«tie GC metadati -dashboard.other_system_allocation_obtained=Citas iegÅ«tÄs sistÄ“mas sadales -dashboard.next_gc_recycle=NÄkamÄ GC atkritne +dashboard.other_system_allocation_obtained=IegÅ«tÄs citas sistÄ“mas sadales +dashboard.next_gc_recycle=NÄkoÅ¡Ä GC atkritne dashboard.last_gc_time=Laiks kopÅ¡ pÄ“dÄ“jÄs GC dashboard.total_gc_time=KopÄ“jais GC izpildes laiks -dashboard.total_gc_pause=KopÄ“jais GC pÄrtraukums -dashboard.last_gc_pause=PedÄ“jais GC pÄrtraukums +dashboard.total_gc_pause=KopÄ“jais GC izpildes laiks +dashboard.last_gc_pause=PedÄ“jÄs GC izpildes laiks dashboard.gc_times=GC reizes -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.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.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 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 +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 -users.user_manage_panel=PÄrvaldÄ«t lietotÄju kontus +users.user_manage_panel=LietotÄju kontu pÄrvaldÄ«ba users.new_account=Izveidot lietotÄja kontu users.name=LietotÄjvÄrds -users.full_name=Pilns vÄrds -users.activated=AktivÄ“ts -users.admin=PÄrvaldÄ«tÄjs +users.full_name=VÄrds, uzvÄrds +users.activated=AktivizÄ“ts +users.admin=Administrators users.restricted=Ierobežots users.reserved=Aizņemts -users.bot=RobotprogrammatÅ«ra +users.bot=Bots users.remote=AttÄls users.2fa=2FA -users.repos=GlabÄtavas +users.repos=Repozitoriji users.created=Izveidots users.last_login=PÄ“dÄ“jÄ pieteikÅ¡anÄs -users.never_login=PieteikÅ¡anÄs nekad nav notikusi -users.send_register_notify=Paziņot par reÄ£istrÄciju e-pastÄ +users.never_login=PieteikÅ¡anÄs nekad nav veikta +users.send_register_notify=NosÅ«tÄ«t lietotÄjam reÄ£istrÄcijas paziņojumu users.new_success=LietotÄja konts "%s" tika izveidots. users.edit=Labot -users.auth_source=AutentificēšanÄs avots +users.auth_source=Autentificēšanas avots users.local=IebÅ«vÄ“tÄ -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.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.edit_account=Labot 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.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.cannot_delete_self=Nevar izdzÄ“st sevi -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_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_packages=Å im lietotÄjam pieder viena vai vairÄkas pakotnes, tÄs nepiecieÅ¡ams izdzÄ“st. -users.deletion_success=LietotÄja konts tika izdzÄ“sts. -users.reset_2fa=AtiestatÄ«t 2FA -users.list_status_filter.menu_text=AtlasÄ«t +users.deletion_success=LietotÄja konts veiksmÄ«gi izdzÄ“sts. +users.reset_2fa=Noņemt 2FA +users.list_status_filter.menu_text=Filtrs 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=PÄrvaldÄ«tÄjs -users.list_status_filter.not_admin=Nav pÄrvaldÄ«tÄjs +users.list_status_filter.is_admin=Admin +users.list_status_filter.not_admin=Nav administrators users.list_status_filter.is_restricted=Ierobežots users.list_status_filter.not_restricted=Nav ierobežots -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.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.details=LietotÄja informÄcija -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.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.filter_sort.name=LietotÄjvÄrds -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.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.duplicate_active=E-pasta adrese jau ir aktÄ«va citam lietotÄjam. -emails.change_email_header=AtjauninÄt e-pasta Ä«pašības -emails.change_email_text=Vai tieÅ¡Äm atjauninÄt Å¡o e-pasta adresi? +emails.change_email_header=Atjaunot e-pasta rekvizÄ«tus +emails.change_email_text=Vai patieÅ¡Äm vÄ“laties atjaunot Å¡o e-pasta adresi? -orgs.org_manage_panel=PÄrvaldÄ«t apvienÄ«bas +orgs.org_manage_panel=OrganizÄciju pÄrvaldÄ«ba orgs.name=Nosaukums orgs.teams=Komandas orgs.members=DalÄ«bnieki -orgs.new_orga=Jauna apvienÄ«ba +orgs.new_orga=Jauna organizÄcija -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.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.owner=ĪpaÅ¡nieks repos.name=Nosaukums -repos.private=PrivÄta +repos.private=PrivÄts repos.watches=VÄ“roÅ¡ana repos.stars=Zvaigznes repos.forks=AtdalÄ«tie -repos.issues=Pieteikumi +repos.issues=ProblÄ“mas repos.size=IzmÄ“rs -repos.lfs_size=LFS lielums +repos.lfs_size=LFS izmÄ“rs -packages.package_manage_panel=PÄrvaldÄ«t pakotnes -packages.total_size=KopÄ“jais lielums: %s -packages.unreferenced_size=Lielums bez atsauces: %s +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.cleanup=NotÄ«rÄ«t novecojuÅ¡os datus -packages.cleanup.success=IzbeiguÅ¡ies dati sekmÄ«gi notÄ«rÄ«ti +packages.cleanup.success=NovecojuÅ¡i dati veiksmÄ«gi notÄ«rÄ«ti packages.owner=ĪpaÅ¡nieks packages.creator=IzveidotÄjs packages.name=Nosaukums packages.version=Versija packages.type=Veids -packages.repository=GlabÄtava +packages.repository=Repozitorijs packages.size=IzmÄ“rs -packages.published=Laista klajÄ +packages.published=PublicÄ“ts -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 +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 -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 +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 -auths.auth_manage_panel=PÄrvaldÄ«t autentificēšanÄs avotus -auths.new=Pievienot autentificēšanas avotu +auths.auth_manage_panel=AutentifikÄcijas avotu pÄrvaldÄ«ba +auths.new=Pievienot autentifikÄcijas 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=Autentificēšanas veids -auths.auth_name=Autentificēšanas nosaukums +auths.auth_type=AutentifikÄcijas tips +auths.auth_name=AutentifikÄcijas 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Äju meklēšanas pamatnosacÄ«jumi +auths.user_base=LietotÄja pamatnosacÄ«jumi auths.user_dn=LietotÄja DN auths.attribute_username=LietotÄjvÄrda atribÅ«ts -auths.attribute_username_placeholder=AtstÄt tukÅ¡u, lai izmantotu Forgejo ievadÄ«to lietotÄjvÄrdu. +auths.attribute_username_placeholder=AtstÄjiet tukÅ¡u, ja vÄ“laties, lai tiek izmantots Forgejo ievadÄ«tais lietotÄjvÄrds. 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=Ä»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.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.group_attribute_list_users=Grupas atribÅ«ts, kas satur sarakstu ar lietotÄjiem -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.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.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 autentificēšanas veids +auths.smtp_auth=SMTP autentifikÄcijas tips auths.smtphost=SMTP resursdators auths.smtpport=SMTP ports auths.allowed_domains=Atļautie domÄ“ni -auths.allowed_domains_helper=AtstÄt tukÅ¡u, lai atļautu visus domÄ“nus. VairÄki domÄ“ni ir atdalÄmi ar komatu (","). +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.skip_tls_verify=Izlaist TLS pÄrbaudi -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.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.disable_helo=AtspÄ“jot HELO -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.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.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=Izmantot pielÄgotus URL noklusÄ“juma URL vietÄ +auths.oauth2_use_custom_url=NoklusÄ“to URL vietÄ izmantot pielÄgotos URL auths.oauth2_tokenURL=Pilnvaras URL -auths.oauth2_authURL=Pilnvarot URL +auths.oauth2_authURL=AutorizÄcijas URL auths.oauth2_profileURL=Profila URL auths.oauth2_emailURL=E-pasta adreses URL -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.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.oauth2_tenant=Nomnieks -auths.oauth2_scopes=Papildu tvÄ“rumi +auths.oauth2_scopes=Papildus tvÄ“rumi auths.oauth2_required_claim_name=NepiecieÅ¡amÄs prasÄ«bas nosaukums -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_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_value=NepiecieÅ¡amÄs prasÄ«bas vÄ“rtÄ«ba -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.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.enable_auto_register=IespÄ“jot automÄtisko reÄ£istrÄciju auths.sspi_auto_create_users=AutomÄtiski izveidot lietotÄjus -auths.sspi_auto_create_users_helper=Ä»auj SSPI autentificēšanÄs veidam automÄtiski izveidot jaunus kontus lietotÄjiem, kas piesakÄs pirmo reizi -auths.sspi_auto_activate_users=AutomÄtiski aktivÄ“t lietotÄjus -auths.sspi_auto_activate_users_helper=Ä»auj SSPI autentificēšanas viedam automÄtiski aktivÄ“t jaunus lietotÄjus +auths.sspi_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_strip_domain_names=Noņemt domÄ“na vÄrdus no lietotÄju vÄrdiem auths.sspi_strip_domain_names_helper=Ja atzÄ«mÄ“ts, domÄ“na vÄrdi tiks noņemti no lietotÄja vÄrdiem, piemÄ“ram, "DOMÄ’NS\lietotÄjs" un "lietotÄjs@domÄ“ns.lv" abi kļūs par tikai "lietotÄjs". auths.sspi_separator_replacement=AtdalÄ«tÄjs, ko izmantot \, / vai @ vietÄ -auths.sspi_separator_replacement_helper=RakstzÄ«me, ko izmantot, lai aizstÄtu atdalÄ«tÄjus zemÄka lÄ«meņa pieteikÅ¡anÄs vÄrdos (piem., "\" vÄ“rtÄ«bÄ "DOMÄ’NS\lietotÄjs") un lietotÄja identitÄÅ¡u nosaukumos (piemÄ“ram, "@" vÄ“rtÄ«bÄ "lietotajs@example.org"). -auths.sspi_default_language=LietotÄju noklusÄ“juma valoda -auths.sspi_default_language_helper=NoklusÄ“juma valoda lietotÄjiem, kurus automÄtiski izveido SSPI autentificēšanÄs veids. AtstÄt tukÅ¡u, ja ir vÄ“lams, lai valoda tiktu noteikta automÄtiski. +auths.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.tips=Padomi -auths.tips.oauth2.general=OAuth2 autentificēšanÄs -auths.tips.oauth2.general.tip=Kad tiek reÄ£istrÄ“ta jauna OAuth2 autentificēšana, atzvanīšanas/pÄrvirzīšanas URL vajadzÄ“tu bÅ«t: -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.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.tip.gitlab=ReÄ£istrÄ“jiet jaunu aplikÄciju adresÄ“ https://gitlab.com/profile/applications -auths.tip.google_plus=OAuth2 klienta piekļuves dati ir iegÅ«stami Google API konsolÄ“ %s -auths.tip.openid_connect=JÄizmanto OpenID savienoÅ¡anÄs atklÄÅ¡anas URL (/.well-known/openid-configuration), lai norÄdÄ«tu galapunktus -auths.tip.twitter=JÄdodas uz %s, jÄizveido lietotne un jÄnodroÅ¡ina, ka iespÄ“ja "Allow this application to be used to Sign in with Twitter" ir iespÄ“jota -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.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.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=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://) +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://) config.server_config=Servera konfigurÄcija -config.app_name=Servera nosaukums +config.app_name=Vietnes nosaukums config.app_ver=Forgejo versija -config.app_url=Pamata URL +config.app_url=Forgejo 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.domain=Servera domÄ“ns config.offline_mode=Bezsaistes 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.disable_router_log=AtspÄ“jot marÅ¡rutÄ“tÄja žurnalizēšanu +config.run_user=Izpildes lietotÄjs +config.run_mode=Izpildes režīms config.git_version=Git versija config.app_data_path=Lietotnes datu 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.repo_root_path=Repozitoriju glabÄÅ¡anas vieta +config.lfs_root_path=LFS saknes ceļš +config.log_file_root_path=Žurnalizēšanas ceļš config.script_type=Skripta veids -config.reverse_auth_user=ApvÄ“rstÄ starpniekservera autentificēšanÄs lietotÄjs +config.reverse_auth_user=ReversÄ lietotÄja autentifikÄcija 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Ä“na vÄrds +config.ssh_domain=SSH servera domÄ“ns config.ssh_port=Ports config.ssh_listen_port=KlausīšanÄs ports -config.ssh_root_path=AtraÅ¡anÄs vieta +config.ssh_root_path=Saknes ceļš config.ssh_key_test_path=AtslÄ“gu pÄrbaudes ceļš -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.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.lfs_config=LFS konfigurÄcija config.lfs_enabled=IespÄ“jots -config.lfs_content_path=LFS satura atraÅ¡anÄs vieta -config.lfs_http_auth_expiry=LFS HTTP pilnvaroÅ¡anas derÄ«guma laiks +config.lfs_content_path=LFS satura ceļš +config.lfs_http_auth_expiry=LFS HTTP autorizÄcijas beigÅ¡anÄs -config.db_config=DatubÄzes konfigurÄcija +config.db_config=Datu bÄzes konfigurÄcija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums @@ -3430,29 +3085,29 @@ config.db_ssl_mode=SSL config.db_path=Ceļš config.service_config=Pakalpojuma konfigurÄcija -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.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.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 apskatÄ«tu saturu +config.require_sign_in_view=PieprasÄ«t pieteikÅ¡anos, lai aplÅ«kotu lapas config.mail_notify=IespÄ“jot e-pasta paziņojumus config.enable_captcha=IespÄ“jot drošības kodu -config.active_code_lives=Aktivēšanas koda derÄ«guma laiks -config.reset_password_code_lives=Atkopes koda derÄ«guma laiks +config.active_code_lives=AktÄ«vÄ koda ilgums +config.reset_password_code_lives=Konta atjaunoÅ¡anas koda beigÅ¡anÄs 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 apvienÄ«bu izveidoÅ¡anu +config.default_allow_create_organization=PÄ“c noklusÄ“juma ļaut veidot organizÄcijas 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 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.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.webhook_config=TÄ«mekļa aizÄ·eru konfigurÄcija -config.queue_length=Rindsaraksta garums +config.webhook_config=TÄ«kla ÄÄ·u konfigurÄcija +config.queue_length=Rindas garums config.deliver_timeout=PiegÄdes noildze config.skip_tls_verify=Izlaist TLS pÄrbaudi @@ -3461,59 +3116,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 saimniekdators +config.mailer_smtp_addr=SMTP adrese config.mailer_smtp_port=SMTP ports config.mailer_user=LietotÄjs config.mailer_use_sendmail=Izmantot Sendmail -config.mailer_sendmail_path=Sendmail ceļš -config.mailer_sendmail_args=Papildu Sendmail argumenti +config.mailer_sendmail_path=Ceļš lÄ«dz sendmail programmai +config.mailer_sendmail_args=Papildus Sendmail komandrindas 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-pasta ziņojumu +config.send_test_mail=NosÅ«tÄ«t pÄrbaudes e-pastu config.send_test_mail_submit=SÅ«tÄ«t -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.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.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 starplaiks -config.cache_conn=KeÅ¡atmiņas savienojums +config.cache_interval=KeÅ¡atmiņas intervÄls +config.cache_conn=KeÅ¡atmiņas pieslÄ“guma parametri 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=NodroÅ¡inÄtÄja konfigurÄcija +config.provider_config=Pakalpojumu sniedzÄ“ja konfigurÄcija config.cookie_name=SÄ«kdatnes nosaukums -config.gc_interval_time=GC starplaiks +config.gc_interval_time=GC laika intervÄls 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 attÄ“lu konfigurÄcija -config.picture_service=AttÄ“lu pakalpojums +config.picture_config=AttÄ“lu un profila bilžu konfigurÄcija +config.picture_service=LokÄli attÄ“li config.disable_gravatar=AtspÄ“jot Gravatar -config.enable_federated_avatar=IespÄ“jot vienotos profila attÄ“lus +config.enable_federated_avatar=IespÄ“jot apvienotÄs profila bildes 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=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_line_characters=MaksimÄlais salÄ«dzinÄmo simbolu skaits vienai rindai 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=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.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.log_config=ŽurnÄla konfigurÄcija +config.log_config=Žurnalizēšanas konfigurÄcija config.logger_name_fmt=ŽurnalizÄ“tÄjs: %s config.disabled_logger=AtspÄ“jots -config.access_log_mode=Piekļuves žurnalēšanas veids +config.access_log_mode=Piekļuves žurnalizēšanas veids config.access_log_template=Piekļuves žurnÄla sagatave config.xorm_log_sql=SQL žurnalizēšana @@ -3521,123 +3176,94 @@ config.set_setting_failed=`NeizdevÄs uzstÄdÄ«t iestatÄ«jumu "%s"` monitor.stats=Statistika -monitor.cron=AtkÄrtojamie uzdevumi +monitor.cron=Cron uzdevumi monitor.name=Nosaukums monitor.schedule=Grafiks -monitor.next=NÄkamÄ reize +monitor.next=NÄkoÅ¡Äs izpildes laiks monitor.previous=PÄ“dÄ“jÄs izpildes laiks monitor.execute_times=Izpildes monitor.process=DarbojoÅ¡ies procesi -monitor.stacktrace=Steka trasÄ“jums +monitor.stacktrace=Steka izsekojamÄ«ba 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=IznÄkums +monitor.last_execution_result=RezultÄts 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=Rindsaraksti -monitor.queue=Rindsaraksts: %s +monitor.queues=Rindas +monitor.queue=Rinda: %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=LielÄkais pieļaujamais strÄdņu skaits -monitor.queue.numberinqueue=Skaits rindsarakstÄ +monitor.queue.maxnumberworkers=MaksimÄlais strÄdņu skaits +monitor.queue.numberinqueue=Skaits rindÄ monitor.queue.review_add=PÄrskatÄ«t/pievienot strÄdņus monitor.queue.settings.title=PÅ«la iestatÄ«jumi -monitor.queue.settings.desc=PÅ«li dinamiski palielinÄs atkarÄ«bÄ no to strÄdņu rindu aizturēšanas. +monitor.queue.settings.desc=PÅ«ls dinamiski tiek palielinÄts atkarÄ«bÄ no bloÄ·Ä“tiem darbiem rindÄ. monitor.queue.settings.maxnumberworkers=MaksimÄlais strÄdņu skaits monitor.queue.settings.maxnumberworkers.placeholder=PaÅ¡alaik %[1]d -monitor.queue.settings.maxnumberworkers.error=LielÄkajam pieļaujamajam strÄdņu skaitam ir jÄbÅ«t skaitlim +monitor.queue.settings.maxnumberworkers.error=MaksimÄlajam 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.changed=IestatÄ«jumi saglabÄti monitor.queue.settings.remove_all_items=Noņemt visus -monitor.queue.settings.remove_all_items_done=Visi rindsaraksta vienumi tika noņemti. +monitor.queue.settings.remove_all_items_done=Visi ieraksti rindÄ tika noņemti. notices.system_notice_list=SistÄ“mas paziņojumi -notices.view_detail_header=ApskatÄ«t paziņojuma informÄciju +notices.view_detail_header=SkatÄ«t paziņojuma detaļas notices.operations=DarbÄ«bas -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.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.type=Veids -notices.type_1=GlabÄtava +notices.type_1=Repozitorijs notices.type_2=Uzdevums notices.desc=Apraksts notices.op=Op. -notices.delete_success=SistÄ“mas paziņojumi tika dzÄ“sti. +notices.delete_success=SistÄ“mas paziņojumi ir dzÄ“sti. -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) +self_check.no_problem_found=PaÅ¡laik nav atrasta neviena problÄ“ma. [action] -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_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_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 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 +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 compare_branch=SalÄ«dzinÄt -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` +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` reject_pull_request=`ieteica izmaiņas 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` +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` review_dismissed_reason=Iemesls: -create_branch=izveidoja zaru %[3]s glabÄtavÄ %[4]s +create_branch=izveidoja atzaru %[3]s repozitorijÄ %[4]s starred_repo=pievienoja izlasÄ“ %[2]s -watched_repo=sÄka vÄ“rot %[2]s +watched_repo=sÄka sekot %[2]s [tool] now=tagad @@ -3651,7 +3277,7 @@ future=nÄkotnÄ“ 1y=1 gada seconds=%d sekundÄ“m minutes=%d minÅ«tÄ“m -hours=%d stundÄs +hours=%d stundÄm days=%d dienas weeks=%d nedēļÄm months=%d mÄ“neÅ¡iem @@ -3660,7 +3286,7 @@ raw_seconds=sekundes raw_minutes=minÅ«tes [dropzone] -default_message=Ievilkt datnes vai klikšķinÄt Å¡eit, lai augÅ¡upielÄdÄ“tu. +default_message=JÄievelk datnes vai jÄklikšķina Å¡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 @@ -3669,56 +3295,56 @@ remove_file=Noņemt datni notifications=Paziņojumi unread=NeizlasÄ«tie read=IzlasÄ«tie -no_unread=Nav neizlasÄ«tu paziņojumu. +no_unread=Nav nelasÄ«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Ä neizlasÄ«tu +mark_as_unread=AtzÄ«mÄ“t kÄ nelasÄ«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Ä“juma atslÄ“gu +default_key=ParakstÄ«ts ar noklusÄ“to atslÄ“gu error.extract_sign=NeizdevÄs izgÅ«t parakstu -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. +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. [units] unit=VienÄ«ba -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. +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. [packages] title=Pakotnes -desc=PÄrvaldÄ«t glabÄtavas pakotnes. +desc=PÄrvaldÄ«t repozitorija pakotnes. empty=PaÅ¡laik Å¡eit nav nevienas pakotnes. -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Ä. +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Ä. filter.type=Veids filter.type.all=Visas filter.no_result=PÄ“c norÄdÄ«tajiem kritÄ“rijiem nekas netika atrasts. -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 +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 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 tÄ«mekļvietne -details.repository_site=GlabÄtavas tÄ«mekļvietne -details.documentation_site=DokumentÄcijas tÄ«mekļvietne +details.project_site=Projekta lapa +details.repository_site=Repozitorija vietne +details.documentation_site=DokumentÄcijas lapa details.license=Licence assets=Resursi versions=Versijas @@ -3726,188 +3352,160 @@ versions.view_all=ParÄdÄ«t visas dependency.id=ID dependency.version=Versija 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.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.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -alpine.repository=GlabÄtavas informÄcija -alpine.repository.branches=Zari -alpine.repository.repositories=GlabÄtavas +alpine.repository=Repozitorija informÄcija +alpine.repository.branches=Atzari +alpine.repository.repositories=Repozitoriji alpine.repository.architectures=ArhitektÅ«ras 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: +cargo.install=Lai instalÄ“tu Cargo pakotni, izpildiet sekojoÅ¡u komandu: chef.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ ~/.chef/config.rb: chef.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: composer.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ ~/.composer/config.json: -composer.install=Lai uzstÄdÄ«t pakotni ar Composer, jÄizpilda šī komanda: +composer.install=Lai instalÄ“tu Composer pakotni, izpildiet sekojoÅ¡u komandu: composer.dependencies=AtkarÄ«bas composer.dependencies.development=IzstrÄdes atkarÄ«bas -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: +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=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 +conda.install=Lai instalÄ“tu Conda pakotni, izpildiet sekojoÅ¡u komandu: +container.details.type=AttÄ“la formÄts container.details.platform=Platforma -container.pull=AtgÄdÄt attÄ“lu komandrindÄ: -container.digest=Īssavilkums +container.pull=AtgÄdÄjiet Å¡o attÄ“lu no komandrindas: +container.digest=Īssavilkums: container.multi_arch=OS / arhitektÅ«ra container.layers=AttÄ“la slÄņi -container.labels=IezÄ«mes +container.labels=EtiÄ·etes container.labels.key=AtslÄ“ga container.labels.value=VÄ“rtÄ«ba cran.registry=IestatÄ«t Å¡o reÄ£istru datnÄ“ Rprofile.site: cran.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -debian.registry=Å is reÄ£istra uzstÄdīšana komandrindÄ: -debian.registry.info=No zemÄk esoÅ¡Ä saraksta jÄizvÄ“las $distribution un $component. +debian.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: +debian.registry.info=IzvÄ“lieties $distribution un $component no saraksta zemÄk. debian.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: -debian.repository=GlabÄtavas informÄcija +debian.repository=Repozitorija 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=UzstÄdÄ«t pakotni komandrindÄ: -helm.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: -helm.install=Lai uzstÄdÄ«tu pakotni, ir jÄizpilda šī komanda: +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=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: +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: nuget.dependency.framework=MÄ“rÄ·a ietvars npm.registry=IestatÄ«t Å¡o reÄ£istru sava projekta datnÄ“ .npmrc: -npm.install=Lai uzstÄdÄ«tu pakotni ar npm, jÄizpilda šī komanda: +npm.install=Lai instalÄ“tu npm pakotni, izpildiet sekojoÅ¡u komandu: npm.install2=vai datnÄ“ package.json jÄpievieno: npm.dependencies=AtkarÄ«bas npm.dependencies.development=IzstrÄdes atkarÄ«bas -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: +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: pypi.requires=NepiecieÅ¡ams Python -pypi.install=Lai uzstÄdÄ«tu pakotni ar pip, jÄizpilda šī komanda: -rpm.registry=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +pypi.install=Lai instalÄ“tu pip pakotni, izpildiet sekojoÅ¡u komandu: +rpm.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: 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=GlabÄtavas informÄcija +rpm.repository=Repozitorija informÄcija rpm.repository.architectures=ArhitektÅ«ras -rubygems.install=Lai uzstÄdÄ«tu pakotni ar gem, jÄizpilda šī komanda: -rubygems.install2=vai jÄpievieno tas Gemfile: +rubygems.install=Lai instalÄ“tu gem pakotni, izpildiet sekojoÅ¡u komandu: +rubygems.install2=vai pievienojiet 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=Å Ä« reÄ£istra uzstÄdīšana komandrindÄ: +swift.registry=KonfigurÄ“jiet Å¡o reÄ£istru no komandrindas: 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 +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 settings.delete.description=Pakotne tiks neatgriezeniski izdzÄ“sta. -settings.delete.notice=Tiks izdzÄ“sta pakotne %s (%s). Å Ä« darbÄ«ba ir neatgriezeniska. TieÅ¡Äm turpinÄt? +settings.delete.notice=Tiks dzÄ“sts %s (%s). Å Ä« darbÄ«ba ir neatgriezeniska. Vai vÄ“laties 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=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.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.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 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.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.cleanuprules.enabled=IespÄ“jots -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.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.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 šī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.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.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 kÄrtula tika atjauninÄta. -owner.settings.cleanuprules.success.delete=NotÄ«rīšanas kÄrtula tika izdzÄ“sta. +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.chef.title=Chef reÄ£istrs -owner.settings.chef.keypair=Izveidot atslÄ“gu pÄri +owner.settings.chef.keypair=Ä¢enerÄ“t 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 noteiktÄm darbÄ«bÄm, un citÄdÄk tos nevar nolasÄ«t. +description=NoslÄ“pumi tiks padoti atsevišķÄm darbÄ«bÄm un citÄdi nevar tikt nolasÄ«ti. none=PagaidÄm nav neviena noslÄ“puma. creation=Pievienot noslÄ“pumu -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.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.success=NoslÄ“pums "%s" tika pievienots. creation.failed=NeizdevÄs pievienot noslÄ“pumu. -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 +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 [actions] actions=DarbÄ«bas -unit.desc=IebÅ«vÄ“to CI/CD cauruļvadu pÄrvaldīšana ar Forgejo Actions. +unit.desc=PÄrvaldÄ«t darbÄ«bas status.unknown=NezinÄms status.waiting=Gaida status.running=IzpildÄs -status.success=SekmÄ«gi -status.failure=NesekmÄ«gi +status.success=Pabeigts +status.failure=NeveiksmÄ«gs status.cancelled=Atcelts status.skipped=Izlaists -status.blocked=AizturÄ“ts +status.blocked=BloÄ·Ä“ts runners=IzpildÄ«tÄji -runners.runner_manage_panel=PÄrvaldÄ«t izpildÄ«tÄjus -runners.new=Izveidot jaunu izpildÄ«tÄju +runners.runner_manage_panel=IzpildÄ«tÄju pÄrvaldÄ«ba +runners.new=Pievienot jaunu izpildÄ«tÄju runners.new_notice=KÄ uzstÄdÄ«t izpildÄ«tÄju -runners.status=StÄvoklis +runners.status=Statuss runners.id=ID runners.name=Nosaukums runners.owner_type=Veids @@ -3918,57 +3516,57 @@ 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Ä«jums -runners.task_list.status=StÄvoklis -runners.task_list.repository=GlabÄtava -runners.task_list.commit=IesÅ«tÄ«jums +runners.task_list.status=Statuss +runners.task_list.repository=Repozitorijs +runners.task_list.commit=RevÄ«zija runners.task_list.done_at=Beigu laiks runners.edit_runner=Labot izpildÄ«tÄju runners.update_runner=AtjauninÄt izmaiņas -runners.update_runner_success=IzpildÄ«tÄjs sekmÄ«gi atjauninÄts +runners.update_runner_success=IzpildÄ«tÄjs veiksmÄ«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 sekmÄ«gi izdzÄ“sts +runners.delete_runner_success=IzpildÄ«tÄjs veiksmÄ«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 darbplÅ«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 darbaplÅ«smas. runners.none=Nav pieejami izpildÄ«tÄji runners.status.unspecified=NezinÄms runners.status.idle=DÄ«kstÄvÄ“ -runners.status.active=Darbojas +runners.status.active=AktÄ«vs 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 sekmÄ«gi atiestatÄ«ta +runners.reset_registration_token_success=IzpildÄ«tÄja reÄ£istrÄcijas pilnvara tika veiksmÄ«gi atiestatÄ«ta -runs.all_workflows=Visas darbplÅ«smas -runs.commit=IesÅ«tÄ«jumu +runs.all_workflows=Visas darbaplÅ«smas +runs.commit=RevÄ«zija runs.scheduled=IeplÄnots -runs.pushed_by=aizgÄdÄja +runs.pushed_by=iesÅ«tÄ«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.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.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 iesÅ«tÄ«juma ziņojums) +runs.empty_commit_message=(tukÅ¡s revÄ«zijas ziņojums) workflow.disable=AtspÄ“jot darbplÅ«smu -workflow.disable_success=DarbplÅ«sma "%s" ir sekmÄ«gi atspÄ“jota. +workflow.disable_success=DarbplÅ«sma '%s' ir veiksmÄ«gi atspÄ“jota. workflow.enable=IespÄ“jot darbplÅ«smu -workflow.enable_success=DarbplÅ«sma "%s" ir sekmÄ«gi iespÄ“jota. +workflow.enable_success=DarbplÅ«sma '%s' ir veiksmÄ«gi iespÄ“jota. workflow.disabled=DarbplÅ«sma ir atspÄ“jota. -need_approval_desc=NepiecieÅ¡ams apstiprinÄjums, lai izpildÄ«tu darbplÅ«smas izmaiņu pieprasÄ«jumos no atzarojumiem. +need_approval_desc=NepiecieÅ¡ams apstiprinÄjums, lai izpildÄ«tu izmaiņu pieprasÄ«jumu darbaplÅ«smas no atdalÄ«tiem repozitorijiem. variables=MainÄ«gie -variables.management=PÄrvaldÄ«t mainÄ«gos +variables.management=MainÄ«go pÄrvaldÄ«ba 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. TurpinÄt? +variables.deletion.description=MainÄ«gÄ noņemÅ¡ana ir neatgriezeniska un nav atsaucama. Vai 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 @@ -3978,100 +3576,19 @@ 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=Atsevišķs projekts -type-2.display_name=GlabÄtavas projekts -type-3.display_name=ApvienÄ«bas projekts -deleted.display_name = IzdzÄ“sts projekts +type-1.display_name=IndividuÄlais projekts +type-2.display_name=Repozitorija projekts +type-3.display_name=OrganizÄcijas projekts [git.filemode] changed_filemode=%[1]s → %[2]s -directory=Mape +directory=Direktorija 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. +commit_kind = MeklÄ“t iesÅ«tÄ«jumus... diff --git a/options/locale/locale_ml-IN.ini b/options/locale/locale_ml-IN.ini index fcc9888d8e..a15fd5a9dc 100644 --- a/options/locale/locale_ml-IN.ini +++ b/options/locale/locale_ml-IN.ini @@ -248,6 +248,7 @@ authorization_failed=അംഗീകാരം നലàµâ€à´•àµà´¨àµà´¨à´¤à´¿ authorization_failed_desc=അസാധàµà´µà´¾à´¯ ഒരൠഅഭàµà´¯àµ¼à´¤àµà´¥à´¨ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¿à´¯à´¤à´¿à´¨à´¾àµ½ à´žà´™àµà´™àµ¾ അംഗീകാരം പരാജയപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿. ദയവായി നിങàµà´™àµ¾ അംഗീകരികàµà´•ാൻ à´¶àµà´°à´®à´¿à´šàµà´š à´…à´ªàµà´²à´¿à´•àµà´•േഷനàµà´±àµ† പരിപാലകനàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•. [mail] + activate_account=നിങàµà´™à´³àµà´Ÿàµ† à´…à´•àµà´•ൗണàµà´Ÿàµ സജീവമാകàµà´•àµà´• activate_email=ഇമെയിലàµâ€ വിലാസം à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´¯àµà´•àµà´•àµà´• @@ -673,8 +674,7 @@ editor.filename_help=ഒരൠഡയറകàµâ€Œà´Ÿà´±à´¿à´¯àµà´Ÿàµ† പേര editor.or=അഥവാ editor.cancel_lower=റദàµà´¦à´¾à´•àµà´•àµà´• editor.commit_changes=മാറàµà´±à´™àµà´™àµ¾ വരàµà´¤àµà´¤àµà´• -editor.add_tmpl='<%s>' ചേർകàµà´•àµà´• -editor.add_tmpl.filename = ഫയലàµâ€ +editor.add_tmpl='<ഫയലàµâ€>' ചേർകàµà´•àµà´• editor.add=%s ചേരàµâ€à´•àµà´•àµà´• editor.update=%s à´ªàµà´¤àµà´•àµà´•àµà´• editor.delete=%s നീകàµà´•à´‚ ചെയàµà´¯àµà´• @@ -723,6 +723,12 @@ issues.dependency.add_error_dep_not_same_repo=à´°à´£àµà´Ÿàµ à´ªàµà´°à´¶àµà´¨ +; %[2]s
      %[3]s
      + + + + + milestones.filter_sort.most_issues=മികàµà´• ഇഷàµà´¯àµ‚à´•à´³àµà´‚ milestones.filter_sort.least_issues=à´•àµà´±à´žàµà´ž ഇഷàµà´¯àµ‚കളെങàµà´•à´¿à´²àµà´‚ @@ -747,7 +753,18 @@ settings.event_issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ [org] + + + + + + [admin] + + + + + repos.issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ @@ -785,3 +802,4 @@ repos.issues=ഇഷàµà´¯àµ‚à´•à´³àµâ€ [units] [packages] + diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini index 2c8b5cfc64..f240586837 100644 --- a/options/locale/locale_nb_NO.ini +++ b/options/locale/locale_nb_NO.ini @@ -1,5 +1,8 @@ + + + [common] -enable_javascript = Denne nettsiden krever JavaScript. +enable_javascript = Denne nettsiden behøver JavaScript. toc = Innholdsfortegnelse licenses = Lisenser return_to_forgejo = Tilbake til Forgejo @@ -123,33 +126,13 @@ 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 +sign_up_button = Opprett konto nÃ¥. \ No newline at end of file diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 698f1330d6..7f64372eb4 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -39,7 +39,7 @@ webauthn_error_empty = Du muttst de Slötel eenen Naam geven. repository = Repositorium organization = Vereenigung new_fork = Neje Repositoriums-Gabel -dashboard = Kontor +dashboard = Mien Disk logo = Logo active_stopwatch = Aktive Tied-Erfatens password = Passwoord @@ -95,10 +95,10 @@ copy_branch = Twiegnaam koperen copy_success = Kopeert! copy_error = Koperen fehlslagen write = Schrieven -preview = Utkiek +preview = Vörschau 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. +error404 = De Sied, wat du söchst, gifft dat of nich 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 @@ -141,7 +141,6 @@ 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 … @@ -150,7 +149,7 @@ 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 = Akkeraat exact_tooltip = Blots Resultaten wiesen, wat akkeraat to de Söökwoord passen regexp = RegEx regexp_tooltip = De Söökwoord as Regel-Utdruck behanneln @@ -204,16 +203,6 @@ 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 @@ -239,7 +228,7 @@ install_desc = Du kannst dat Programm eenfach 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 +resend_mail = Klick hier, um de AktiverensE-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 @@ -361,8 +350,8 @@ account_security_caution.text_1 = Wenn du dat weerst, kannst du deese E-Mail sek 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.reopen = @%[1]s hett #%[2]s weer opmaakt. +issue.action.merge = @%[1]s hett #%[2]s 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. @@ -379,8 +368,8 @@ activate_email.text = Bidde klick up deesen Verwies, um diene E-Mail-Adress binn 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 +issue.action.push_1 = @%[1]s hett %[3]Kommitteren to %[2]s schuven +issue.action.push_n = @%[1]s hett %[3]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: @@ -408,7 +397,7 @@ 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. +issue.action.close = @%[1]s hett #%[2]s 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 @@ -514,8 +503,6 @@ org_still_own_packages = Deese Vereenigung is een Eegner vun een of mehr Paketen 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 … @@ -527,8 +514,8 @@ 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 +following_one = %d gaht na +following_few = %d gahn na follow = Nagahn unfollow = Nich mehr nagahn block_user = Bruker blockeren @@ -569,7 +556,7 @@ 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 +location_placeholder = Deel umslag diene Stee mit annerns pronouns = Pronomens pronouns_custom = Eegene update_theme = Thema ännern @@ -606,7 +593,7 @@ 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. +theme_desc = Dat word dien normaales Thema dör de Sied wesen. primary = Höövd activated = Aktiveert requires_activation = Mutt aktiveert worden @@ -637,7 +624,7 @@ 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) +biography_placeholder = Vertell uns een bietje wat över di! (Du kannst Markdown bruken) 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. @@ -727,7 +714,7 @@ 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. +delete_token_success = Dat Teken is lösket worden. Programmen, wat dat bruken, könn 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) @@ -760,15 +747,15 @@ 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? +access_token_deletion_desc = Wenn du een Teken löskest, können 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_client_secret = Klient-Geheimnis +oauth2_regenerate_secret = Geheimnis 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 @@ -786,8 +773,8 @@ 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_regenerate_secret_hint = Geheimnis verloren? +oauth2_client_secret_hint = Dat Geheimnis 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 @@ -796,7 +783,7 @@ oauth2_application_create_description = OAuth2-Programmen gifft dienen Frömdpro 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. +twofa_failed_get_secret = Kunn dat Geheimnis 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? @@ -828,7 +815,7 @@ 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 +or_enter_secret = Of giff dat Geheimnis 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. @@ -839,54 +826,24 @@ 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. +profile_desc = Richt in, wo dien Profil to anner Brukers wiest word. Diene Höövd-E-Mail-Adress word för Narichtens, Passwoord-Torügghalen un Git-Aktioonen över ’t Internett bruukt. +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 » hett Vermark hentoföögt/wegdaan«-Kommentaaren 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. +keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verburgen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert. 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. +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 Geheimnis 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. @@ -912,7 +869,7 @@ 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. +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 @@ -950,7 +907,7 @@ mirror_interval = Tiedofstand för ’t Spegeln (gültige Tied-Eenheiden sünd issue_labels = Vermarkens issue_labels_helper = Köör eene Vermarkens-Sammlung ut license = Lizenz -auto_init = Repositorium inrichten +auto_init = Repositorium inrichten (Föögt .gitignore, Lizenz un LEESMI hento) 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 @@ -1059,7 +1016,7 @@ 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. +archive.title_date = Deeses Repositorium is up %s archiveert worden. Du kannst de Dateien ankieken un ’t klonen, aver nich schuven un keene Gefallens un Haalvörslagen opmaken. 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. @@ -1073,7 +1030,7 @@ 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. +archive.title = Deeses Repositorium is archiveert. Du kannst de Dateien ankieken un ’t klonen, aver nich schuven un keene Gefallens un Haalvörslagen opmaken. need_auth = Anmellen migrate_options = Umtreck-Instellens migrate.clone_local_path = of een stedenwies Server-Padd @@ -1149,7 +1106,7 @@ 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.cannot_edit_lfs_files = LFS-Datein 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 … @@ -1157,8 +1114,7 @@ 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_tmpl = »Dateinaam« hentofögen editor.add = %s hentofögen editor.update = %s vernejen editor.delete = %s lösken @@ -1167,7 +1123,7 @@ 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.commit_directly_to_this_branch = Kommitteer stracks up de %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 … @@ -1305,7 +1261,7 @@ 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.file_changed_while_editing = De Datei-Inhollens hebben sik ännert, siet du mit de Bewarken begunnen 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: @@ -1332,20 +1288,20 @@ 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.add_labels = hett de Vermarkens %s %s hentogeföögt +issues.remove_label = hett de Vermark %s %s wegdaan +issues.add_milestone_at = `hett dat to de Marksteen %s hentoföögt` +issues.add_project_at = `hett dat to de Projekt %s hentoföögt` +issues.change_milestone_at = `hett de Marksteen vun %s to %s ännert` +issues.remove_milestone_at = `hett dat vun de Marksteen %s wegdaan` +issues.remove_project_at = `hett dat vun de Projekt %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.change_title_at = `hett de Titel vun %s to %s %s ännert` +issues.change_ref_at = `hett de Nömen vun %s to %s %s ännert` +issues.delete_branch_at = `hett de Twieg %s %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 @@ -1400,29 +1356,29 @@ 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_label = hett de Vermark %s %s hentogeföö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.change_project_at = `hett dat Projekt vun %s to %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.add_ref_at = `hett de Nömen %s %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.remove_labels = hett de Vermarkens %s %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.add_remove_labels = hett de Vermarkens %s hentoföögt un %s %s wegdaan +issues.remove_ref_at = `hett de Nömen %s %s wegdaan` issues.filter_milestone_all = All Markstenen issues.filter_type.reviewed_by_you = Vun di nakiekt issues.filter_sort.fewestforks = Minnste Gabels @@ -1433,13 +1389,13 @@ 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.create_comment = Kommentaar 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_closing_from = `hett deeses Gefall vun eenem Haalvörslag %[4]s, wat ’t 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` @@ -1475,14 +1431,14 @@ 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.num_participants_one = %s Mitmaker +issues.num_participants_few = %s Mitmakers +issues.ref_pull_from = `hett deeses 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.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag %[4]s, wat ’t 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. @@ -1530,21 +1486,21 @@ 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.push_commit_1 = hett %d Kommitteren %s hentoföögt +issues.push_commits_n = hett %d Kommitterens %s 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_added = hett dat Anstahns-Datum %s %s hentoföögt +issues.due_date_remove = hett dat Anstahns-Datum %s %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.add = Ofhangen henntofö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 @@ -1571,7 +1527,7 @@ 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.lock_with_reason = hett dat um %s %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 @@ -1582,11 +1538,11 @@ 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.lock.notice_2 = - Du un anner Mitarbeiders mit Togriep to deesem Repositorium könnt 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.review.approve = hett deese Ännerns %s tostimmt +issues.review.dismissed = hett dat Nakieken vun %s %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 @@ -1602,7 +1558,7 @@ issues.due_date_invalid = Dat Anstahns-Datum is ungültig of buten de Rieg. Bidd 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.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 @@ -1640,9 +1596,9 @@ 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.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.change_target_branch_at = `hett de Enn-Twieg vun %s to %s %s ännert` pulls.tab_conversation = Snack pulls.tab_commits = Kommitterens pulls.tab_files = Ännert Dateien @@ -1690,18 +1646,18 @@ 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.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. +issues.blocked_by_user = Du kannst up deesem Repositorium keenen Gefall 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. +issues.comment.blocked_by_user = Du kannst up deesem Gefall keenen Kommentaar schrieven, 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: @@ -1971,7 +1927,7 @@ 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.title.issues_1 = %s 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 @@ -2007,7 +1963,7 @@ 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.issues_n = %s 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 @@ -2122,7 +2078,7 @@ 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.secret = Geheimnis settings.slack_username = Brukernaam settings.slack_color = Klöör settings.discord_username = Brukernaam @@ -2266,8 +2222,8 @@ 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.sourcehut_builds.secrets = Geheimnissen +settings.sourcehut_builds.secrets_helper = Giff de Upgaav Togang to de Bau-Geheimnissen (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. @@ -2322,7 +2278,7 @@ 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.archive.tagsettings_unavailable = Mark-Instellens sünd nich verföögbar, wenn dat Repo archiveert is. 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. @@ -2337,14 +2293,14 @@ 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.archive.mirrors_unavailable = Spegels sünd nich verföögbar, wenn dat Repo archiveert is. 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.text = Wenn dat Repo archiveert word, kann man daar blots noch lesen. Dat word vum Disk 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.archive.branchsettings_unavailable = Twieg-Instellens sünd nich verföögbar, wenn dat Repo archiveert is. 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 @@ -2561,8 +2517,8 @@ invisible_runes_description = `Deese Datei enthollt unsichtbaare Unicode-Booksta 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. +issues.review.pending.tooltip = Deeser Kommentaar is jüüst för anner Brukers nich sichtbaar. Um diene utstahn Kommentaaren 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 Geheimnissen 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. @@ -2577,42 +2533,11 @@ issues.review.remove_review_requests = hett %[2]s de Nakieken-Anfragen för %[1] 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.read = Lesen: Gefallens un Kommentaaren 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. @@ -2643,7 +2568,7 @@ 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 +open_dashboard = »Mien Disk« opmaken repo_updated = %s verneeit members = Liddmaten teams = Klottjen @@ -2751,11 +2676,9 @@ teams.read_permission_desc = Deese Klottje gifft Lesens-Togriep 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 +dashboard = Mien Disk self_check = Sülvst-Överprüfen identity_access = Sülvst & Togang users = Brukerkonten @@ -2905,7 +2828,7 @@ 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.purge_help = Mit Dwang de Bruker un all siene Repositoriums Vereenigungen un Paketen lösken. All Kommentaaren 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 @@ -3014,7 +2937,7 @@ 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_clientSecret = Klient-Geheimnis auths.oauth2_use_custom_url = Eegene URLs in Stee vun de normaalen URLs bruken auths.oauth2_tokenURL = Teken-URL auths.oauth2_authURL = Anmellen-URL @@ -3245,7 +3168,7 @@ 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_fix_mysql = Brukers vun MySQL of MariaDB könen de Oorder »gitea 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 @@ -3277,7 +3200,6 @@ config.allow_only_external_registration = Registreren blots dör frömde Deenste 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 @@ -3574,7 +3496,7 @@ 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 = Schoonmakens-Örder-Vörschau 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 @@ -3624,7 +3546,7 @@ 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.digest = Prüüfsumm: container.multi_arch = BS / Arch container.layers = Avbill-Schichten cran.registry = Richt deese Paketlist in diener Rprofile.site-Datei in: @@ -3662,30 +3584,21 @@ 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 +secrets = Geheimnissen +description = Geheimnissen worden an wisse Aktioonen övergeven un könen anners nich lesen worden. +none = Dat gifft noch keene Geheimnissen. +creation = Geheimnis hentofögen +creation.success = Dat Geheimnis »%s« is hentoföögt worden. +creation.failed = Kunn Geheimnis nich hentofögen. +deletion = Geheimnis wegdoon +deletion.success = Dat Geheimnis is wegdaan worden. +deletion.failed = Kunn Geheimnis nich wegdoon. +management = Geheimnissen verwalten +creation.value_placeholder = Giff elkeen Inholl in. Leegtekens am Begünn un Enn word ofsneden. +deletion.description = Een Geheimnis wegtodoon is för all Tieden un kann nich torüggnohmen worden. Wiedermaken? +creation.name_placeholder = Blots alphanumerisk Boostavens (dat word nich tüsken Groot- un Kleenbookstavens unnerscheden) un Unnerstrekens; kann nich mit GITEA_ of GITHUB_ begünnen [actions] actions = Aktioonen @@ -3782,9 +3695,6 @@ variables.deletion.description = Eene Variaabel wegtodoon is för all Tieden un 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 @@ -3802,8 +3712,8 @@ submodule = Unnermoduul [markup] filepreview.lines = Riegen %[1]d bit %[2]d in %[3]s -filepreview.truncated = Utkiek is ofsneden worden +filepreview.truncated = Vörschau is ofsneden worden filepreview.line = Rieg %[1]d in %[2]s [translation_meta] -test = Moin! +test = Moin! \ No newline at end of file diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index f68f738729..5b1dd0f8db 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=Aanmelden +sign_in=Inloggen sign_in_or=of sign_out=Uitloggen sign_up=Registreren link_account=Account Koppelen register=Registreren version=Versie -powered_by=Mogelijk gemaakt door %s +powered_by=Aangedreven door %s page=Pagina template=Sjabloon language=Taal @@ -28,24 +28,24 @@ username=Gebruikersnaam email=E-mailadres password=Wachtwoord access_token=Toegangstoken -re_type=Bevestig wachtwoord +re_type=Verifieer wachtwoord captcha=CAPTCHA twofa=Twee-factor authenticatie twofa_scratch=Twee-factor krascode -passcode=Code +passcode=PIN webauthn_insert_key=Voer uw beveiligingssleutel in -webauthn_sign_in=Druk op de knop van uw beveiligingssleutel. Als uw beveiligingssleutel geen knop heeft, voer deze dan opnieuw in. +webauthn_sign_in=Druk op de knop van uw beveiligingssleutel. Als uw beveiligingssleutel geen knop heeft, voeg 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 als systeemnaam "localhost" of "127.0.0.1" gebruiken +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_unable_to_process=De server kon uw verzoek niet verwerken. -webauthn_error_duplicated=De beveiligingssleutel is voor dit verzoek niet toegestaan. Controleer alstublieft of de sleutel niet al is geregistreerd. +webauthn_error_duplicated=De beveiligingssleutel is niet toegestaan voor dit verzoek. Zorg er alstublieft voor dat de sleutel niet al geregistreerd is. webauthn_error_empty=U moet een naam voor deze sleutel instellen. -webauthn_error_timeout=Time-out bereikt voordat uw sleutel kon worden gelezen. Herlaad deze pagina en probeer het opnieuw. +webauthn_error_timeout=Time-out bereikt voordat uw sleutel kon worden gelezen. Laad deze pagina opnieuw 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=Nieuw project +new_project=Nieuwe project manage_org=Beheer organisaties -admin_panel=Site beheer +admin_panel=Website administratie account_settings=Accountinstellingen settings=Instellingen your_profile=Profiel @@ -66,12 +66,12 @@ your_starred=Favoriet your_settings=Instellingen all=Alles -sources=Broncode +sources=Bronnen mirrors=Mirrors -collaborative=Samenwerkende +collaborative=Samenwerkend forks=Forks -activities=Activiteit +activities=Activiteiten 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=Wijzig +edit=Bewerk enabled=Ingeschakeld disabled=Uitgeschakeld @@ -99,7 +99,7 @@ preview=Voorbeeld loading=Laden… error=Fout -error404=De pagina die u probeert te bereiken bestaat niet, is verwijderd of u bent niet bevoegd om deze te bekijken. +error404=De pagina die u probeert te bereiken bestaat niet of u bent niet gemachtigd om het te bekijken. never=Nooit @@ -115,8 +115,8 @@ concept_user_organization=Organisatie name=Naam -sign_in_with_provider = Aanmelden met %s -tracked_time_summary = Overzicht van geregistreerde tijd op basis van filters van issuelijst +sign_in_with_provider = Log in met %s +tracked_time_summary = Overzicht van geregistreerde tijd op basis van filters van probleemlijst 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 item "%s" +remove_label_str = Verwijder punt "%s" confirm_delete_artifact = Weet u zeker dat u het artefact "%s" wilt verwijderen? -toggle_menu = Menu aan/uit +toggle_menu = Menu schakelen filter.clear = Filter wissen filter.is_archived = Gearchiveerd filter.is_fork = Forks @@ -159,14 +159,13 @@ more_items = Meer items invalid_data = Ongeldige data: %v copy_generic = Kopieer naar klembord test = Test -error413 = U heeft uw hele quotum gebruikt. +error413 = U heeft al uw quotum opgebruikt. 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 @@ -200,16 +199,6 @@ 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 @@ -238,7 +227,7 @@ install_desc = Draai gewoon documentatie voordat je een instelling aanpast. +docker_helper=Als je gitea 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 @@ -488,7 +477,6 @@ 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 @@ -685,8 +673,6 @@ 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] @@ -799,14 +785,14 @@ update_password=Wachtwoord bijwerken old_password=Huidige wachtwoord new_password=Nieuw wachtwoord password_incorrect=Het wachtwoord is niet correct. -change_password_success=Uw wachtwoord is bijgewerkt. Log vanaf nu in met uw nieuwe wachtwoord. +change_password_success=Je wachtwoord is bijgewerkt. Log vanaf nu in met je 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 thema wordt gebruikt voor de webinterface wanneer je bent aangemeld. +theme_desc=Dit zal het standaardthema worden op de gehele site. primary=Primair activated=Geactiveerd requires_activation=Vereist activering @@ -992,8 +978,8 @@ visibility.limited=Beperkt visibility.private=Privé blocked_users = Geblokkeerde gebruikers uid = UID -biography_placeholder = Vertel anderen een beetje over uzelf! (Markdown is ondersteund) -profile_desc = Over u +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. 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. @@ -1026,7 +1012,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 = 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. +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. 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? @@ -1037,12 +1023,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 ingelogde gebruikers +visibility.limited_tooltip = Alleen zichtbaar voor geauthenticeerde 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/… @@ -1062,36 +1048,6 @@ 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 @@ -1129,11 +1085,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 +auto_init=Initialiseer repository (voegt .gitignore, License en README toe) 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 @@ -1163,7 +1119,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 @@ -1197,8 +1153,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 repository is gearchiveerd. U kunt niet reageren op problemen. -archive.pull.nocomment=Deze repository is gearchiveerd. U kunt niet reageren op pull requests. +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. 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. @@ -1232,13 +1188,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 instanties. +migrate.gitea.description=Gegevens overzetten van gitea.com of andere Gitea/Forgejo 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. @@ -1285,7 +1241,7 @@ tags=Labels issues=Issues pulls=Pull requests project_board=Projecten -packages=Pakketten +packages=Paketten labels=Labels org_labels_desc=Organisatielabel dat gebruikt kan worden met alle repositories onder deze organisatie org_labels_desc_manage=beheren @@ -1349,21 +1305,20 @@ editor.or=of editor.cancel_lower=Annuleer editor.commit_signed_changes=Commit ondertekende wijzigingen editor.commit_changes=Wijzigingen doorvoeren -editor.add_tmpl="<%s>" toevoegen -editor.add_tmpl.filename = bestandsnaam +editor.add_tmpl="" toevoegen 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 %[1]s. +editor.commit_directly_to_this_branch=Commit direct naar de branch '%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 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.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.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. @@ -1646,7 +1601,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 @@ -1695,8 +1650,8 @@ 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=beoordeling gevraagd van %[1]s %[2]s -issues.review.remove_review_request=beoordelingsaanvraag voor %[1]s %[2]s verwijderd +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=weigerde te beoordelen %s issues.review.pending=In behandeling issues.review.review=Review @@ -1743,7 +1698,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 @@ -2232,8 +2187,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=Branchinstellingen zijn niet beschikbaar in gearchiveerde repo's. -settings.archive.tagsettings_unavailable=Tag-instellingen zijn niet beschikbaar in gearchiveerde repo's. +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.update_avatar_success=De repository avatar is bijgewerkt. settings.lfs=LFS settings.lfs_filelist=LFS bestanden opgeslagen in deze repository @@ -2249,7 +2204,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 @@ -2427,8 +2382,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 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.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.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 @@ -2446,7 +2401,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. @@ -2516,8 +2471,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 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. +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. 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` @@ -2648,7 +2603,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 in gearchiveerde repo's. +settings.archive.mirrors_unavailable = Mirrors zijn niet beschikbaar als de repo is gearchiveerd. 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. @@ -2790,7 +2745,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 @@ -2871,52 +2826,19 @@ 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… +component_loading = Bezig met laden van %s... code_frequency.what = code frequentie recent_commits.what = recente commits @@ -2926,7 +2848,7 @@ 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=Geüpdatet %s +repo_updated=Geupdate %s members=Leden teams=Teams lower_members=leden @@ -2985,7 +2907,7 @@ members.invite_desc=Voeg nieuw lid toe aan %s: members.invite_now=Nu uitnodigen teams.join=Lid worden -teams.leave=Verlaat +teams.leave=Vertlaat 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 @@ -3042,12 +2964,10 @@ 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 ingelogde gebruikers) +settings.visibility.limited = Beperkt (alleen zichtbaar voor geauthenticeerde 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 @@ -3130,7 +3050,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=Gebruikersaccount aanmaken +users.new_account=Nieuw account aanmaken users.name=Gebruikersnaam users.full_name=Volledige naam users.activated=Geactiveerd @@ -3541,7 +3461,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 "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. +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. 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 @@ -3605,7 +3525,6 @@ 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] @@ -3731,16 +3650,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 @@ -3762,7 +3681,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: @@ -3780,7 +3699,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 @@ -3802,7 +3721,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: @@ -3866,15 +3785,6 @@ 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 @@ -3987,9 +3897,6 @@ 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. @@ -4011,20 +3918,20 @@ executable_file = Uitvoerbaar bestand [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 @@ -4033,8 +3940,8 @@ 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... @@ -4077,4 +3984,4 @@ 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. +issues.write = Schrijven: Sluit issues af en beheer metadata zoals labels, mijlpalen, verantwoordelijken, vervaldatums en afhankelijkheden. \ No newline at end of file diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index f7bb6f3294..a5ad459fe4 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=Uwierzytelnianie dwuskÅ‚adnikowe -twofa_scratch=Kod jednorazowy uwierzytelniania dwuskÅ‚adnikowego +twofa=Autoryzacja dwuskÅ‚adnikowa +twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej 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Å› pewny(-na) że chcesz usunąć artefakt "%s"? +confirm_delete_artifact = JesteÅ› penwy ż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 zgÅ‚oszeÅ„ +tracked_time_summary = Podsumowanie Å›ledzonego czasu na podstawie filtrów listy problemów show_timestamps = Pokaż znaczniki czasu filter.not_archived = Nie zarchiwizowane -filter.not_mirror = Bez kopii lustrzanych +filter.not_mirror = Nie mirror filter.not_template = Nie szablony filter.is_archived = Zarchiwizowane filter.is_mirror = Kopie lustrzane @@ -166,22 +166,21 @@ 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 tym oprogramowaniu +footer.software = O oprogramowaniu footer.links = Linki [heatmap] -contributions_format = {contributions} w dniu {day} {month} {year} +contributions_format = {contributions} w dniu {month} {day}, {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 = kontrybucja -contributions_few = kontrybucji +contributions_one = WkÅ‚ad +contributions_few = WkÅ‚ady [editor] buttons.heading.tooltip = Dodaj nagłówek @@ -196,16 +195,9 @@ 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Ä™ 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 +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 [filter] string.asc = A - Z @@ -256,7 +248,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, nazwa użytkownika jest zarezerwowana +err_admin_name_is_reserved=Nazwa użytkownika administratora jest nieprawidÅ‚owa, pseudonim jest zastrzeżony 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 @@ -297,7 +289,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(-a) 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 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. @@ -329,12 +321,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Å›lnie zezwól na korzystanie z funkcji Å›ledzenia czasu dla nowych repozytoriów. -no_reply_address=Domena ukrytych e-maili +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 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 = Zezwól użytkownikom na używanie kropek w nazwach użytkowników. Nie ma to wpÅ‚ywu na istniejÄ…ce konta. +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. 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: @@ -350,7 +342,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 e-mail +uname_holder=Nazwa użytkownika lub adres email password_holder=HasÅ‚o switch_dashboard_context=Przełącz kontekst pulpitu my_repos=Repozytoria @@ -407,10 +399,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ść e-mail jest nieważna, możesz siÄ™ zalogować i poprosić o wysÅ‚anie kolejnej wiadomoÅ›ci e-mail 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ść email jest nieważna, możesz siÄ™ zalogować i poprosić o wysÅ‚anie kolejnej wiadomoÅ›ci email 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ść 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. +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. active_your_account=Aktywuj swoje konto account_activated=Konto zostaÅ‚o aktywowane prohibit_login=Konto jest zawieszone @@ -418,7 +410,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 e-mail odzyskiwania +send_reset_mail=WyÅ›lij email odzyskiwania reset_password=Odzyskiwanie konta invalid_code=Twój kod potwierdzajÄ…cy jest nieprawidÅ‚owy lub wygasÅ‚. reset_password_helper=Odzyskaj konto @@ -459,17 +451,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Å›(-aÅ›) 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Å› 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Å›(-aÅ›) 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Å› autoryzować. password_pwned = Wybrane hasÅ‚o znajduje siÄ™ na liÅ›cie skradzionych haseÅ‚, które zostaÅ‚y wczeÅ›niej ujawnione w wyniku publicznego naruszenia danych. Spróbuj ponownie z innym hasÅ‚em i rozważ zmianÄ™ tego hasÅ‚a również w innych miejscach. last_admin = Nie można usunąć ostatniego administratora. Musi istnieć co najmniej jeden administrator. tab_signin = Zaloguj oauth.signin.error = WystÄ…piÅ‚ błąd podczas przetwarzania żądania autoryzacji. JeÅ›li ten błąd nadal wystÄ™puje, skontaktuj siÄ™ z administratorem witryny. -change_unconfirmed_email_error = Nie udaÅ‚o siÄ™ zmienić adresu e-mail: %v +change_unconfirmed_email_error = Nie udaÅ‚o się zmienić adresu email: %v invalid_code_forgot_password = Twój kod potwierdzajÄ…cy jest niepoprawny lub wygasÅ‚. NaciÅ›nij tutajâ£, aby rozpocząć nową sesjÄ™. invalid_password = Twoje hasÅ‚o nie zgadza siÄ™ z hasÅ‚em, które zostaÅ‚o użyte do stworzenia konta. -reset_password_wrong_user = JesteÅ› zalogowany(-a) jako %s, ale link odzyskujÄ…cy jest dla %s +reset_password_wrong_user = Jesteś zalogowany 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. @@ -478,8 +470,6 @@ 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 @@ -502,7 +492,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Å›(-aÅ›) ty, kliknij poniższy link, aby odzyskać swoje konto w ciÄ…gu %s: +reset_password.text=JeÅ›li to byÅ‚eÅ› ty, kliknij poniższy link, aby odzyskać swoje konto w ciÄ…gu %s: register_success=Rejestracja powiodÅ‚a siÄ™ @@ -532,7 +522,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Å›(-aÅ›) dodany jako współtwórca do repozytorium: +repo.collaborator.added.text=ZostaÅ‚eÅ› 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. @@ -541,28 +531,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 requeÅ›cie. +issue.action.reject = @%[1]s poprosiÅ‚ o zmiany w tym pull requescie. 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 e-mail 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 email 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Å›(-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. +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. 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Å›(-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. +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. 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. +issue.action.merge = połączone [modal] @@ -660,23 +650,16 @@ 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Å›(-aÅ›) organizacjÄ™ %s. +organization_leave_success = PomyÅ›lnie opuÅ›ciÅ‚eÅ› 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] change_avatar=ZmieÅ„ swój awatar… @@ -695,31 +678,22 @@ 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 +followers_one = %d obserwujÄ…cych +following_one = %d obserwowanych block_user = Zablokuj użytkownika +block_user.detail = PamiÄ™taj, że zablokowanie użytkownika powoduje inne skutki, takie jak: 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. +block_user.detail_2 = Ten użytkownik nie bÄ™dzie mógÅ‚ wchodzić w interakcjÄ™ z repozytoriami, których jesteÅ› wÅ‚aÅ›cicielem, ani z problemami i komentarzami, które utworzyÅ‚eÅ›. +follow_blocked_user = Nie możesz obserwować tego użytkownika, ponieważ go zablokowaÅ‚eÅ› lub ten użytkownik zablokowaÅ‚ Ciebie. +email_visibility.limited = Twój adres e-mail jest widoczny dla wszystkich uwierzytelnionych użytkowników 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 = Ustawienia użytkownika [settings] profile=Profil @@ -777,15 +751,15 @@ emails=Adresy e-mail manage_emails=ZarzÄ…dzaj adresami e-mail 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. +theme_desc=BÄ™dzie to domyÅ›lny motyw na caÅ‚ej stronie. primary=Podstawowy activated=Aktywowany requires_activation=Wymaga aktywacji primary_email=Ustaw jako podstawowy -activate_email=WyÅ›lij e-mail aktywacyjny +activate_email=WyÅ›lij email aktywacyjny activations_pending=OczekujÄ…ce aktywacje delete_email=UsuÅ„ -email_deletion=UsuÅ„ adres e-mail +email_deletion=UsuÅ„ adres email 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. @@ -964,96 +938,6 @@ 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 @@ -1083,16 +967,16 @@ 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 +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(-na), 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, 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 +auto_init=Inicjalizuj repozytorium (dodaje .gitignore, licencjÄ™ i README) trust_model_helper_default=DomyÅ›lnie: Użyj domyÅ›lnego modelu zaufania dla tej instalacji create_repo=Utwórz repozytorium default_branch=DomyÅ›lny branch @@ -1137,7 +1021,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 @@ -1147,7 +1031,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. @@ -1159,33 +1043,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=Elementy migracji +migrate_items=SkÅ‚adniki 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=Requesty scalajÄ…ce +migrate_items_pullrequests=Pull Requesty +migrate_items_merge_requests=Merge Requests migrate_items_releases=Wydania -migrate_repo=Migruj repozytorium -migrate.clone_address=Migruj / Klonuj z adresu URL +migrate_repo=PrzenieÅ› 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 migrować dodatkowe elementy +migrate.migrate_items_options=Token dostÄ™pu jest wymagany, aby zmigrować dodatkowe elementy migrated_from=Zmigrowane z %[2]s -migrated_from_fake=Migrowane z %[1]s +migrated_from_fake=Zmigrowane 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 serwerów Github Enterprise. +migrate.github.description=Migracja danych z github.com lub innych instancji GitHub. 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. +migrate.gitea.description=Migruj dane z gitea.com lub innych instancji Gitea/Forgejo. 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. @@ -1195,8 +1079,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 zgÅ‚oszeÅ„ -migrate.migrating_pulls=Migracja pull requestów +migrate.migrating_issues=Migracja problemów +migrate.migrating_pulls=Migracja Pull Requestów mirror_from=kopia lustrzana forked_from=sforkowany z @@ -1213,7 +1097,7 @@ fork=Forkuj download_archive=Pobierz repozytorium no_desc=Brak opisu -quick_guide=Szybki przewodnik +quick_guide=Skrócona instrukcja 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Å„ @@ -1229,7 +1113,7 @@ find_tag=Znajdź tag branches=Gałęzie tags=Tagi issues=ZgÅ‚oszenia -pulls=Pull requesty +pulls=OczekujÄ…ce zmiany project_board=Projekty labels=Etykiety org_labels_desc=Etykiety organizacji, które mogÄ… być używane z wszystkimi repozytoriami w tej organizacji @@ -1245,9 +1129,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 nieprzetworzony +file_view_raw=Zobacz czysty file_permalink=BezpoÅ›redni odnoÅ›nik file_too_large=Ten plik jest zbyt duży, aby go wyÅ›wietlić. @@ -1259,7 +1143,7 @@ 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 @@ -1282,14 +1166,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 '<%s>' +editor.add_tmpl=Dodanie '' editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis… -editor.commit_directly_to_this_branch=Zmieniaj bezpoÅ›rednio gałąź %[1]s. +editor.commit_directly_to_this_branch=Zmieniaj bezpoÅ›rednio gałąź %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 @@ -1342,10 +1226,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=Podstawowy kanban -projects.type.bug_triage=Segregacja bugów -projects.template.desc=Szablon -projects.template.desc_helper=Wybierz szablon projektu by rozpocząć +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.uncategorized=Bez kategorii projects.column.edit_title=Nazwa projects.column.new_title=Nazwa @@ -1362,12 +1246,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 etykiet +issues.new.no_label=Brak etykiety 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=Otwarte projekty +issues.new.open_projects=Otwórz projekty issues.new.closed_projects=ZamkniÄ™te projekty issues.new.no_items=Brak elementów issues.new.milestone=KamieÅ„ milowy @@ -1383,7 +1267,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 @@ -1458,17 +1342,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=Zamknij z komentarzem +issues.close_comment_issue=Skomentuj i zamknij issues.reopen_issue=Otwórz ponownie -issues.reopen_comment_issue=Otwórz ponownie z komentarzem +issues.reopen_comment_issue=Skomentuj i otwórz ponownie issues.create_comment=Skomentuj issues.closed_at=`zamknÄ…Å‚(-ęła) to zgÅ‚oszenie %[2]s` issues.reopened_at=`otworzyÅ‚(-a) ponownie to zgÅ‚oszenie %[2]s` issues.commit_ref_at=`wspomniaÅ‚(-a) to zgÅ‚oszenie z commita %[2]s` issues.ref_issue_from=`odwoÅ‚aÅ‚(-a) siÄ™ do tego zgÅ‚oszenia %[4]s %[2]s` issues.ref_pull_from=`odwoÅ‚aÅ‚(-a) siÄ™ do tego Pull Requesta %[4]s %[2]s` -issues.ref_closing_from=`odwoÅ‚aÅ‚(-a) siÄ™ do pull requesta %[4]s, który zamknie to zgÅ‚oszenie %[2]s` -issues.ref_reopening_from=`odwoÅ‚aÅ‚(-a) siÄ™ z pull requesta %[4]s, który otworzy na nowo to zgÅ‚oszenie %[2]s` +issues.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_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` @@ -1506,12 +1390,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ółpracowników %s -issues.lock_no_reason=zablokowano i ograniczono konwersacjÄ™ do współpracowników %s +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.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 zgÅ‚oszenia. +issues.lock.notice_1=- Inni użytkownicy nie mogÄ… dodawać nowych komentarzy do tego zagadnienia. 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. @@ -1570,7 +1454,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. @@ -1609,8 +1493,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 @@ -1618,8 +1502,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 @@ -1643,7 +1527,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 zawierajÄ…cych konflikty +pulls.num_conflicting_files_1=%d plików 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Å„ @@ -1705,7 +1589,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 kamieÅ„ milowy +milestones.modify=Zaktualizuj cel 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. @@ -1731,7 +1615,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 strony +wiki.wiki_page_revisions=Wersje stron wiki 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. @@ -1748,39 +1632,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Å‚oszenie -activity.active_issues_count_n=%d aktywne zgÅ‚oszenia +activity.active_issues_count_1=%d Aktywne zgÅ‚oszenia +activity.active_issues_count_n=%d Aktywnych zgÅ‚oszeÅ„ 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 wydania +activity.title.releases_1=%d Wydanie +activity.title.releases_n=%d WydaÅ„ activity.title.releases_published_by=%s opublikowane przez %s -activity.published_release_label=Wydanie +activity.published_release_label=Opublikowane 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 @@ -1824,7 +1708,7 @@ settings.collaboration.undefined=Niezdefiniowany settings.hooks=Webhooki settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe -settings.mirror_settings=Ustawienia kopii lustrzanej +settings.mirror_settings=Kopia lustrzana ustawieÅ„ settings.mirror_settings.mirrored_repository=Repozytorium lustrzane settings.mirror_settings.direction=Kierunek settings.mirror_settings.direction.pull=Pull @@ -1835,30 +1719,30 @@ settings.mirror_settings.push_mirror.remote_url=Adres URL zdalnego repozytorium settings.sync_mirror=Synchronizuj teraz settings.site=Strona -settings.update_settings=Zapisz ustawienia +settings.update_settings=Aktualizuj 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 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.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.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 dziennika zgÅ‚oszeÅ„ +settings.tracker_url_format=Format adresu URL zewnÄ™trznego systemu Å›ledzenia 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 dziennika zgÅ‚oszeÅ„ +settings.tracker_issue_style=Format numerowania dla zewnÄ™trznego systemu Å›ledzenia 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 @@ -1903,7 +1787,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. @@ -1913,7 +1797,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 współpracownika +settings.add_collaborator=Dodaj 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. @@ -1936,7 +1820,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Ä™ @@ -1950,7 +1834,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 @@ -1961,7 +1845,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 wypchniÄ™cia +settings.event_push_only=Wydarzeniach przepchniÄ™cia settings.event_send_everything=Wszystkich wydarzeniach settings.event_choose=Niestandardowych wydarzeniach… settings.event_header_repository=Zdarzenia repozytorium @@ -1979,39 +1863,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=Modyfikacje +settings.event_issues=ZgÅ‚oszenia settings.event_issues_desc=ZgÅ‚oszenie otwarte, zamkniÄ™te, ponownie otwarte lub zmodyfikowane. -settings.event_issue_assign=Przypisania +settings.event_issue_assign=ZgÅ‚oszenie przypisane settings.event_issue_assign_desc=ZgÅ‚oszenie przypisane bÄ…dź nieprzypisane. -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_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_comment_desc=Komentarz w zgÅ‚oszeniu stworzony, edytowany lub usuniÄ™ty. -settings.event_header_pull_request=Zdarzenia pull requestów -settings.event_pull_request=Modyfikacje +settings.event_header_pull_request=Zdarzenia Pull Requestów +settings.event_pull_request=Pull Request settings.event_pull_request_desc=Pull request otwarty, zamkniÄ™ty, ponownie otwarty lub zmodyfikowany. -settings.event_pull_request_assign=Przypisania +settings.event_pull_request_assign=Pull Request przypisany settings.event_pull_request_assign_desc=Pull Request przypisany bÄ…dz nieprzypisany. -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_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_comment_desc=Komentarz pull requestu stworzony, edytowany lub usuniÄ™ty. -settings.event_pull_request_review=Recenzje +settings.event_pull_request_review=Pull Request zrecenzowany settings.event_pull_request_review_desc=Pull request zatwierdzony, odrzucony lub zrecenzowany. -settings.event_pull_request_sync=Synchronizacja -settings.event_pull_request_sync_desc=Gałąź zaktualizowana automatycznie z gałęziÄ… docelowÄ…. +settings.event_pull_request_sync=Pull Request Zsynchronizowany +settings.event_pull_request_sync_desc=Pull request zsynchronizowany. 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 dostarczenia +settings.delete_webhook=UsuÅ„ Webhooka +settings.recent_deliveries=Ostatnie wywoÅ‚ania settings.hook_type=Typ hooka settings.slack_token=Token settings.slack_domain=Domena @@ -2034,7 +1918,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=ReguÅ‚y ochrony dla gałęzi "%s" +settings.branch_protection=`Ochrona gałęzi dla "%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 @@ -2044,9 +1928,9 @@ 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 wypychania +settings.protect_whitelist_users=Użytkownicy dopuszczeni do pushowania settings.protect_whitelist_search_users=Szukaj użytkowników… -settings.protect_whitelist_teams=ZespoÅ‚y dopuszczone do wypychania +settings.protect_whitelist_teams=ZespoÅ‚y dopuszczone do pushowania 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. @@ -2081,13 +1965,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=Dodaj regułę +settings.tags.protection.create=ChroÅ„ tag settings.tags.protection.none=Brak chronionych tagów. settings.bot_token=Token bota settings.chat_id=ID czatu @@ -2109,7 +1993,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 jesteÅ› pewien(-na)? +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_findpointerfiles=Znajdź pliki wskaźnika settings.lfs_locks=Blokady settings.lfs_invalid_locking_path=NieprawidÅ‚owa Å›cieżka: %s @@ -2121,7 +2005,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=Hash bloba +settings.lfs_pointers.sha=SHA bloba settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=W repozytorium settings.lfs_pointers.exists=Istnieje w magazynie @@ -2137,8 +2021,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=Pobierz plik Å‚atki -diff.download_diff=Pobierz plik zmian +diff.download_patch=ÅšciÄ…gnij plik aktualizacji +diff.download_diff=ÅšciÄ…gnij plik porównania diff.show_split_view=Widok podzielony diff.show_unified_view=Zunifikowany widok diff.whitespace_button=Znaki biaÅ‚e @@ -2164,7 +2048,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=ZakoÅ„cz recenzjÄ™ +diff.review=Recenzuj diff.review.header=Dodaj recenzjÄ™ diff.review.placeholder=Komentarz recenzji diff.review.comment=Skomentuj @@ -2183,7 +2067,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 @@ -2192,10 +2076,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 wersja wstÄ™pna +release.prerelease_desc=Oznacz jako wczesne wydanie release.prerelease_helper=Oznacz to wydanie jako nieprzeznaczone na użytek produkcyjny. release.cancel=Anuluj -release.publish=Publikuj wydanie +release.publish=Publikuj wersjÄ™ release.save_draft=Zapisz szkic release.edit_release=Zaktualizuj wydanie release.delete_release=UsuÅ„ wydanie @@ -2211,7 +2095,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 tag +release.add_tag=Utwórz tylko znacznik branch.name=Nazwa gałęzi branch.delete_head=UsuÅ„ @@ -2260,7 +2144,7 @@ settings.protect_patterns = Szablony default_branch_label = domyÅ›lnie issues.author = Autor commit.operations = Operacje -commit.revert = Przywróć +commit.revert = Odwróć pull.deleted_branch = (usuniÄ™to):%s diff.vendored = dostarczono from_comment = (komentarz) @@ -2274,593 +2158,13 @@ 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 = Zakoduj +escape_control_characters = Escape 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 @@ -2915,21 +2219,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 czÅ‚onka: +members.private_helper=pokaż +members.member_role=Rola: members.owner=WÅ‚aÅ›ciciel members.member=CzÅ‚onek members.remove=UsuÅ„ members.leave=Opuść -members.leave.detail=Czy jesteÅ› pewien(-na), że chcesz opuÅ›cić organizacjÄ™ "%s"? +members.leave.detail=OpuÅ›cić %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=Czy jesteÅ› pewien(-na), że chcesz opuÅ›cić zespół "%s"? +teams.leave.detail=OpuÅ›cić %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 @@ -2949,7 +2253,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… @@ -2969,26 +2273,6 @@ 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 @@ -2997,7 +2281,7 @@ organizations=Organizacje repositories=Repozytoria hooks=Weebhook'i authentication=ŹródÅ‚a uwierzytelniania -emails=E-maile użytkowników +emails=Emaile użytkowników config=Konfiguracja notices=Powiadomienia systemu monitor=Monitorowanie @@ -3036,13 +2320,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_principals" z podmiotami SSH Forgejo. +dashboard.resync_all_sshprincipals=Zaktualizuj plik '.ssh/authorized_keys' z kluczami 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=Czas pracy serwera -dashboard.current_goroutine=Bieżące goroutines +dashboard.server_uptime=Uptime 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 @@ -3074,7 +2358,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=Utwórz konto użytkownika +users.new_account=Nowy użytkownik users.name=Nazwa użytkownika users.full_name=ImiÄ™ i nazwisko users.activated=Aktywny @@ -3084,7 +2368,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 @@ -3095,12 +2379,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=Aktywne konto -users.prohibit_login=Zawieszone konto -users.is_admin=Konto administratora -users.is_restricted=Ograniczone konto +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.allow_git_hook=Może tworzyć hooki Gita -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_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_import_local=Może importować lokalne repozytoria users.allow_create_organization=Może tworzyć organizacje users.update_profile=Zaktualizuj konto użytkownika @@ -3113,7 +2397,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 e-mail +emails.email_manage_panel=ZarzÄ…dzanie adresami email emails.primary=Podstawowy emails.activated=Aktywowany emails.filter_sort.email=E-mail @@ -3125,7 +2409,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 organizacjami +orgs.org_manage_panel=ZarzÄ…dzanie organizacjÄ… orgs.name=Nazwa orgs.teams=ZespoÅ‚y orgs.members=CzÅ‚onkowie @@ -3149,11 +2433,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 @@ -3187,7 +2471,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 @@ -3247,9 +2531,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Å‚ instancji +config.app_name=TytuÅ‚ strony config.app_ver=Wersja Forgejo -config.app_url=Podstawowy adres URL +config.app_url=Podstawowy adres URL Forgejo 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 @@ -3306,7 +2590,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=Domena ukrytych e-maili +config.no_reply_address=Ukryta domena e-mail config.default_visibility_organization=DomyÅ›lna widoczność dla nowych organizacji config.default_enable_dependencies=DomyÅ›lne włączanie zależnoÅ›ci zgÅ‚oszeÅ„ @@ -3347,19 +2631,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 federowane awatary +config.enable_federated_avatar=Włącz sfederowane awatary config.git_config=Konfiguracja Git -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_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_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 operacji GC +config.git_gc_timeout=Limit czasu usuwania Å›mieci config.log_config=Konfiguracja dziennika config.disabled_logger=Wyłączone @@ -3388,8 +2672,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Ä… @@ -3397,7 +2681,7 @@ monitor.queue.settings.submit=Aktualizuj ustawienia monitor.queue.settings.changed=Zaktualizowano ustawienia notices.system_notice_list=Powiadomienia systemu -notices.view_detail_header=Szczegóły powiadomienia +notices.view_detail_header=Pokaż szczegóły powiadomienia notices.select_all=Wybierz wszystkie notices.deselect_all=Odznacz wszystkie notices.inverse_selection=Odwróć wybór @@ -3426,127 +2710,6 @@ 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] @@ -3560,27 +2723,6 @@ 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 @@ -3618,9 +2760,7 @@ pin=Przypnij powiadomienie mark_as_read=Oznacz jako przeczytane mark_as_unread=Oznacz jak nieprzeczytane mark_all_as_read=Oznacz wszystkie jako przeczytane -subscriptions = Subskrypcje -no_subscriptions = Brak subskrypcji -watching = Obserwowane +subscriptions = Subskrybcje [gpg] default_key=Podpisano domyÅ›lnym kluczem @@ -3628,8 +2768,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 niepodpisany -error.failed_retrieval_gpg_keys=Nie udaÅ‚o siÄ™ uzyskać żadnego klucza powiÄ…zanego z kontem autora +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.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. @@ -3670,167 +2810,9 @@ 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 @@ -3861,100 +2843,26 @@ 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] 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 = Przybliżone -package_kind = Wyszukaj pakiety... -fuzzy_tooltip = UwzglÄ™dnij wyniki, które sÄ… bliskie wyszukiwanemu hasÅ‚u +fuzzy = Fuzzy +package_kind = Wyszukaj paczki... +fuzzy_tooltip = UwzglÄ™dnij wyniki, które również pasujÄ… do wyszukiwanego hasÅ‚a match = Dopasuj match_tooltip = UwzglÄ™dniaj tylko wyniki pasujÄ…ce do wyszukiwanego hasÅ‚a repo_kind = Wyszukaj repozytoria... @@ -3971,49 +2879,10 @@ commit_kind = Wyszukaj commity... runner_kind = Wyszukaj runnery... keyword_search_unavailable = Wyszukiwanie wedÅ‚ug słów kluczowych jest obecnie niedostÄ™pne. Skontaktuj siÄ™ z administratorem strony. milestone_kind = Wyszukaj kamienie milowe... -union_tooltip = UwzglÄ™dnia wyniki pasujÄ…ce do dowolnego sÅ‚owa kluczowego rozdzielonego biaÅ‚ymi znakami -exact = DokÅ‚adne +union_tooltip = UwzglÄ™dnij wyniki pasujÄ…ce do dowolnego sÅ‚owa kluczowego oddzielonego spacjami +exact = DokÅ‚adnie exact_tooltip = UwzglÄ™dniaj tylko wyniki pasujÄ…ce do wyszukiwanego hasÅ‚a -issue_kind = Wyszukaj zgÅ‚oszenia... +issue_kind = Wyszukaj problemy... pull_kind = Wyszukaj pull requesty... 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 +regexp = RegExp \ No newline at end of file diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 2092e7e4d4..ab8aab979c 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -55,7 +55,7 @@ organization=Organização mirror=Espelhamento new_repo=Novo repositório new_migrate=Nova migração -new_mirror=Novo espelho +new_mirror=Novo espelhamento new_fork=Novo fork do repositório new_org=Nova organização new_project=Novo projeto @@ -109,7 +109,7 @@ preview=Pré-visualização loading=Carregando… error=Erro -error404=A página que você está tentando acessar não existe, foi removida ou você não tem autorização para visualizá-la. +error404=A página que você está tentando acessar não existe ou você não está autorizado a visualizá-la. never=Nunca unknown=Desconhecido @@ -166,7 +166,6 @@ 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 @@ -200,16 +199,6 @@ 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 @@ -228,12 +217,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=Foi confirmado que o Forgejo roda em sistemas operacionais livres, como Linux e FreeBSD, assim como em diferentes arquiteturas de CPU. Escolha sua preferida! 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 @@ -488,7 +477,6 @@ 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 @@ -684,8 +672,6 @@ 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] @@ -727,8 +713,8 @@ 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.self_public = Sua atividade está visível para todos, exceto o engajamento 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 o engajamento 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. @@ -752,9 +738,9 @@ uid=UID webauthn=Chaves de segurança public_profile=Perfil público -biography_placeholder=Conte um pouco sobre você! (Markdown é suportado) +biography_placeholder=Conte-nos um pouco sobre você! (Você pode usar Markdown) location_placeholder=Compartilhe sua localização aproximada com outras pessoas -profile_desc=Sobre você +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. 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 @@ -811,7 +797,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. A partir de agora, use sua nova senha para acessar sua conta. +change_password_success=Sua senha foi atualizada. Acesse usando sua nova senha de agora em diante. 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 @@ -819,7 +805,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 tema será usado para a interface web quando você fizer login. +theme_desc=Este será o seu tema padrão em todo o site. primary=Principal activated=Ativado requires_activation=Requer ativação @@ -845,7 +831,7 @@ 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=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. +keep_email_private_popup=Isso ocultará seu endereço de e-mail do seu perfil. Ele não será mais o padrão para commits feitos pela interface web, como envios de arquivos e modificações, e não será usado para commits de merge. Em vez disso, um endereço especial %s pode ser usado para associar commits com a sua conta. Note que modificar 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 @@ -997,7 +983,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 recuperação de uso único (%s) em um local seguro, pois ele não será exibido 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_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. @@ -1046,7 +1032,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 @@ -1061,36 +1047,6 @@ 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 @@ -1130,11 +1086,11 @@ 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_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 README readme_helper_desc=Aqui você pode escrever uma descrição completa para o seu projeto. -auto_init=Inicializar repositório +auto_init=Inicializar o repositório (Adiciona arquivos .gitignore, licença e README) 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 @@ -1168,7 +1124,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 @@ -1205,10 +1161,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 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. +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. 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. @@ -1246,14 +1202,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 de %s … +migrate.migrating=Migrando a partir 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. +migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. 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. @@ -1380,8 +1336,7 @@ editor.or=ou editor.cancel_lower=Cancelar 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_tmpl=Adicionar "" editor.add=Adicionar %s editor.update=Atualizar %s editor.delete=Excluir %s @@ -1391,7 +1346,7 @@ editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"` 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 %[1]s. +editor.commit_directly_to_this_branch=Commit diretamente no branch %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 @@ -1407,7 +1362,7 @@ 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ê 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_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. 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? @@ -1746,7 +1701,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 @@ -1860,7 +1815,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 @@ -2434,9 +2389,9 @@ settings.require_signed_commits_desc=Rejeitar pushes para este branch se não es 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 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_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 %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.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. @@ -2478,8 +2433,8 @@ 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 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.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.update_avatar_success=O avatar do repositório foi atualizado. settings.lfs=LFS settings.lfs_filelist=Arquivos LFS armazenados neste repositório @@ -2495,7 +2450,7 @@ 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 travar… +settings.lfs_lock_path=Caminho de arquivo para bloquear... 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 @@ -2655,7 +2610,7 @@ 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 @@ -2679,7 +2634,7 @@ 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 @@ -2692,7 +2647,7 @@ pulls.cmd_instruction_checkout_title = Checkout 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 issues neste repositório porque você foi bloqueado pelo dono do repositório. +issues.blocked_by_user = Você não pode criar uma questão 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 @@ -2736,7 +2691,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 @@ -2764,7 +2719,7 @@ 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 = Réplicas não estão disponíveis em repositórios arquivados. +settings.archive.mirrors_unavailable = As réplicas ficarão indisponíveis se o repositório estiver arquivado. 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: @@ -2783,8 +2738,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. 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. +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. 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. @@ -2799,7 +2754,7 @@ 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. +issues.comment.blocked_by_user = Você não pode criar um comentário nesse problema porque você está bloqueado pelo dono do repositório ou pelo autor do problema. 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. @@ -2875,43 +2830,13 @@ settings.discord_icon_url.exceeds_max_length = A URL do ícone precisa ter 2048 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 = 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 @@ -3045,8 +2970,6 @@ 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 @@ -3217,7 +3140,7 @@ 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 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 @@ -3579,7 +3502,7 @@ 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. +self_check.database_fix_mysql = Para usuários do MySQL/MariaDB, você pode usar o comando "gitea 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. @@ -3604,7 +3527,6 @@ users.restricted.description = Permitir interação somente com os repositórios 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] @@ -3740,18 +3662,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 @@ -3779,9 +3701,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 @@ -3794,8 +3716,8 @@ 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 tempo de execução -rubygems.dependencies.development=Dependências de desenvolvimento +rubygems.dependencies.runtime=Dependências 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: @@ -3842,11 +3764,11 @@ 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.multiple_groups = Este pacote está disponível em vários grupos. -npm.dependencies.bundle = Dependências em bundle +npm.dependencies.bundle = Dependências empacotadas 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.properties = Propriedades de Versão arch.version.description = Descrição arch.version.groups = Grupo arch.version.provides = Fornece @@ -3865,15 +3787,6 @@ 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 @@ -3991,9 +3904,6 @@ 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] @@ -4013,33 +3923,33 @@ executable_file = Arquivo executável [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 = Buscar runners… +runner_kind = Pesquisar 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_tooltip = Incluir resultados que coincidam com 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… +issue_kind = Pesquisar problemas... +pull_kind = Pesquisar pulls... regexp_tooltip = Interpretar o termo de busca como uma expressão regular regexp = RegExp @@ -4078,4 +3988,4 @@ packages.write = Escrever: Publique e delete pacotes atribuídos ao repos 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 +test = To preserve its claws, the giant anteater walks on its front knuckles, like gorillas \ No newline at end of file diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 42866bbf5e..e141a30846 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, foi removida ou não tem autorização para a ver. +error404=A página que pretende aceder não existe 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 = Derivado +filter.is_fork = Derivações 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 = Filtrar +filter = Filtro copy_generic = Copiar para a área de transferência test = Teste error413 = Você esgotou a sua quota. @@ -166,7 +166,6 @@ 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 @@ -200,16 +199,6 @@ 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 @@ -217,7 +206,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 Codeberg 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 GitHub 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. @@ -488,7 +477,6 @@ 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 @@ -685,8 +673,6 @@ 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… @@ -752,9 +738,9 @@ uid=UID webauthn=Autenticação em dois passos (chaves de segurança) public_profile=Perfil público -biography_placeholder=Diga aos outros um pouco sobre si! (Markdown é suportado) +biography_placeholder=Conte-nos um pouco sobre si! (Pode usar Markdown) location_placeholder=Partilhe a sua localização aproximada com outros -profile_desc=Sobre si +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. 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 @@ -811,7 +797,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 atualizada. A partir de agora, utilize a sua nova senha para iniciar sessão. +change_password_success=A sua senha foi substituída. Inicie a sessão com a nova senha a partir de agora. 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 @@ -819,7 +805,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 tema será usado para a interface web quando tiver sessão iniciada. +theme_desc=Este será o seu tema padrão em todo o sítio. primary=Principal activated=Em uso requires_activation=Tem que ser habilitado @@ -845,7 +831,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=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. +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. openid_desc=O OpenID permite delegar a autenticação num fornecedor externo. manage_ssh_keys=Gerir chaves SSH @@ -948,7 +934,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: @@ -1040,7 +1026,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 registados +visibility.limited_tooltip=Visível apenas para utilizadores autenticados 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 @@ -1061,36 +1047,6 @@ language.title = Idioma predefinido keep_activity_private.description = O seu trabalho público apenas estará visível para si e para os administradores da instância. language.description = Este idioma vai ser guardado na sua conta e ser usado como o predefinido depois de iniciar sessão. language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais. -pronouns_custom_label = Pronomes personalizados -user_block_yourself = Não se pode bloquear a si próprio. -change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estará disponível para todos após um período de espera de %[1]d dia, 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. @@ -1133,13 +1089,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 +auto_init=Inicializar repositório (adiciona `.gitignore`, `LICENSE` e `README.md`) 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 @@ -1174,7 +1130,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 não adotados… (deixe em branco para encontrar todos) +adopt_search=Insira o nome de utilizador para procurar repositórios adoptados... (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 @@ -1217,8 +1173,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 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.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.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. @@ -1258,14 +1214,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. +migrate.gitea.description=Migrar dados de gitea.com ou de outras instâncias do Gitea/Forgejo. 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. @@ -1394,7 +1350,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 "<%s>" +editor.add_tmpl=Adicionar "" editor.add=Adicionar %s editor.update=Modificar %s editor.delete=Eliminar %s @@ -1404,7 +1360,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 %[1]s. +editor.commit_directly_to_this_branch=Cometer imediatamente no ramo %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 @@ -1420,7 +1376,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 abriu o ficheiro. Clique aqui para ver as modificações ou Cometer modificações novamente para escrever por cima. +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_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? @@ -1770,7 +1726,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 @@ -1824,8 +1780,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 %[1]s %[2]s -issues.review.remove_review_request=removeu a solicitação de revisão para %[1]s %[2]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.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. @@ -1886,7 +1842,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 @@ -2553,9 +2509,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 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.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.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. @@ -2576,7 +2532,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 @@ -2629,7 +2585,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 @@ -2753,7 +2709,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 questões neste repositório porque foi bloqueado(a) pelo(a) proprietário(a) do repositório. +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.num_participants_one = %d participante stars = Favoritos editor.invalid_commit_mail = Email inválido para criar um cometimento. @@ -2779,7 +2735,7 @@ 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 = Habilitar mais @@ -2819,7 +2775,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 comentar nesta questão porque foi bloqueado(a) pelo(a) proprietário(a) ou pelo autor da questão. +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. 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. @@ -2867,53 +2823,15 @@ 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 proteção de ramo +settings.protect_new_rule = Criar uma nova regra de salvaguarda do 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. @@ -2958,7 +2876,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 regitados) +settings.visibility.limited=Limitada (visível apenas para utilizadores autenticados) settings.visibility.limited_shortname=Limitada settings.visibility.private=Privada (visível apenas para membros da organização) settings.visibility.private_shortname=Privado @@ -3046,8 +2964,6 @@ 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 @@ -3233,8 +3149,8 @@ orgs.members=Membros orgs.new_orga=Nova organização repos.repo_manage_panel=Gerir repositórios -repos.unadopted=Repositórios não adotados -repos.unadopted.no_more=Não foram encontrados repositórios não adotados. +repos.unadopted=Repositórios não adoptados +repos.unadopted.no_more=Não foram encontrados mais repositórios não adoptados repos.owner=Proprietário(a) repos.name=Nome repos.private=Privado @@ -3341,9 +3257,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 @@ -3581,9 +3497,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 Forgejo 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 Gitea 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 "forgejo 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 "gitea 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 @@ -3606,7 +3522,6 @@ 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 @@ -3731,7 +3646,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ções do repositório +alpine.repository=Informação do repositório alpine.repository.branches=Ramos alpine.repository.repositories=Repositórios alpine.repository.architectures=Arquitecturas @@ -3751,9 +3666,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 da imagem +container.layers=Camadas de imagem container.labels=Rótulos container.labels.key=Chave container.labels.value=Valor @@ -3762,7 +3677,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ções do repositório +debian.repository=Informação do repositório debian.repository.distributions=Distribuições debian.repository.components=Componentes debian.repository.architectures=Arquitecturas @@ -3792,12 +3707,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ções do repositório +rpm.repository=Informação 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 em tempo de execução +rubygems.dependencies.runtime=Dependências do tempo de execução (runtime) 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 @@ -3858,7 +3773,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 = Depende opcionalmente +arch.version.optdepends = Dependências opcionais arch.version.depends = Depende de arch.version.makedepends = Dependências do make arch.version.groups = Grupo @@ -3866,15 +3781,6 @@ 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 @@ -3993,9 +3899,6 @@ 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 @@ -4005,6 +3908,7 @@ 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 @@ -4014,30 +3918,30 @@ 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... @@ -4059,7 +3963,7 @@ filepreview.line = Linha %[1]d em %[2]s filepreview.truncated = A previsão foi truncada [translation_meta] -test = ok :) +test = ok [repo.permissions] code.read = Ler: Aceder e clonar o código-fonte do repositório. @@ -4068,8 +3972,8 @@ 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. +actions.read = Ler: Ver canais CI/CD integrados e os seus registos. +actions.write = Escrever: Despoletar, reiniciar, cancelar ou aprovar manualmente canais 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. @@ -4079,4 +3983,4 @@ 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. +pulls.write = Escrever: Fechar pedidos de integração e gerir metadados, tais como rótulos, etapas, encarregados, datas de vencimento e dependências. \ No newline at end of file diff --git a/options/locale/locale_ro.ini b/options/locale/locale_ro.ini deleted file mode 100644 index 305c34d013..0000000000 --- a/options/locale/locale_ro.ini +++ /dev/null @@ -1,249 +0,0 @@ - - - -[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 4820a60ca8..a0d526ed17 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,7 +155,7 @@ filter.public = Публичные filter.private = ЧаÑтные filter.is_archived = Ðрхивированные filter.not_mirror = Ðе зеркала -more_items = Больше разделов +more_items = Больше Ñлементов invalid_data = Ðеверные данные: %v copy_generic = Копировать в буфер обмена test = Проверить @@ -166,7 +166,6 @@ new_repo.title = Ðовый репозиторий new_migrate.title = Ðовый Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ new_org.title = ÐÐ¾Ð²Ð°Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ new_repo.link = Создать репозиторий -copy_path = Копировать путь [aria] navbar=Панель навигации @@ -200,16 +199,6 @@ 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 - Я @@ -238,7 +227,7 @@ license_desc=Ð’ÑÑ‘ Ñто на документацией. +docker_helper=ЕÑли вы запуÑкаете Forgejo под Docker, пожалуйÑта, ознакомьтеÑÑŒ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸ÐµÐ¹, прежде чем изменÑть любые наÑтройки. require_db_desc=Forgejo требуетÑÑ MySQL, PostgreSQL, SQLite3 или TiDB (по протоколу MySQL). db_title=ÐаÑтройки базы данных db_type=Тип базы данных @@ -276,11 +265,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 -app_url_helper=Этот параметр влиÑет на URL ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ HTTP/HTTPS и на ÑÑылки в уведомлениÑÑ… по Ñл. почте. +http_port_helper=Ðомер порта, иÑпользуемый веб-Ñервером Forgejo. +app_url=Базовый URL Forgejo +app_url_helper=Этот параметр влиÑет на URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ HTTP/HTTPS и на некоторые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте. log_root_path=Путь журналов log_root_path_helper=Файлы журнала будут запиÑыватьÑÑ Ð² Ñтот каталог. @@ -288,9 +277,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=Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте @@ -320,11 +309,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 @@ -345,11 +334,11 @@ password_algorithm_helper=Задайте алгоритм Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ enable_update_checker=Проверка обновлений env_config_keys=ÐаÑтройка Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ env_config_keys_prompt=Следующие переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¶Ðµ будут применены к вашему конфигурационному файлу: -enable_update_checker_helper_forgejo = ПериодичеÑки проверÑть наличие новых верÑий Forgejo через «TXT» DNS-запиÑÑŒ домена release.forgejo.org. +enable_update_checker_helper_forgejo = ПериодичеÑки проверÑть наличие новых верÑий Forgejo через DNS-запиÑÑŒ TXT на 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 = Укажите лозунг вашего Ñервера, либо оÑтавьте пуÑтым Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ. @@ -364,7 +353,7 @@ my_orgs=Организации my_mirrors=Мои зеркала view_home=Показать %s search_repos=ПоиÑк репозиториÑ… -filter=Прочие фильтры +filter=Другие фильтры filter_by_team_repositories=Фильтровать по репозиториÑм команды feed_of=Лента «%s» @@ -684,8 +673,6 @@ Biography = О Ñебе Website = Веб-Ñайт Location = МеÑтоположение To = Ðазвание ветви -email_domain_is_not_allowed = Домен адреÑа Ñл. почты %s не разрешён к иÑпользованию. УбедитеÑÑŒ, что он введён правильно или попробуйте другой адреÑ. -username_claiming_cooldown = Это Ð¸Ð¼Ñ Ð¿Ð¾ÐºÐ° не может быть занÑто, Ñ‚.к. Ñрок его защиты ещё не вышел. Его получитÑÑ Ð·Ð°Ð½Ñть поÑле %[1]s. [user] @@ -693,13 +680,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=О Ñебе @@ -752,9 +739,9 @@ uid=UID webauthn=Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ (ключами безопаÑноÑти) public_profile=Публичный профиль -biography_placeholder=Кратко раÑÑкажите о Ñебе другим! (Можно иÑпользовать Markdown) +biography_placeholder=РаÑÑкажите немного о Ñебе! (Можно иÑпользовать Markdown) location_placeholder=ПуÑть вÑе знают, откуда вы -profile_desc=Ваш профиль +profile_desc=Как ваш профиль будет отображатьÑÑ Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей. Ваш оÑновной Ð°Ð´Ñ€ÐµÑ Ñл. почты будет иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹, воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¸ веб-операций Ñ Git. password_username_disabled=Ðелокальным пользователÑм запрещено изменение их имени пользователÑ. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации обратитеÑÑŒ к админиÑтратору Ñайта. full_name=Полное Ð¸Ð¼Ñ website=Веб-Ñайт @@ -767,7 +754,7 @@ update_language_success=Язык обновлён. update_profile_success=Ваш профиль уÑпешно обновлён. change_username=Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¾ изменено. change_username_prompt=Обратите внимание: изменение имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚Ð°ÐºÐ¶Ðµ менÑет URL вашей учётной запиÑи. -change_username_redirect_prompt=Старое Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ перенаправлÑть на новое до тех пор, пока оно не будет занÑто. +change_username_redirect_prompt=Старое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±ÑƒÐ´ÐµÑ‚ перенаправлÑть на новое до тех пор, пока его не займут. continue=Далее cancel=Отмена language=Язык @@ -811,15 +798,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=ТребуетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ @@ -947,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=РазрешениÑ: @@ -955,7 +942,7 @@ manage_oauth2_applications=Управление приложениÑми OAuth2 edit_oauth2_application=Изменить приложение OAuth2 oauth2_applications_desc=ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 позволÑет Ñтороннему приложению к безопаÑно аутентифицировать пользователей данной уÑтановки Forgejo. remove_oauth2_application=Удаление Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 -remove_oauth2_application_desc=Удаление Ñтого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ доÑтуп ко вÑем подпиÑанным токенам доÑтупа. Продолжить? +remove_oauth2_application_desc=Удаление Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ OAuth2 отменит доÑтуп ко вÑем подпиÑанным токенам доÑтупа. Продолжить? remove_oauth2_application_success=Приложение было уÑпешно удалено. create_oauth2_application=Создать новое приложение OAuth2 create_oauth2_application_button=Создать приложение @@ -966,8 +953,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 предоÑтавлÑет Ñтороннему приложению доÑтуп к учётным запиÑÑм пользователей данного ÑервиÑа. @@ -1034,7 +1021,7 @@ visibility=ВидимоÑть Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ visibility.public=Публичный visibility.public_tooltip=Виден вÑем, кто может открыть Ñтот Ñайт visibility.limited=Ограниченный -visibility.limited_tooltip=Виден только зарегиÑтрированным пользователÑм +visibility.limited_tooltip=Виден только зарегиÑтрированным пользователÑм Ñайта visibility.private=Скрытый visibility.private_tooltip=Виден только учаÑтникам организаций, в которых вы ÑоÑтоите blocked_users_none = Заблокированных пользователей нет. @@ -1042,11 +1029,11 @@ 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 = ПодÑказки @@ -1057,40 +1044,10 @@ 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=Владелец @@ -1101,11 +1058,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=Ðужна помощь в клонировании? ПоÑетите Ñтраницу помощи. @@ -1127,16 +1084,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=Инициализировать репозиторий +auto_init=Инициализировать репозиторий (ДобавлÑет .gitignore, LICENSE and README) trust_model_helper=Выберите модель Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подпиÑи. Возможные варианты: trust_model_helper_collaborator=СоучаÑтник: доверÑть подпиÑÑм ÑоучаÑтников trust_model_helper_committer=Ðвтор коммита: доверÑть подпиÑÑм, ÑоответÑтвующим авторам коммитов @@ -1168,7 +1125,7 @@ forks=ÐžÑ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ reactions_more=и ещё %d unit_disabled=ÐдминиÑтратор Ñайта отключил Ñтот раздел репозиториÑ. language_other=Разное -adopt_search=Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка неутверждённых репозиториев… (оÑтавьте пуÑтым, чтобы найти вÑе) +adopt_search=Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка неутверждённых репозиториев... (оÑтавьте пуÑтым, чтобы найти вÑе) adopt_preexisting_label=ПринÑтые файлы adopt_preexisting=ПринÑть уже ÑущеÑтвующие файлы adopt_preexisting_content=Создать репозиторий из %s @@ -1205,8 +1162,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. @@ -1243,7 +1200,7 @@ 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_no_addr=ÐŸÐµÑ€ÐµÐ½Ð¾Ñ Ð½Ðµ удалÑÑ. @@ -1375,7 +1332,7 @@ editor.or=или editor.cancel_lower=Отменить editor.commit_signed_changes=ЗафикÑировать подпиÑанные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ editor.commit_changes=Сохранить правки -editor.add_tmpl=Добавить «<%s>» +editor.add_tmpl=Добавить «» editor.add=Добавить %s editor.update=Обновить %s editor.delete=Удалить %s @@ -1385,7 +1342,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=Сохранить коммит напрÑмую в ветвь %[1]s. +editor.commit_directly_to_this_branch=Сохранить коммит напрÑмую в ветвь %s. editor.create_new_branch=Сохранить коммит в новую ветвь и начать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние. editor.create_new_branch_np=Создать новую ветвь Ð´Ð»Ñ Ñтого коммита. editor.propose_file_change=Предложить изменение файла @@ -1401,7 +1358,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=Файл, который вы ÑобираетеÑÑŒ зафикÑировать, пуÑÑ‚. Продолжить? @@ -1696,7 +1653,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 @@ -1750,15 +1707,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=Срок Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен или находитÑÑ Ð·Ð° пределами допуÑтимого диапазона. ПожалуйÑта, иÑпользуйте формат «гггг-мм-дд». @@ -1861,8 +1818,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` @@ -2183,7 +2140,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=Игнорировать незначащие Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ (пробелы, табулÑцию) при проверке ÑлиÑний на конфликты @@ -2233,17 +2190,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=Будьте внимательны! Как только вы удалите вики — пути назад не будет. @@ -2501,11 +2458,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 @@ -2522,7 +2479,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=ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° @@ -2686,7 +2643,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 Ñимволов. Ð’Ñе буквы должны быть Ñтрочными. @@ -2699,7 +2656,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 = Ðевозможно Ñоздать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние в Ñтом репозитории, Ñ‚.к. вы заблокированы его владельцем. @@ -2714,7 +2671,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 = Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован, Ñ‚.к. им изменÑетÑÑ Ð·Ð°Ñ‰Ð¸Ñ‰Ñ‘Ð½Ð½Ñ‹Ð¹ файл: @@ -2723,8 +2680,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 = ОÑтавить отзыв можно только при проÑмотре вÑех различий @@ -2745,7 +2702,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 будет переименована. ÐеÑохранённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ обновлениÑ. @@ -2780,7 +2737,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», без необходимоÑти в Ñоздании Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ новой ветви. @@ -2820,7 +2777,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. @@ -2880,44 +2837,12 @@ issues.review.add_remove_review_requests = запрошены рецензии 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 = Загрузка %s... component_loading_info = Это займёт некоторое времÑ… code_frequency.what = чаÑтота изменений recent_commits.what = недавние коммиты @@ -2960,7 +2885,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=ЧаÑÑ‚Ð½Ð°Ñ @@ -3048,8 +2973,6 @@ 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=Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ @@ -3379,13 +3302,13 @@ auths.invalid_openIdConnectAutoDiscoveryURL=Ðеверный URL Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾ config.server_config=ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера config.app_name=Ðазвание Ñервера config.app_ver=ВерÑÐ¸Ñ Forgejo -config.app_url=Базовый URL +config.app_url=Базовый URL Forgejo 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=Путь к данным Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ @@ -3436,8 +3359,8 @@ 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=Домен Ñкрытых адреÑов почты @@ -3569,7 +3492,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 могут иÑправить проблемы Ñ ÑопоÑтавлением командой "forgejo doctor convert". Также можно вручную впиÑать "ALTER ... COLLATE ..." в SQL. +self_check.database_fix_mysql = Пользователи MySQL и MariaDB могут иÑправить проблемы Ñ ÑопоÑтавлением командой "gitea doctor convert". Также можно вручную впиÑать "ALTER ... COLLATE ..." в SQL. dashboard.cleanup_actions = ОчиÑтить уÑтаревшие журналы и артефакты ДейÑтвий dashboard.sync_repo_branches = Синхронизировать ветви из Git в базу данных assets = Кодовые объекты @@ -3607,7 +3530,6 @@ emails.delete = Удалить Ð°Ð´Ñ€ÐµÑ emails.deletion_success = ÐÐ´Ñ€ÐµÑ Ñл. поÑты удалён из учётной запиÑи. emails.delete_primary_email_error = Ðевозможно удалить оÑновной адреÑ. emails.delete_desc = Ð’Ñ‹ точно хотите удалить Ñтот Ð°Ð´Ñ€ÐµÑ Ñл. почты? -monitor.duration = ДлительноÑть (Ñ) [action] @@ -3696,7 +3618,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 автора коммита @@ -3733,7 +3655,7 @@ details.project_site=Веб-Ñайт проекта details.repository_site=Веб-Ñайт Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ details.documentation_site=Веб-Ñайт документации details.license=Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ -assets=Объекты +assets=РеÑурÑÑ‹ versions=ВерÑии versions.view_all=Показать вÑÑ‘ dependency.id=ID @@ -3741,7 +3663,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=Репозитории @@ -3749,43 +3671,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 вашего проекта: @@ -3799,10 +3721,10 @@ 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.install=Чтобы уÑтановить пакет, выполните Ñледующую команду: rpm.repository = О репозитории rpm.repository.architectures = Ðрхитектуры rubygems.install=Чтобы уÑтановить пакет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ gem, выполните Ñледующую команду: @@ -3811,7 +3733,7 @@ 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, выполните Ñледующую команду: @@ -3877,15 +3799,6 @@ 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=Секреты @@ -4004,9 +3917,6 @@ 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=Индивидуальный проект @@ -4025,35 +3935,35 @@ submodule=Подмодуль [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 = ПоиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ воÑпринÑÑ‚ как регулÑрное выражение +regexp_tooltip = Интерпретировать поиÑковый Ð·Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ°Ðº регулÑрное выражение [markup] @@ -4062,7 +3972,7 @@ filepreview.lines = Строки Ñ %[1]d по %[2]d в %[3]s filepreview.truncated = ПредпроÑмотр был обрезан [translation_meta] -test = Forgejo +test = отмена skip-ci :) [repo.permissions] code.write = ЗапиÑÑŒ: отправка изменений в репозиторий, Ñоздание веток и тегов. @@ -4082,4 +3992,4 @@ issues.write = ЗапиÑÑŒ: закрытие задач и измене actions.write = ЗапиÑÑŒ: ручной запуÑк, перезапуÑк, отмена и одобрение работы конвейеров CI/CD. wiki.write = ЗапиÑÑŒ: Ñоздание, изменение и удаление Ñтраниц во вÑтроенной вики. packages.read = Чтение: проÑмотр и Ñкачивание пакетов в репозитории. -ext_issues = ДоÑтуп к ÑÑылке на внешний трекер задач. ÐаÑтройка разрешений выполнÑетÑÑ Ð²Ð½Ðµ Ñайта. +ext_issues = ДоÑтуп к ÑÑылке на внешний трекер задач. ÐаÑтройка разрешений выполнÑетÑÑ Ð²Ð½Ðµ Ñайта. \ No newline at end of file diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index 6dbb6dc3c2..84b9a9ee26 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -101,11 +101,6 @@ concept_user_organization=සංවිධà·à¶±à¶º name=නම -filter = පෙරහන -filter.is_archived = සංරක්ෂිත -filter.public = à¶´à·Šâ€à¶»à·ƒà·’ද්ධ -filter.private = පෞද්ගලික - [aria] [heatmap] @@ -121,6 +116,7 @@ missing_csrf=නරක ඉල්ලීම: CSRF à¶§à·à¶šà¶±à·Š නොමà·à¶­ app_desc=වේදනà·à¶šà·à¶»à·“, ස්වයං-සත්කà·à¶»à¶š Git සේවà·à·€à¶šà·Š install=ස්ථà·à¶´à¶±à¶ºà¶§ පහසුය platform=හරස් වේදිකà·à·€ +platform_desc=Forgejo ඕනෑම à¶­à·à¶±à¶š à¶°à·à·€à¶±à¶º Go සඳහ෠සම්පà·à¶¯à¶±à¶º à¶šà·… à·„à·à¶šà·’ය: වින්ඩà·à·ƒà·Š, මà·à¶šà·à·ƒà·Š, ලිනක්ස්, ARM, ආදිය ඔබ ආදරය කරන à¶‘à¶šà¶šà·Š à¶­à·à¶»à¶±à·Šà¶±! lightweight=à·ƒà·à·„à·à¶½à·Šà¶½à·” lightweight_desc=Forgejo à¶…à¶©à·” අවම à¶…à·€à·à·Šà¶ºà¶­à· ඇති à¶…à¶­à¶» මිල à¶…à¶©à·” Raspberry Pi මත à¶°à·à·€à¶±à¶º à¶šà·… à·„à·à¶šà·’ය. ඔබේ යන්ත්ර à·à¶šà·Šà¶­à·’ය සුරකින්න! license=විවෘත මූලà·à·à·Šâ€à¶» @@ -826,7 +822,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 අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. +migrate.gitea.description=Gitea.com හ෠වෙනත් Gitea/Forgejo අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.gogs.description=notabug.org හ෠වෙනත් Gogs අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.onedev.description=code.onedev.io හ෠වෙනත් OnedeV අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. migrate.gitbucket.description=GitBucket අවස්ථ෠වලින් දත්ත සංක්රමණය කරන්න. @@ -926,10 +922,10 @@ editor.or=à·„à· editor.cancel_lower=අවලංගු කරන්න editor.commit_signed_changes=අත්සන් à¶šà·… වෙනස්කම් සිදු කරන්න editor.commit_changes=වෙනස්කම් සිදු කරන්න -editor.add_tmpl='<%s>' à¶‘à¶šà¶­à·” කරන්න +editor.add_tmpl='' à¶‘à¶šà¶­à·” කරන්න editor.commit_message_desc=විකල්ප දීර්චවිස්තරයක් à¶‘à¶šà·Š කරන්න… editor.signoff_desc=à¶šà·à¶´à·€à·– ලොග් පණිවිඩය අවසà·à¶±à¶ºà·š දී à¶šà·à¶´à¶šà¶»à·” විසින් සිග්නෙඩ්-ඕෆ්-විසින් ට්රේලරයක් à¶‘à¶šà·Š කරන්න. -editor.commit_directly_to_this_branch=%[1]s à·à·à¶›à·à·€à¶§ කෙලින්ම à¶šà·à¶´ කරන්න. +editor.commit_directly_to_this_branch=%s à·à·à¶›à·à·€à¶§ කෙලින්ම à¶šà·à¶´ කරන්න. editor.create_new_branch=මෙම à¶šà·à¶´ කිරීම සඳහ෠නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à· අදින්න ඉල්ලීමක් ආරම්භ කරන්න. editor.create_new_branch_np=මෙම à¶šà·à¶´ කිරීම සඳහ෠නව à·à·à¶›à·à·€à¶šà·Š à·ƒà·à¶¯à¶±à·Šà¶±. editor.propose_file_change=ගොනු වෙනස් කිරීම යà·à¶¢à¶±à· කරන්න @@ -1189,7 +1185,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=නියමිත දිනය à¶‘à¶šà¶­à·” කරන්න @@ -1275,7 +1271,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=සංවà·à¶¯à¶º @@ -1920,8 +1916,6 @@ error.csv.too_large=එය ඉත෠විà·à·à¶½ නිස෠මෙම à¶œ error.csv.unexpected=%d පේළියේ සහ %dතීරුවේ අනපේක්ෂිත චරිතයක් අඩංගු à¶¶à·à·€à·’න් මෙම ගොනුව විදà·à·„ුම්කරණය à¶šà·… නොහà·à¶š. error.csv.invalid_field_count=මෙම ගොනුව රේඛà·à·€à·š à·€à·à¶»à¶¯à·’ à¶šà·Šà·‚à·šà¶­à·Šà¶» සංඛ්යà·à·€à¶šà·Š ඇති à¶¶à·à·€à·’න් එය විදà·à·„ුම්කරණය à¶šà·… නොහà·à¶š %d. -milestones.filter_sort.name = නම - [graphs] [org] @@ -2471,9 +2465,6 @@ notices.op=ඔප්. notices.delete_success=පද්ධති දà·à¶±à·Šà·€à·“ම් මක෠දම෠ඇත. -config_summary = à·ƒà·à¶»à·à¶‚à·à¶º -config_settings = à·ƒà·à¶šà·ƒà·”ම් - [action] create_repo=නිර්මිත ගබඩà·à·€ %s rename_repo=%[1]s සිට %[3]sදක්ව෠නම් කරන ලද ගබඩà·à·€ @@ -2565,6 +2556,4 @@ runs.commit=à¶šà·à¶´ [projects] [git.filemode] -symbolic_link=සංකේතà·à¶­à·Šà¶¸à¶š සබà·à¶³à·’ය - -[search] +symbolic_link=සංකේතà·à¶­à·Šà¶¸à¶š සබà·à¶³à·’ය \ No newline at end of file diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 885fcf0433..af528feb55 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -142,12 +142,6 @@ 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 @@ -182,7 +176,7 @@ string.desc=Z - A [error] occurred=Vyskytla sa chyba -report_message=Ak si myslíte, že ide o chybu Forgejo, vyhľadajte problémy na Codeberg-e alebo v prípade potreby otvorte nový problém. +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. 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ľ. @@ -193,6 +187,7 @@ 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 @@ -1036,7 +1031,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 %[1]s. +editor.commit_directly_to_this_branch=OdoslaÅ¥ zmeny revízie priamo do vetvy %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Å¥? @@ -1368,6 +1363,9 @@ owner.settings.cleanuprules.enabled=Povolené [secrets] [actions] + + + runners.labels=Å títky @@ -1377,6 +1375,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 7754796558..56ef337d83 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -1,23 +1,26 @@ + + + [common] language = Jezik -passcode = Vstopna koda +passcode = Pristopna 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 = Ustvari … +create_new = Ustvarite… disabled = Invalidi go_back = Pojdi nazaj licenses = Licence -sign_in = Prijava +sign_in = Prijavite se 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Å¡Äi -return_to_forgejo = Nazaj na Forgejo +explore = RaziÅ¡Äite +return_to_forgejo = Vrnitev v Forgejo write = NapiÅ¡ite webauthn_error_unknown = Zgodila se je neznana napaka. Prosimo, poskusite znova. webauthn_reload = Ponovno polnjenje @@ -38,10 +41,10 @@ page = Stran concept_system_global = Globalno forks = Vilice concept_user_organization = Organizacija -link_account = Poveži raÄun +link_account = Povezava raÄun your_profile = Profil copy_hash = Kopiraj hash -sign_out = Odjava +sign_out = Odjavite se settings = Nastavitve locked = Zaklenjeno error = Napaka @@ -76,7 +79,7 @@ active_stopwatch = Aktivno sledenje Äasu organization = Organizacija new_migrate = Nova migracija save = Shrani -sign_in_with_provider = Prijava s/z %s +sign_in_with_provider = Prijavite se z %s manage_org = Upravljanje organizacij new_repo = Nov repozitorij webauthn_error_unable_to_process = Strežnik ni mogel obdelati vaÅ¡e zahteve. @@ -84,24 +87,24 @@ register = Registracija mirror = Zrcalo access_token = Token za dostop download_logs = Prenos dnevnikov -webauthn_insert_key = Vnesite varnostni kljuÄ +webauthn_insert_key = Vstavite varnostni kljuÄ password = Geslo webauthn_error_duplicated = Varnostni kljuÄ za to zahtevo ni dovoljen. PrepriÄajte se, da kljuÄ Å¡e ni registriran. -template = Predloga +template = Å ablona 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 %s +powered_by = Poganja ga %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 = UporabniÅ¡ko ime +username = Usmerjevalno ime tracked_time_summary = Povzetek spremljanega Äasa na podlagi filtrov seznama zadev email = E-poÅ¡tni naslov captcha = CAPTCHA @@ -111,7 +114,7 @@ milestones = Mejniki ok = OK copy_branch = Kopiranje imena veje artifacts = Artefakti -signed_in_as = Prijavljeni ste kot +signed_in_as = Prijavil se je kot remove = Odstrani remove_all = Odstrani vse remove_label_str = Odstranite element "%s" @@ -240,7 +243,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 "forgejo 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 "gitea 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. @@ -309,7 +312,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. @@ -688,4 +691,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 \ No newline at end of file +runners.runner_manage_panel = Upravljanje tekaÄev diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 56c1a7e650..e091f91a68 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=УÑпоÑтави Forgejo +install_btn_confirm=УÑпоÑтави Gitea test_git_failed=Команда 'git' није уÑпела: %v [home] @@ -89,6 +89,7 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр resend_mail=Кликните овде да поново пошаљете пиÑмо [mail] + activate_account=Молимо Ð²Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð°Ñ˜Ñ‚Ðµ ваш налог activate_email=Потврдите вашу адреÑу е-поште @@ -265,7 +266,7 @@ editor.commit_changes=Изврши комит промена editor.add=Додај '%s' editor.update=Ðжурирај '%s' editor.delete=Уклони '%s' -editor.commit_directly_to_this_branch=Изврши комит директно на %[1]s грану. +editor.commit_directly_to_this_branch=Изврши комит директно на %s грану. editor.create_new_branch=Креирај нову грану за овај комит и поднеÑи захтев за Ñпајање. editor.cancel=Откажи editor.branch_already_exists=Грана '%s' већ поÑтоји за ово Ñпремиште. @@ -355,6 +356,9 @@ pulls.tab_commits=Комити pulls.merged=Спојено pulls.can_auto_merge_desc=Овај захтев за Ñпајање може бити обављен аутоматÑки. +; %[2]s
      %[3]s
      + + milestones.new=Ðова фаза milestones.open_tab=%d отворено milestones.close_tab=%d затворено @@ -724,4 +728,5 @@ remove_file=Уклони датотеку [gpg] -[units] \ No newline at end of file +[units] + diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 23544b782b..71d69f39d7 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -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, har tagits bort eller sÃ¥ har du inte behörighet att se den. +error404=Sidan du försöker nÃ¥ finns inte eller sÃ¥ har du inte behörighet att se den. @@ -130,48 +130,10 @@ 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 @@ -193,13 +155,6 @@ 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 - Ö @@ -208,7 +163,6 @@ string.asc = A - Ö 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 @@ -288,14 +242,14 @@ enable_captcha=Aktivera CAPTCHA registrering 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_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=E-postadress +admin_email=Mejladress install_btn_confirm=Installera Forgejo -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). +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). 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 @@ -306,10 +260,10 @@ 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. 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=Aktivera tidredovisning som Standard default_enable_timetracking.description=Aktivera tidsredovisning för nya utvecklingskataloger som standard. -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". +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'. 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 @@ -317,30 +271,19 @@ 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 e-postadress +uname_holder=Användarnamn eller Mejladress 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=Organisationer +my_orgs=Mina 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 @@ -353,7 +296,6 @@ 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 @@ -366,13 +308,9 @@ 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. @@ -381,18 +319,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ä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. +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. 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. För att slutföra Ã¥terställning av ditt konto, kontrollera din inkorg och gÃ¥ till den bifogade länken inom de kommande %s. +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. active_your_account=Aktivera ditt konto account_activated=Kontot har aktiverats -prohibit_login=Kontot är avstängd +prohibit_login=Inloggning otillÃ¥ten resent_limit_prompt=Du har redan begärt ett aktiveringsmejl nyligen. Vänligen vänta 3 minuter och försök igen. has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s). Om du inte har fÃ¥tt ett bekräftelsemail eller behöver ett nytt, klicka pÃ¥ knappen nedan. resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen email_not_associate=Denna e-postadress är inte knutet till nÃ¥got konto. -send_reset_mail=Skicka mejl för kontoÃ¥terställning +send_reset_mail=Skicka mail 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 @@ -426,24 +364,9 @@ 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 @@ -453,14 +376,6 @@ 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. @@ -498,8 +413,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.` @@ -535,7 +450,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 @@ -549,9 +464,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 @@ -567,13 +482,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=Organisationer +orgs=Hantera Organisationer repos=Utvecklingskataloger delete=Radera konto -twofa=TvÃ¥faktorsautentisering (TOTP) +twofa=TvÃ¥faktorsautentisering account_link=Länkade Konton organization=Organisationer @@ -594,16 +509,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 avatar efter e-postadress +lookup_avatar_by_mail=SlÃ¥ upp avatarer med hjälp utav mejladress federated_avatar_lookup=Förenad uppslagning av avatar -enable_custom_avatar=Använd anpassad avatar +enable_custom_avatar=Aktivera Egen Avatar choose_new_avatar=Välj ny avatar -update_avatar=Uppdatera avatar -delete_current_avatar=Ta bort aktuell avatar +update_avatar=Uppdatera Avatar +delete_current_avatar=Tag 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ösenord +update_password=Ändra Lösenordet old_password=Nuvarande lösenord new_password=Nytt lösenord password_incorrect=Det nuvarande lösenordet är felaktigt. @@ -611,18 +526,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 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. +manage_emails=Hantera mejladresser +manage_themes=Välj standardtema +manage_openid=Hantera OpenID-adresser +theme_desc=Detta kommer att vara ditt standardtema pÃ¥ webbplatsen. primary=Primär activated=Aktiverad requires_activation=Aktivering krävs -primary_email=Gör primär +primary_email=Sätt Som Primär activate_email=Skicka aktivering activations_pending=Väntar pÃ¥ aktivering delete_email=Ta Bort -email_deletion=Ta bort e-postadress +email_deletion=Ta Bort mejladress 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. @@ -630,26 +545,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 e-postadress -add_new_openid=Lägg till ny OpenID-URI -add_email=Lägg till e-postadress +add_new_email=Lägg till ny mejladress +add_new_openid=Lägg till ny OpenID URI +add_email=Lägg till mejladress 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 e-postadress +keep_email_private=Göm mejladress 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-nycklar som har blivit verifierade kan användas för att verifiera SSH-signerade Git-commiter. +ssh_desc=Dessa publika SSH nycklar är associerade med ditt konto. De motsvarande privata nycklarna tillÃ¥ter full Ã¥tkomst till dina utvecklingskataloger. 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 @@ -681,15 +596,15 @@ ssh_disabled=SSH är inaktiverat manage_social=Hantera länkade sociala konton unbind=Koppla frÃ¥n -manage_access_token=Ã…tkomsttokens -generate_new_token=Generera ny token +manage_access_token=Hantera Ã¥tkomst-tokens +generate_new_token=Generera Nya Tokens 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 Ã¥tkomsttoken +access_token_deletion=Ta bort Ã¥tkomst token 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. @@ -714,7 +629,7 @@ oauth2_application_create_description=OAuth2-applikationer ger tredjepartsapplik authorized_oauth2_applications=Auktoriserade OAuth2-appar revoke_key=Upphäv -revoke_oauth2_grant=Dra in Ã¥tkomst +revoke_oauth2_grant=Upphäv Ã¥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. @@ -734,27 +649,27 @@ 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=Länkade konton +manage_account_links=Hantera 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=Ta bort ditt konto +delete_account=Radera ditt konto delete_prompt=Denna Ã¥tgärd kommer ta bort ditt konto permanent. Det KAN INTE Ã¥ngras. -confirm_delete_account=Bekräfta borttagelse -delete_account_title=Ta bort användarkonto +confirm_delete_account=Bekräfta Borttagelsen +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 e-post +email_notifications.enable=Aktivera notiser via mejl email_notifications.onmention=Endast e-post vid omnämnanden -email_notifications.disable=Inaktivera notiser via e-post -email_notifications.submit=Ställ in e-postpreferenser +email_notifications.disable=Inaktivera notiser via mejl +email_notifications.submit=Ställ in e-post inställningar visibility.public=Offentlig visibility.private=Privat @@ -772,23 +687,23 @@ template_description=Utvecklingskatalogmallar lÃ¥ter användare skapa nya utveck 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=(Att ändra detta kommer att pÃ¥verka alla forkar.) +visibility_fork_helper=(Ändring av detta kommer pÃ¥verka alla forkar.) clone_helper=Hjälp med kloning? Se hjälp. -fork_repo=Forka utveckligskatalog -fork_from=Forka frÃ¥n +fork_repo=Forka Repo +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=Generera utvecklingskatalog +generate_repo=Skapa utvecklingskatalog generate_from=Generera frÃ¥n repo_desc=Beskrivning repo_lang=SprÃ¥k 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=Etiketter +issue_labels=Ärendeetiketter issue_labels_helper=Välj en uppsättning av etiketter license=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. +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_desc=Här kan du skriva en fullständig beskrivning för ditt projekt. @@ -799,8 +714,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=Synkroniserad senast +mirror_address=Klona FrÃ¥n URL +mirror_last_synced=Senaste Synkronisering watchers=Observerare stargazers=Stjärnmärkare forks=Förgreningar @@ -821,7 +736,7 @@ desc.internal=Intern desc.archived=Arkiverade template.items=Mallobjekt -template.git_content=Git-innehÃ¥ll (standardgren) +template.git_content=Git innehÃ¥ll (Default branch) template.git_hooks=Githookar template.webhooks=Webbhookar template.topics=Ämnen @@ -834,7 +749,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=Migreringsalternativ +migrate_options=Migrationsalternativ migrate_service=Migreringstjänst migrate_items=Migrationsobjekt migrate_items_wiki=Wiki @@ -844,9 +759,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 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_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.clone_local_path=eller en lokal serversökväg migrate.permission_denied=Du fÃ¥r inte importera lokala repon. migrate.failed=Migrering misslyckades: %v @@ -856,7 +771,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 @@ -870,7 +785,7 @@ watch=Bevaka unstar=Ta bort stjärnmärkning star=Stjärnmärk fork=Förgrening -download_archive=Ladda ner utvecklingskatalogen +download_archive=Ladda Ned Utvecklingskatalogen no_desc=Ingen beskrivning quick_guide=Snabbguide @@ -904,40 +819,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ödjer ej HTML5-taggen "audio". +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. stored_lfs=Sparad med Git LFS stored_annex=Sparad med Git Annex symbolic_link=Symbolisk länk -commit_graph=Commitgraf +commit_graph=Commit-Graf 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 ett snedstreck ("/"). 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 en slash ('/'). 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 '<%s>' +editor.add_tmpl=Lägg till '' editor.commit_message_desc=Lägg till en valfri utökad beskrivning… -editor.commit_directly_to_this_branch=Checka in direkt till grenen %[1]s. +editor.commit_directly_to_this_branch=Checka in direkt till grenen %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 @@ -958,7 +873,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 grenar +commits.search_all=Alla brancher commits.author=Upphovsman commits.message=Meddelande commits.date=Datum @@ -967,7 +882,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 @@ -982,7 +897,7 @@ projects.new=Nytt projekt projects.deletion=Ta bort projekt projects.deletion_success=Projektet har tagits bort. projects.edit=Redigera projekt -projects.modify=Redigera projekt +projects.modify=Uppdatera projekt projects.type.none=Ingen projects.template.desc=Projektmall projects.type.uncategorized=Okatergoriserad @@ -997,10 +912,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=Inga etiketter +issues.new.no_label=Ingen Etikett issues.new.clear_labels=Rensa etiketter issues.new.projects=Projekt issues.new.clear_projects=Rensa projekt @@ -1009,26 +924,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 milstolpe +issues.new.no_milestone=Ingen Milsten issues.new.clear_milestone=Rensa milstenar -issues.new.open_milestone=Öppna milstolpar -issues.new.closed_milestone=Stängda milstolpar +issues.new.open_milestone=Öppna Milstenar +issues.new.closed_milestone=Stängda Milstenar issues.new.assignees=Tilldelade issues.new.clear_assignees=Rensa tilldelade -issues.new.no_assignees=Inga tilldelade +issues.new.no_assignees=Ingen tilldelad 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 gren/etikett specificerad -issues.create=Skapa ärende +issues.no_ref=Ingen Branch/Tag 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` @@ -1088,20 +1003,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=Hänvisa till i nytt ärende +issues.context.reference_issue=Referens i nytt ärende issues.context.edit=Redigera issues.context.delete=Ta bort -issues.close_comment_issue=Stäng med kommentar +issues.close_comment_issue=Kommentera och stäng issues.reopen_issue=Ã…teröppna -issues.reopen_comment_issue=Öppna igen med kommentar +issues.reopen_comment_issue=Kommentera och Ã¥teröppna issues.create_comment=Kommentera issues.closed_at=`stängde ärendet %[2]s` issues.reopened_at=`Ã¥teröppnade detta ärende %[2]s` issues.commit_ref_at=`refererade till detta ärende frÃ¥n en incheckning %[2]s` issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s` issues.ref_pull_from=`refererade till denna pull-förfrÃ¥gan %[4]s %[2]s` -issues.ref_closing_from=`hänvisade till detta ärende frÃ¥n en pull-förfrÃ¥gan %[4]s som kommer att stänga det %[2]s` -issues.ref_reopening_from=`hänvisade till detta ärende frÃ¥n en pull-förfrÃ¥gan %[4]s som kommer att öppna ärendet pÃ¥ nytt %[2]s` +issues.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_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` @@ -1140,11 +1055,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 medarbetare %s +issues.lock_no_reason=lÃ¥st och begränsat konversation till kollaboratörer %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 pÃ¥ detta ärende. +issues.lock.notice_1=- Andra användare kan inte kommentera 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. @@ -1170,7 +1085,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'. @@ -1187,7 +1102,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 @@ -1217,10 +1132,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=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.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.remove_review_request_self=vägrade att granska %s issues.review.pending=Väntande issues.review.review=Granska @@ -1236,21 +1151,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-förfrÃ¥gan +pulls.new=Ny Pull-FörfrÃ¥gan +pulls.compare_changes=Ny Pull-Request 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 pull-förfrÃ¥gan -pulls.title_desc_few=vill sammanfoga %[1]d incheckningar frÃ¥n s[2]s in i %[3]s +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.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 @@ -1287,12 +1202,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 "åååå-mm-dd". +milestones.invalid_due_date_format=Förfallodatumsformatet mÃ¥ste vara 'yyyy-MM-dd'. milestones.edit=Redigera milstolpe milestones.edit_subheader=Milstolpar organiserar ärenden och följer utvecklingens fortskridande. milestones.cancel=Avbryt @@ -1320,7 +1235,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. @@ -1337,39 +1252,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-förfrÃ¥gan -activity.active_prs_count_n=%d aktiva pull-förfrÃ¥gningar +activity.active_prs_count_1=%d Aktiv Pull begäran +activity.active_prs_count_n=%d Aktiva Pull begärelser 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-förfrÃ¥gan -activity.opened_prs_count_n=Föreslagna 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.title.user_1=%d användare activity.title.user_n=%d användare -activity.title.prs_1=%d pull-förfrÃ¥gningar -activity.title.prs_n=%d pull-förfrÃ¥gningar +activity.title.prs_1=%d Pull-begäran +activity.title.prs_n=%d Pull begärelser 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 utgÃ¥va -activity.title.releases_n=%d utgÃ¥vor +activity.title.releases_1=%d release +activity.title.releases_n=%d releaser activity.title.releases_published_by=%s publicerad av %s -activity.published_release_label=UtgÃ¥va +activity.published_release_label=Publicerad 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 @@ -1409,34 +1324,34 @@ settings.mirror_settings=Inställningar för spegling settings.sync_mirror=Synkronisera nu settings.site=Webbplats -settings.update_settings=Spara inställningar -settings.advanced_settings=Avancerade Inställningar +settings.update_settings=Uppdatera inställningar +settings.advanced_settings=Advancerade 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=URL till extern wiki +settings.use_internal_wiki=Använd inbyggd Wiki +settings.use_external_wiki=Använd extern Wiki +settings.external_wiki_url=Extern Wiki-URL 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 externt ärendehanteringssystem +settings.external_tracker_url=URL För Extern Ärendehanterare 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 externt ärendehanteringssystem +settings.tracker_url_format=URL-Format För Extern Ärendehanterare settings.tracker_url_format_error=URL-formatet för den extern ärendehanterare är inte en giltig URL. -settings.tracker_issue_style=Externt ärendenummerformat +settings.tracker_issue_style=Externt ärendenummersformat 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 tid -settings.pulls_desc=Aktivera pull-förfrÃ¥gningar för utvecklingskatalog +settings.allow_only_contributors_to_track_time=LÃ¥t endast medarbetare spÃ¥ra tidsredovisning +settings.pulls_desc=Aktivera Pull Requests 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=Farozon +settings.danger_zone=HögrisksomrÃ¥de 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. @@ -1450,15 +1365,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 wikidata +settings.wiki_delete=Ta bort wiki-data 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 wikidata +settings.confirm_wiki_delete=Ta bort wiki-data settings.wiki_deletion_success=Utvecklingskatalogens wiki-data har blivit borttaget. -settings.delete=Ta bort denna utvecklingskatalog +settings.delete=Ta Bort Detta Repo 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. @@ -1481,12 +1396,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 webbhook +settings.webhook_deletion=Ta bort Webhook 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 @@ -1497,19 +1412,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-händelser -settings.event_send_everything=Alla händelser -settings.event_choose=Anpassade händelser… +settings.event_push_only=Push Events +settings.event_send_everything=Alla events +settings.event_choose=Anpassade events… settings.event_header_repository=Händelser i utvecklingskatalogen settings.event_create=Skapa settings.event_create_desc=Branch eller tagg skapad. @@ -1549,19 +1464,19 @@ 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 driftsättningsnyckel +settings.deploy_key_deletion=Ta bort distributionsnyckel 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=Grenskydd +settings.protected_branch=Branchskydd settings.protected_branch_can_push=TillÃ¥t push? settings.protected_branch_can_push_yes=Du kan pusha settings.protected_branch_can_push_no=Du kan inte pusha -settings.branch_protection=Skyddsregler för gren "%s" +settings.branch_protection=Branchskydd för '%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 @@ -1578,33 +1493,33 @@ settings.protect_check_status_contexts_list=Statuskontroller funna under senaste 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=Kräv signerade commits settings.require_signed_commits_desc=Avvisa pushar till den här grenen om dom är osignerade eller inte verifierbara. settings.add_protected_branch=Aktivera skydd settings.delete_protected_branch=Inaktivera skydd -settings.protected_branch_deletion=Inaktivera grenskydd +settings.protected_branch_deletion=Inaktivera skydd för branch 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=Bottoken +settings.bot_token=Bot Token settings.chat_id=Chatt-ID settings.matrix.room_id=Rum-ID settings.matrix.message_type=Typ av meddelande -settings.archive.button=Arkivera utvecklingskatalog -settings.archive.header=Arkivera denna utvecklingskatalog +settings.archive.button=Arkivera förrÃ¥d +settings.archive.header=Arkivera detta förrÃ¥d 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 för arkiverade utvecklingskataloger. +settings.archive.branchsettings_unavailable=Inställningar för grenar är inte tillgängliga om förrÃ¥det arkiverats. 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 @@ -1613,18 +1528,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=Blobhash +settings.lfs_pointers.sha=Blob SHA 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 källkod +diff.browse_source=Bläddra i källkod diff.parent=förälder diff.commit=incheckning diff.git-notes=Anteckningar -diff.data_not_available=Diff-innehÃ¥ll ej tillgänglig -diff.show_split_view=Delad vy -diff.show_unified_view=Unifierad vy +diff.data_not_available=Diff Content 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 @@ -1640,12 +1555,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=Stilisering med Markdown stöds. +diff.comment.markdown_info=Styling 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=Slutför granskning +diff.review=Granska diff.review.placeholder=Granskningskommentar diff.review.comment=Kommentar diff.review.approve=Godkänn @@ -1654,12 +1569,12 @@ diff.committed_by=committad av releases.desc=Följ projektversioner och nerladdningar. release.releases=Släpp -release.new_release=Ny utgÃ¥va +release.new_release=Nytt Släpp release.draft=Utkast -release.prerelease=FörutgÃ¥va +release.prerelease=Försläpp 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 @@ -1668,23 +1583,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 förutgÃ¥va +release.prerelease_desc=Markera som en Pre-Release release.prerelease_helper=Markera denna Release olämpliga för användning i produktion. release.cancel=Avbryt -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.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.deletion_success=Releasen har blivit raderad. release.tag_name_already_exist=En release med denna tagg existerar redan. release.tag_name_invalid=Taggnamnet är inte giltigt. release.downloads=Nedladdningar release.download_count=Nedladdningar: %s -branch.name=Grennamn +branch.name=Branch namn branch.delete_head=Radera -branch.delete_html=Ta borg gren +branch.delete_html=Radera branch branch.create_branch=Skapa branchen %s branch.deleted_by=Raderad av %s @@ -1701,7 +1616,7 @@ settings.enter_repo_name = Ange ägar- och utvecklingskatalog-namnet exakt som d [org] org_name_holder=Organisationsnamn -org_full_name_holder=Fullständigt organisationsnamn +org_full_name_holder=Organisationens Fullständiga Namn org_name_helper=Organisationsnamn bör vara korta och enkla att komma ihÃ¥g. create_org=Skapa organisation repo_updated=Uppdaterad %s @@ -1709,10 +1624,10 @@ members=Medlemmar teams=Grupper lower_members=medlemmar lower_repositories=utvecklingskataloger -create_new_team=Nytt lag -create_team=Skapa lag +create_new_team=Nytt Team +create_team=Skapa Team org_desc=Beskrivning -team_name=Lagnamn +team_name=Gruppnamn 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. @@ -1739,7 +1654,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=Ta bort denna organisationen +settings.delete_account=Tag bort denna organisation 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 @@ -1750,9 +1665,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 @@ -1773,18 +1688,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=Lagmedlemmar +teams.members=Teammedlemmar teams.update_settings=Uppdatera inställningar -teams.delete_team=Ta bort lag -teams.add_team_member=Lägg till lagmedlem -teams.delete_team_title=Ta bort lag +teams.delete_team=Ta bort team +teams.add_team_member=Lägg till teammedlem +teams.delete_team_title=Ta bort team teams.delete_team_desc=Borttagning av ett team Ã¥terkallar Ã¥tkomsten till utvecklingskatalogen för dess medlemmar. Vill du fortsätta? teams.delete_team_success=Teamet har blivit borttaget. teams.read_permission_desc=Medlemskap i detta team ger läsrättigheter: medlemmar kan se och klona teamets utvecklingskataloger. teams.write_permission_desc=Medlemskap i detta team ger skrivrättigheter: medlemmar kan läsa och pusha till teamets utvecklingskataloger. -teams.admin_permission_desc=Medlemskap i detta lag ger administratörsrättigheter: medlemmar kan läsa frÃ¥n, pusha till och lägga till medarbetare till lagets utvecklingskataloger. +teams.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.create_repo_permission_desc=Vidare sÃ¥ ger detta team Skapa utvecklingskatalog rättigheten: medlemmar can skapa nya utvecklingskataloger i organisationen. -teams.repositories=Lagets utvecklingskataloger +teams.repositories=TeamförrÃ¥d 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. @@ -1803,10 +1718,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 autentiseringskälla +auths.edit=Redigera autensieringskälla auths.activated=Denna autentiseringskälla är aktiverad auths.update_success=Autentiseringskällan har uppdaterats. -auths.update=Uppdatera autentiseringskälla +auths.update=Uppdatera autensieringskälla auths.delete=Ta bort autentiseringskälla -auths.delete_auth_title=Tag bort autentiseringskälla +auths.delete_auth_title=Tag bort denna autentisering 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=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.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.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=Skripttyp -config.reverse_auth_user=Autentiseringsanvändare för omvänd proxy +config.script_type=Script-typ +config.reverse_auth_user=Motsatt autentiserings användare 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 @@ -2031,48 +1946,48 @@ config.db_ssl_mode=SSL config.db_path=Sökväg config.service_config=Tjänstkonfiguration -config.register_email_confirm=Kräv e-postbekräftelse för att registrera +config.register_email_confirm=Kräv mejlbekrä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 innehÃ¥ll -config.mail_notify=Aktivera e-postnotiser +config.require_sign_in_view=Kräv inloggning för att visa sidor +config.mail_notify=Aktivera Mejlnotifikationer config.enable_captcha=Aktivera CAPTCHA -config.active_code_lives=Livstid för aktiveringskoder -config.default_keep_email_private=Dölj e-postadresser som standard +config.active_code_lives=Aktivera livstid för koder +config.default_keep_email_private=Dölj mejladresser 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 bidragsgivare spÃ¥ra tid -config.no_reply_address=Dold e-postdomän +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.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=Sökväg för sendmail +config.mailer_sendmail_path=Sendmail sökväg config.mailer_sendmail_args=Extra argument till sendmail -config.send_test_mail=Skicka testmejl +config.send_test_mail=Skicka testmeddelande config.oauth_config=OAuth-konfiguration config.oauth_enabled=Aktiverad -config.cache_config=Cachekonfiguration -config.cache_adapter=Cacheadapter -config.cache_interval=Cacheintervall -config.cache_conn=Cacheanslutning +config.cache_config=Mellanlagringskonfiguration +config.cache_adapter=Mellanlagringsadapter +config.cache_interval=Mellanlagringsintervall +config.cache_conn=Mellanlagringsanslutning config.session_config=Sessionskonfiguration config.session_provider=Sessionsleverantör config.provider_config=Leverantörskonfiguration -config.cookie_name=Cookienamn +config.cookie_name=Cookie-namn config.gc_interval_time=Tidsintervall för skräpsamling config.session_life_time=Livstid för session config.https_only=Endast HTTPS @@ -2081,21 +1996,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 federerade avatarer +config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder config.git_config=Git-konfiguration -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_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_gc_args=Skräpsamlarargument config.git_migrate_timeout=Migreringstimeout -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.git_mirror_timeout=Spelgingsuppdateringstimeout +config.git_clone_timeout=Klonoperationstimeout +config.git_pull_timeout=Klonoperationstimeout +config.git_gc_timeout=GC-operationstimeout -config.log_config=Loggkonfiguration +config.log_config=Logg-konfiguration config.disabled_logger=Inaktiverad config.xorm_log_sql=Logga SQL @@ -2122,26 +2037,18 @@ monitor.queue.settings.submit=Uppdatera inställningar monitor.queue.settings.changed=Inställningar uppdaterade notices.system_notice_list=Systemnotiser -notices.view_detail_header=Notisdetaljer -notices.select_all=Markera alla +notices.view_detail_header=Visa 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] @@ -2154,10 +2061,6 @@ 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 @@ -2221,6 +2124,9 @@ owner.settings.cleanuprules.enabled=Aktiv [secrets] [actions] + + + runners.name=Namn runners.owner_type=Typ runners.description=Beskrivning @@ -2237,6 +2143,7 @@ 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 @@ -2244,32 +2151,4 @@ 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 +exact_tooltip = Inkludera bara resultat som exakt matchar söktermen \ No newline at end of file diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index fc13786cdd..5df817eb27 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 Takipçisi +active_stopwatch=Etkin Zaman Takibi 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ıma +new_mirror=Yeni Yansı 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 istekleri +pull_requests=DeÄŸiÅŸiklik İstekleri 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 ,kaldırılmış veya görüntüleme yetkiniz yok. +error404=UlaÅŸmaya çalıştığınız sayfa mevcut deÄŸil veya görüntüleme yetkiniz yok. go_back=Geri Git never=Asla unknown=Bilinmiyor -rss_feed=RSS yayını +rss_feed=RSS Beslemesi 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 = Panoya kopyala +copy_generic = Kopyala filter = Filtrele filter.not_archived = ArÅŸivlenmemiÅŸ filter.clear = Filtreleri Temizle filter.is_archived = ArÅŸivlenmiÅŸ -filter.is_mirror = Yansılar -filter.is_fork = Çatallar -filter.not_fork = Çatallanmayanlar +filter.is_mirror = YansılaÅŸtırılmış +filter.is_fork = Çatallanmış +filter.not_fork = Çatallanmamış filter.not_mirror = Yansılanmamış filter.is_template = Åžablon -filter.not_template = Åžablon olmayan +filter.not_template = Åžablon deÄŸil filter.public = Herkese açık filter.private = Gizli more_items = Daha fazla öğe @@ -165,14 +165,11 @@ 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=Bu yazılım hakkında +footer.software=Yazılım Hakkında footer.links=BaÄŸlantılar [heatmap] @@ -198,12 +195,6 @@ 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 @@ -223,6 +214,7 @@ 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 @@ -233,12 +225,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ı tipi +db_title=Veritabanı Ayarları +db_type=Veritabanı Türü 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 @@ -257,16 +249,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 dizini +repo_path=Depo Kök Yolu repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir. -lfs_path=Git LFS kök dizini +lfs_path=Git LFS Kök Yolu 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. @@ -278,15 +270,15 @@ 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. @@ -306,11 +298,11 @@ enable_captcha.description=Kullanıcının kendi kendine kaydolması için captc 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ıt olan kullanıcı kendiliÄŸinden yönetici olacaktır. -admin_title=Yönetici hesabı ayarları -admin_name=Yönetici kullanıcı adı +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. @@ -325,7 +317,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=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_keep_email_private.description=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 @@ -335,7 +327,7 @@ 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 @@ -344,10 +336,8 @@ app_slogan_helper = OluÅŸum sloganınızı giriniz. Devre dışı bırakmak içi 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 @@ -400,13 +390,13 @@ 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 cihazı hatırla +remember_me=Bu Aygıtı 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? @@ -425,7 +415,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. @@ -439,9 +429,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 @@ -477,7 +467,6 @@ 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 @@ -555,7 +544,6 @@ account_security_caution.text_1 = EÄŸer bu sizseniz bu e-postayı görmezden gel 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 @@ -663,13 +651,8 @@ 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ı @@ -708,9 +691,6 @@ 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 @@ -928,7 +908,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: @@ -1203,7 +1183,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 sunucularından veri aktar. +migrate.gitea.description=Gitea.com veya diÄŸer Gitea/Forgejo 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. @@ -1330,8 +1310,7 @@ 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='<%s>' eklendi -editor.add_tmpl.filename = dosyaadi +editor.add_tmpl='' eklendi editor.add=%s Ekle editor.update=%s Güncelle editor.delete=%s Sil @@ -1341,7 +1320,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 %[1]s bölümüne uygula. +editor.commit_directly_to_this_branch=DoÄŸrudan %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 @@ -1707,7 +1686,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 @@ -1822,7 +1801,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 @@ -1915,7 +1894,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 Forgejo güncelleyin. +pulls.cmd_instruction_merge_desc=DeÄŸiÅŸiklikleri birleÅŸtirin ve Gitea'da 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. @@ -2433,9 +2412,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 %[2]s 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 %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. @@ -2701,37 +2680,7 @@ 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ı @@ -3065,12 +3014,12 @@ packages.size=Boyut packages.published=Yayınlandı defaulthooks=Varsayılan Web İstemcileri -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.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.add_webhook=Varsayılan Web İstemcisi Ekle defaulthooks.update_webhook=Varsayılan Web İstemcisini Güncelle systemhooks=Sistem Web İstemcileri -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.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.add_webhook=Sistem Web İstemcisi Ekle systemhooks.update_webhook=Sistem Web İstemcisi Güncelle @@ -3385,23 +3334,6 @@ 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 @@ -3642,9 +3574,6 @@ 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. @@ -3736,7 +3665,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? @@ -3752,18 +3681,14 @@ 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 @@ -3774,13 +3699,13 @@ submodule=Alt modül [search] project_kind = Projeleri ara... -org_kind = Organizasyonları ara… -team_kind = Takımları ara… -search = Ara… -code_kind = Kod ara… +org_kind = Organizasyonları ara... +team_kind = Takımları ara... +search = Ara... +code_kind = Kodları ara... type_tooltip = Arama türü repo_kind = Depoları ara... -user_kind = Kullanıcıları ara… +user_kind = Kullanıcıları ara... milestone_kind = Kilometre taÅŸlarını ara... branch_kind = Dalları ara... package_kind = Paketleri ara... @@ -3791,9 +3716,4 @@ code_search_unavailable = Kod araması ÅŸu anda kullanıma açık deÄŸildir. Lü 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 +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. \ No newline at end of file diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index bb80e54914..552360285f 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -23,7 +23,7 @@ toc=ЗміÑÑ‚ licenses=Ліцензії return_to_forgejo=ПовернутиÑÑ Ð´Ð¾ Forgejo -username=Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувач_ки +username=Ім'Ñ ÐºÑ€Ð¸Ñтувача email=ÐдреÑа електронної пошти password=Пароль access_token=Токен доÑтупу @@ -86,7 +86,7 @@ preview=Попередній переглÑд loading=ЗавантаженнÑ… error=Помилка -error404=Сторінка, до Ñкої ви намагаєтеÑÑ Ð·Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ÑÑ, не Ñ–Ñнує, Ñ—Ñ— було видалено або ви не маєте права на Ñ—Ñ— переглÑд. +error404=Сторінка, до Ñкої ви намагаєтеÑÑ Ð·Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ÑÑ Ð°Ð±Ð¾ до , не Ñ–Ñнує або Ви не маєте права на Ñ—Ñ— переглÑд. never=Ðіколи @@ -143,13 +143,13 @@ filter.clear = ОчиÑтити фільтри filter.is_archived = Ðрхівовано filter = Фільтри toggle_menu = Перемкнути видиміÑть меню -confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт «%s»? +confirm_delete_artifact = Ви впевнені, що хочете видалити артефакт "%s"? artifacts = Ðртефакти filter.not_archived = Ðе архівовано filter.public = ЗагальнодоÑтупні filter.private = Приватні more_items = Більше пунктів -remove_label_str = Видалити об'єкт «%s» +remove_label_str = Видалити об'єкт "%s" new_repo.title = Ðовий репозиторій new_migrate.title = Ðова Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ new_org.title = Ðова Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ @@ -164,9 +164,8 @@ filter.not_fork = Ðе форки filter.is_mirror = Дзеркала filter.not_mirror = Ðе дзеркала filter.not_template = Ðе шаблони -error413 = Ви вичерпали Ñвою квоту. +error413 = Ви вичерпали Ñвою чаÑтку. invalid_data = ÐедійÑні дані: %v -copy_path = Копіювати шлÑÑ… [aria] footer.software = Про заÑтоÑунок @@ -200,16 +199,6 @@ 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 = Ð - Я @@ -231,7 +220,7 @@ platform_desc=Forgejo підтверджено працює на вільних lightweight=ÐевибагливіÑть lightweight_desc=Forgejo має низькі вимоги до реÑурÑів та може працювати на недорогому Raspberry Pi. Заощадьте енергію Ñвого комп'ютера! license=Відкритий вихідний код -license_desc=Відвідайте Forgejo! ПриєднуйтеÑÑ Ð´Ð¾ Ð½Ð°Ñ Ñ– зробіть Ñвій внеÑок, щоб покращити проєкт ще більше. Ðе бійтеÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ÑÑ! +license_desc=Відвідайте Forgejo! ПриєднайтеÑÑŒ до Ð½Ð°Ñ Ñ‚Ð° зробіть Ñвій внеÑок до проєкту, щоб зробити його ще краще. Ðе бійтеÑÑ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ÑÑ! install_desc = ПроÑто запуÑтіть уже зібрану програму Ð´Ð»Ñ Ñвоєї платформи, розгорніть Ñ—Ñ— за допомогою Docker або вÑтановіть пакунок. [install] @@ -299,7 +288,7 @@ 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. @@ -338,7 +327,7 @@ password_algorithm=Ðлгоритм Ñ…ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ config_location_hint = Ці опції налаштувань будуть збережені в: env_config_keys = ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñередовища env_config_keys_prompt = Ці змінні Ñередовища будуть також заÑтоÑовані до вашого файлу конфігурації: -invalid_db_table = База даних «%s» недійÑна: %v +invalid_db_table = База даних "%s" недійÑна: %v enable_update_checker = Увімкнути перевірку оновлень require_db_desc = Forgejo вимагає MySQL, PostgreSQL, SQLite3 чи TiDB (протокол MySQL). allow_only_external_registration = Дозволити реєÑтрацію тільки через зовнішні ÑервіÑи @@ -407,21 +396,21 @@ social_register_helper_msg=Вже Ñ” аккаунт? Зв'Ñжіть його з disable_register_prompt=Вибачте, можливіÑть реєÑтрації відключена. Будь лаÑка, зв'ÑжітьÑÑ Ð· адмініÑтратором Ñайту. disable_register_mail=ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÑ”Ñтрації електронною поштою вимкнено. remember_me=Запам'Ñтати цей приÑтрій -forgot_password_title=Забули пароль +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=Відновити обліковий Ð·Ð°Ð¿Ð¸Ñ @@ -436,8 +425,8 @@ twofa_scratch_token_incorrect=Ðевірний одноразовий парол login_userpass=Увійти tab_openid=OpenID oauth_signup_tab=ЗареєÑтрувати обліковий Ð·Ð°Ð¿Ð¸Ñ -oauth_signup_title=Завершити реєÑтрацію -oauth_signup_submit=Завершити +oauth_signup_title=Повний новий обліковий Ð·Ð°Ð¿Ð¸Ñ +oauth_signup_submit=Повний обліковий Ð·Ð°Ð¿Ð¸Ñ oauth_signin_tab=ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñ–Ñнуючий обліковий Ð·Ð°Ð¿Ð¸Ñ oauth_signin_title=Увійдіть, щоб авторизувати пов'Ñзаний обліковий Ð·Ð°Ð¿Ð¸Ñ oauth_signin_submit=Прив'Ñзати обліковий Ð·Ð°Ð¿Ð¸Ñ @@ -452,19 +441,19 @@ 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 = Якщо під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації ви вказали неправильну електронну адреÑу, ви можете змінити Ñ—Ñ— нижче. ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ надіÑлано на нову адреÑу. +change_unconfirmed_email = Якщо ви вказали неправильну електронну адреÑу впродовж реєÑтрації, ви можете змінити Ñ—Ñ— нижче. ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ надіÑлано на нову адреÑу. last_admin = Ви не можете видалити оÑтаннього адмініÑтратора. Має бути хоча б один адмініÑтратор. oauth.signin.error.access_denied = Запит на авторизацію було відхилено. change_unconfirmed_email_error = Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ електронну адреÑу: %v manual_activation_only = Зв'ÑжітьÑÑ Ð· адмініÑтратором Ñайту, аби завершити активацію. -prohibit_login_desc = Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ відізвано від взаємодії з екземплÑром. ЗвʼÑжітьÑÑ Ð· адмініÑтратором екземплÑра, щоб отримати доÑтуп знову. +prohibit_login_desc = Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ відізвано від взаємодії з екземплÑром. ЗвʼÑжітьÑÑ Ð· адмініÑтратором екземплÑру, щоб отримати доÑтуп знову. invalid_code_forgot_password = Ваш код Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ñ–Ð¹Ñний. ÐатиÑніть тут, аби почати нову ÑеÑÑ–ÑŽ. reset_password_wrong_user = Ви ввійшли Ñк %s, але поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ передбачене Ð´Ð»Ñ %s back_to_sign_in = Ðазад до входу @@ -475,11 +464,6 @@ 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 @@ -498,7 +482,7 @@ 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_3=Якщо цей обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ Ñтворено Ð´Ð»Ñ Ð²Ð°Ñ, будь лаÑка, Ñпочатку вÑтановіть Ñвій пароль. reset_password=Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ облікового запиÑу reset_password.title=%s, ви відправили запит на Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу @@ -548,28 +532,20 @@ 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 = Ðе налаштовано жодного заÑобу двофакторної автентифікації. Це означає, що ви можете входити у Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÐµÐ· необхідноÑті викориÑтовувати двофакторну автентифікацію. +removed_security_key.subject = Ключ безпеки видалено +removed_security_key.text_1 = Ключ безпеки «%[1]s» було щойно видалено з вашого облікового запиÑу. +team_invite.subject = %[1]s запрошує Ð’Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ організації %[2]s +team_invite.text_1 = %[1]s запрошує Ð’Ð°Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ð´Ð¾ команди %[2]s в організації %[3]s. +team_invite.text_2 = Щоб приєднатиÑÑ Ð´Ð¾ команди, будь лаÑка, перейдіть за поÑиланнÑм: +team_invite.text_3 = Примітка: Це Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ðµ Ð´Ð»Ñ %[1]s. Якщо Ви не очікували цього запрошеннÑ, можете проігнорувати цей лиÑÑ‚. + [modal] yes=Так no=ÐÑ– cancel=Відмінити modify=ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ -confirm = Підтвердити [form] UserName=Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача @@ -649,33 +625,13 @@ 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»), Ð´ÐµÑ„Ñ–Ñ («-»), підкреÑÐ»ÐµÐ½Ð½Ñ («_») та крапки («.»). Ðе може починатиÑÑ Ð°Ð±Ð¾ закінчуватиÑÑ Ð½ÐµÐ»Ñ–Ñ‚ÐµÑ€Ð½Ð¸Ð¼Ð¸ Ñимволами; нелітерні Ñимволи підрÑд також заборонені.` + + +FullName = Повне ім'Ñ 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=Змінити Ñвій аватар… @@ -695,31 +651,24 @@ 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 = Цю дію видно вÑім, але адмініÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ (зокрема й ви) може бачити ще й взаємодії в приватних проÑторах. - +followers_one = %d cтежить +following_one = %d відÑтежуваний +block_user = Заблокувати кориÑтувача +block_user.detail = Зверніть увагу, що Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача має такі наÑлідки: +block_user.detail_1 = Ви припините Ñтежити один за одним Ñ– не зможете підпиÑатиÑÑ Ð¾Ð´Ð¸Ð½ на одного. +block_user.detail_2 = Цей кориÑтувач не зможе взаємодіÑти з репозиторіÑми, влаÑником Ñких Ñ” ви, а також із задачами та коментарÑми, Ñкі ви Ñтворили. +block_user.detail_3 = Ви не зможете додати один одного в ÑкоÑті Ñпівавтора репозиторію. +follow_blocked_user = Ви не можете Ñтежити за цим кориÑтувачем, тому що ви його заблокували або він заблокував ваÑ. +code = Код +block = Заблокувати +unblock = Розблокувати +show_on_map = Показати це міÑце на мапі [settings] profile=Профіль @@ -776,14 +725,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=Ð¦Ñ Ñ‚ÐµÐ¼Ð° буде типовою Ð´Ð»Ñ Ð²ÐµÐ±-інтерфейÑу, коли ви ввійдете в ÑиÑтему. +theme_desc=Ð¦Ñ Ñ‚ÐµÐ¼Ð° буде типовою Ð´Ð»Ñ Ð²Ñього Ñайту. primary=ОÑновний activated=Ðктивовано requires_activation=Потрібна Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ @@ -809,9 +758,9 @@ 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 повʼÑзані з вашим обліковим запиÑом. Відповідні приватні ключі дозволÑють отримати повний доÑтуп до ваших репозиторіїв. Підтверджені ключі можна викориÑтати Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð² Git, підпиÑані з SSH. principal_desc=Ці наÑтройки SSH Ñертифікатів вказані у вашому обліковому запиÑÑ– та надають повний доÑтуп до ваших репозиторіїв. @@ -822,7 +771,7 @@ add_new_key=Додати SSH ключ add_new_gpg_key=Додати GPG ключ key_content_ssh_placeholder=ПочинаєтьÑÑ Ð· «ssh-ed25519», «ssh-rsa», «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «sk-ecdsa-sha2-nistp256@openssh.com» або «sk-ssh-ed25519@openssh.com» key_content_gpg_placeholder=ПочинаєтьÑÑ Ð· «-----BEGIN PGP PUBLIC KEY BLOCK-----» -add_new_principal=Додати принципал +add_new_principal=Додати кориÑтувача ssh_key_been_used=Цей SSH ключ вже був додано до Ñервера. ssh_key_name_used=Ключ SSH з таким ім'Ñм вже Ñ–Ñнує у вашому обліковому запиÑÑ–. ssh_principal_been_used=Цей кориÑтувач вже був доданий на Ñервер. @@ -878,7 +827,7 @@ unbind=Від'єднати manage_access_token=Токени доÑтупу generate_new_token=Згенерувати новий токен tokens_desc=Ці токени надають доÑтуп до вашого облікового запиÑу за допомогою Forgejo API. -token_name=Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° +token_name=Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ generate_token=Згенерувати токен generate_token_success=Ваш новий токен був Ñтворений. Скопіюйте його зараз, оÑкільки він не буде показаний знову. generate_token_name_duplicate=Ðазва програми %s вже викориÑтовуєтьÑÑ. Будь лаÑка, викориÑтайте нову. @@ -895,7 +844,7 @@ oauth2_applications_desc=Програми OAuth2 дають можливіÑть remove_oauth2_application=Видалити програму OAuth2 remove_oauth2_application_desc=Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ OAuth2 ÑкаÑовує доÑтуп до вÑÑ–Ñ… підпиÑаних маркерів доÑтупу. Продовжити? remove_oauth2_application_success=Програму видалено. -create_oauth2_application=Створити новий додаток OAuth2 +create_oauth2_application=Створити нову програму OAuth2 create_oauth2_application_button=Створити програму oauth2_application_name=Ðазва програми save_application=Зберегти @@ -913,9 +862,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=Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації зробить ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¼ÐµÐ½Ñˆ безпечним. Продовжити? @@ -959,124 +908,47 @@ visibility.private=Приватний saved_successfully = ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑпішно збережено. comment_type_group_time_tracking = Облік чаÑу location_placeholder = ПоділітьÑÑ Ð· іншими, де приблизно ви знаходитеÑÑŒ -biography_placeholder = Розкажіть трохи про Ñебе! (ПідтримуєтьÑÑ Markdown) +biography_placeholder = Розкажіть трохи про Ñебе! (Можете викориÑтати Markdown) hidden_comment_types = Приховані типи коментарів keep_activity_private = Приховати активніÑть зі Ñторінки профілю blocked_users = Заблоковані кориÑтувачі blocked_users_none = Ðемає заблокованих кориÑтувачів. -profile_desc = Про Ñебе +profile_desc = Керуйте тим, Ñк ваш профіль відображаєтьÑÑ Ñ–Ð½ÑˆÐ¸Ð¼ кориÑтувачам. Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ñповіщень, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‚Ð° операцій з Git через веб-інтерфейÑ. retype_new_password = Підтвердіть новий пароль email_desc = Ваша оÑновна адреÑа електронної пошти буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ñповіщень, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ–, за умови, що вона не прихована, Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ з Git через веб-інтерфейÑ. visibility.limited_tooltip = Видимий(а) тільки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… кориÑтувачів visibility.private_tooltip = Видимий(а) тільки Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників організацій, до Ñких ви приєдналиÑÑ -twofa_scratch_token_regenerated = Ваш одноразовий ключ відновленнÑ: %s. Збережіть його у безпечному міÑці, бо він не буде показаний знову. +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. +webauthn_desc = Ключі безпеки це апаратні приÑтрої, що міÑÑ‚Ñть криптографічні ключі. Вони можуть викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ð´Ð²Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾Ñ— автентифікації. Ключі безпеки мають підтримувати Ñтандарт WebAuthn Authenticator. revoke_oauth2_grant_success = ДоÑтуп відкликано уÑпішно. -twofa_recovery_tip = Якщо ви втратите ваш приÑтрій, ви зможете викориÑтати одноразовий ключ відновленнÑ, щоб знову отримати доÑтуп до Ñвого облікового запиÑу. +twofa_recovery_tip = Якщо ви втратите ваш приÑтрій, ви зможете викориÑтати одноразовий код відновленнÑ, щоб знову отримати доÑтуп до Ñвого облікового запиÑу. webauthn_delete_key_desc = Якщо ви видалите ключ безпеки, ви більше не зможете з ним зайти. Продовжити? change_password = Зміна Ð¿Ð°Ñ€Ð¾Ð»Ñ -email_notifications.andyourown = І ваші влаÑні ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ -visibility.public_tooltip = Видимий(а) Ð´Ð»Ñ Ð²ÑÑ–Ñ… -update_language_not_found = Мова «%s» недоÑтупна. + pronouns = Займенники pronouns_unspecified = Ðе вказані -hints = Підказки +update_language_not_found = Мова «%s» недоÑтупна. language.title = Мова за замовчуваннÑм -update_hints = Оновити підказки -update_hints_success = Підказки оновлено. -additional_repo_units_hint = Пропонувати увімкнути додаткові розділи репозиторію -additional_repo_units_hint_description = Показувати підказку «Увімкнути ще» Ð´Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð², у Ñких увімкнено не вÑÑ– доÑтупні розділи. language.description = Цю мову буде збережено у вашому обліковому запиÑÑ–, вона викориÑтовуватиметьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк ви ввійдете в ÑиÑтему. language.localization_project = Допоможіть нам переклаÑти Forgejo вашою мовою! ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ. -permissions_list = Дозволи: +hints = Підказки +additional_repo_units_hint = Пропонувати увімкнути додаткові розділи репозиторію +additional_repo_units_hint_description = Показувати підказку «Увімкнути ще» Ð´Ð»Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð², у Ñких увімкнено не вÑÑ– доÑтупні розділи. +update_hints = Оновити підказки +update_hints_success = Підказки оновлено. 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] @@ -3381,7 +3080,7 @@ error.generate_hash=Ðе вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ хеш коміт error.no_committer_account=Ðккаунт кориÑтувача з таким Email не знайдено error.no_gpg_keys_found=Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ GPG-ключ, що відповідає даному підпиÑу error.not_signed_commit=ÐепідпиÑаний коміт -error.failed_retrieval_gpg_keys=Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ключ, пов'Ñзаний з обліковим запиÑом комітера +error.failed_retrieval_gpg_keys=Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ відповідний GPG-ключ кориÑтувача error.probable_bad_signature=УВÐГÐ! Хоча ключ із таким ID Ñ– Ñ” в базі, коміт неможливо ним перевірити! Цей коміт ПІДОЗРІЛИЙ. error.probable_bad_default_signature=УВÐГÐ! Хоча типовий ключ має цей ID, коміт неможливо ним перевірити! Цей коміт ПІДОЗРІЛИЙ. @@ -3407,30 +3106,30 @@ arch.version.conflicts = Суперечки arch.version.replaces = Заміни arch.version.provides = Ðадає arch.version.groups = Група -conda.install = Ðби вÑтановити пакунок, викориÑтовуючи Conda, виконайте команду: -cargo.install = Ðби вÑтановити пакунок, викориÑтовуючи Cargo, виконайте команду: +conda.install = Ðби вÑтановити пакунок, викориÑтовуючи Conda, запуÑтіть команду: +cargo.install = Ðби вÑтановити пакунок, викориÑтовуючи Cargo, запуÑтіть команду: versions.view_all = ПереглÑнути вÑÑ– -generic.download = Завантажте пакунок із командного Ñ€Ñдка: +generic.download = Завантажте пакунок з командного Ñ€Ñдка: details = Подробиці arch.version.optdepends = ÐеобовʼÑзково залежить installation = УÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ details.license = Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ filter.type.all = УÑÑ– -conan.install = Ðби вÑтановити пакунок, викориÑтовуючи Conan, виконайте команду: +conan.install = Ðби вÑтановити пакунок, викориÑтовуючи Conan, запуÑтіть команду: container.layers = Шари образу details.project_site = ВебÑторінка проєкту details.documentation_site = ВебÑторінка документації -desc = ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ°Ð¼Ð¸ репозиторію. +desc = Керувати пакунками репозиторію. requirements = Вимоги dependencies = ЗалежноÑті empty.repo = Ви опублікували пакунок, але він не показаний тут? Перейдіть до налаштувань пакунків та привʼÑжіть його до цього репозиторію. alpine.repository = Про репозиторій -alpine.install = Ðби вÑтановити цей пакунок, виконайте команду: -cran.install = Ðби вÑтановити пакунок, виконайте команду: +alpine.install = Ðби вÑтановити цей пакунок, запуÑтіть команду: +cran.install = Ðби вÑтановити пакунок, запуÑтіть команду: composer.dependencies.development = ЗалежноÑті розробки container.labels.key = Ключ container.labels.value = Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ -composer.install = Ðби вÑтановити пакунок, викориÑтовуючи Composer, виконайте команду: +composer.install = Ðби вÑтановити пакунок, викориÑтовуючи Composer, запуÑтіть команду: debian.repository.components = Складові filter.container.tagged = Відмічений filter.container.untagged = Ðевідмічений @@ -3440,20 +3139,20 @@ arch.pacman.sync = Синхронізуйте пакунок з pacman: arch.pacman.conf = Додайте Ñервер з повʼÑзаним доÑтрибутивом та архітектурою до /etc/pacman.conf : arch.version.properties = ВлаÑтивоÑті верÑÑ–Ñ— arch.version.description = ÐžÐ¿Ð¸Ñ -chef.install = Ðби вÑтановити пакунок, виконайте команду: +chef.install = Ðби вÑтановити пакунок, запуÑтіть команду: container.details.platform = Платформа container.details.type = Тип образу container.pull = Завантажити образ із командного Ñ€Ñдка: details.repository_site = ВебÑторінка репозиторію composer.dependencies = ЗалежноÑті -debian.install = Ðби вÑтановити пакунок, виконайте команду: +debian.install = Ðби вÑтановити пакунок, запуÑтіть команду: debian.repository = Про репозиторій debian.repository.distributions = ДиÑтрибутиви alpine.repository.architectures = Ðрхітектури arch.version.depends = Залежить -go.install = Ð’Ñтановити пакунок із командного Ñ€Ñдка: +go.install = Ð’Ñтановити пакунок з командного Ñ€Ñдка: debian.repository.architectures = Ðрхітектури -helm.install = Ðби вÑтановити пакунок, виконайте команду: +helm.install = Ðби вÑтановити пакунок, запуÑтіть команду: keywords = Ключові Ñлова assets = РеÑурÑи versions = ВерÑÑ–Ñ— @@ -3461,64 +3160,13 @@ dependency.version = ВерÑÑ–Ñ container.labels = Мітки filter.no_result = Ваш фільтр не видав жодних результатів. dependency.id = ID + +npm.dependencies = ЗалежноÑті 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 +settings.delete.success = Пакунок видалено. +settings.delete.error = Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ пакунок. [secrets] deletion = Видалити Ñекрет @@ -3531,11 +3179,10 @@ deletion.description = Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñекрету Ñ” оÑтаточним creation = Додати Ñекрет none = Секретів ще немає. creation.name_placeholder = без ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ³Ñ–Ñтру, тільки літерно-цифрові Ñимволи або підкреÑленнÑ, не може починатиÑÑ Ð· GITEA_ або GITHUB_ + secrets = Секрети creation.value_placeholder = Уведіть довільний вміÑÑ‚. Пробіли на початку та в кінці будуть пропущені. -description = Секрети передаютьÑÑ Ð¿ÐµÐ²Ð½Ð¸Ð¼ діÑм Ñ– не можуть бути прочитані інакше. - [actions] runners.name=Ðазва runners.owner_type=Тип @@ -3574,56 +3221,30 @@ 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.failure = Помилка status.skipped = Пропущено +runners.status = Стан +runners.task_list.status = Стан +runners.status.unspecified = Ðевідомо +runners.reset_registration_token = Скинути токен реєÑтрації +runs.all_workflows = УÑÑ– робочі потоки +runs.workflow = Робочий потік +runs.status = Стан +runs.status_no_select = УÑÑ– Ñтани +runs.no_results = Ðе знайдено відповідних результатів. +runs.no_workflows = Робочих потоків ще немає. +workflow.disable = Вимкнути робочий потік +workflow.disable_success = Робочий потік «%s» уÑпішно вимкнено. +workflow.enable = Увімкнути робочий потік +workflow.enable_success = Робочий потік «%s» уÑпішно ввімкнено. +workflow.disabled = Робочий потік вимкнено. 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 = Проєкт організації @@ -3642,11 +3263,11 @@ changed_filemode = %[1]s → %[2]s [search] -code_kind = Шукати код… +code_kind = Шукати код... code_search_unavailable = Пошук коду наразі недоÑтупний. Будь лаÑка, звʼÑжітьÑÑ Ð· адмініÑтратором Ñайту. -user_kind = Шукати кориÑтувачів… -repo_kind = Шукати репозиторії… -search = Пошук… +user_kind = Шукати кориÑтувачів... +repo_kind = Шукати репозиторії... +search = Пошук... type_tooltip = Вид пошуку fuzzy = Ðечіткий fuzzy_tooltip = Включати результати, що подібні пошуковому запиту @@ -3656,19 +3277,19 @@ exact = Точний exact_tooltip = Включати лише результати, що чітко відповідають запиту regexp = РегулÑрні вирази regexp_tooltip = Опрацьовувати пошуковий запит Ñк регулÑрний вираз -org_kind = Шукати організації… -team_kind = Шукати команди… +org_kind = Шукати організації... +team_kind = Шукати команди... milestone_kind = Шукати віхи... -commit_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 = Шукати ранери… +code_search_by_git_grep = Поточні результати пошуку коду надаютьÑÑ Ð· "git grep". Тут можуть бути кращі результати, Ñкщо адмініÑтратор Ñайту ввімкнув індекÑацію коду. +package_kind = Шукати пакунки... +project_kind = Шукати проєкти... +branch_kind = Шукати гілки... +issue_kind = Шукати задачі... +pull_kind = Шукати запити на злиттÑ... +runner_kind = Пошук раннерів... [markup] filepreview.truncated = ПереглÑд було урізано @@ -3679,17 +3300,8 @@ filepreview.lines = РÑдки з %[1]d по %[2]d в %[3]s 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 в очікуванні. +packages.read = Читати: ДивитиÑÑŒ та завантажити пакунки призначені до репозиторію. +packages.write = ПиÑати: Публікувати та видалÑти пакунки призначені до репозиторію. [munits.data] pib = ПіБ @@ -3698,4 +3310,4 @@ kib = КіБ mib = МіБ gib = ГіБ tib = ТіБ -b = Б +b = Б \ No newline at end of file diff --git a/options/locale/locale_vi.ini b/options/locale/locale_vi.ini index 57e592a209..1295731977 100644 --- a/options/locale/locale_vi.ini +++ b/options/locale/locale_vi.ini @@ -1,3 +1,6 @@ + + + [common] home = Trang chá»§ explore = Khám phá diff --git a/options/locale/locale_yi.ini b/options/locale/locale_yi.ini index 9340e3ef0a..8b13789179 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 9ec958d7b2..8d33203abb 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -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=查看 @@ -112,10 +112,10 @@ preview=预览 loading=正在加载… error=错误 -error404=您å°è¯•访问的页é¢ä¸å­˜åœ¨ã€å·²è¢«ç§»é™¤æˆ–æ‚¨æ— æƒæŸ¥çœ‹ã€‚ +error404=您正å°è¯•è®¿é—®çš„é¡µé¢ ä¸å­˜åœ¨ 或 æ‚¨å°šæœªè¢«æŽˆæƒ æŸ¥çœ‹è¯¥é¡µé¢ã€‚ go_back=返回 -never=从未 +never=ä»Žä¸ unknown=未知 rss_feed=RSS è®¢é˜…æº @@ -126,7 +126,7 @@ unpin=å–æ¶ˆç½®é¡¶ artifacts=åˆ¶å“ confirm_delete_artifact=您确定è¦åˆ é™¤åˆ¶å““%sâ€å—? -archived=已存档 +archived=已归档 concept_system_global=全局 concept_user_individual=个人 @@ -143,9 +143,9 @@ confirm_delete_selected=确认删除所有选中项目? name=åç§° value=值 filter = 筛选 -filter.clear = 清除æ¡ä»¶ -filter.is_archived = 已存档 -filter.not_archived = 未存档 +filter.clear = 清除筛选æ¡ä»¶ +filter.is_archived = 已归档 +filter.not_archived = 未归档 filter.is_fork = 是派生 filter.not_fork = 䏿˜¯æ´¾ç”Ÿ filter.is_mirror = æ˜¯é•œåƒ @@ -166,7 +166,6 @@ new_org.title = 创建组织 new_repo.link = 创建仓库 new_migrate.link = 开始è¿ç§» new_org.link = 创建组织 -copy_path = å¤åˆ¶è·¯å¾„ [aria] navbar=å¯¼èˆªæ  @@ -179,7 +178,7 @@ number_of_contributions_in_the_last_12_months=过去的一年内有 %s 次贡献 contributions_zero=没有贡献 less=较少 more=较多 -contributions_format = {year}å¹´{month}{day}日有{contributions} +contributions_format = {year}{month}{day} 当日有 {contributions} contributions_few = 贡献 contributions_one = 贡献 @@ -199,17 +198,7 @@ buttons.switch_to_legacy.tooltip=使用旧版编辑器 buttons.enable_monospace_font=å¯ç”¨ç­‰å®½å­—体 buttons.disable_monospace_font=ç¦ç”¨ç­‰å®½å­—体 buttons.unindent.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 直接粘贴到编辑器创建链接。 +buttons.indent.tooltip = 解除一级嵌套æ¡ç›® [filter] string.asc=A - Z @@ -247,7 +236,7 @@ user=用户å password=æ•°æ®åº“ç”¨æˆ·å¯†ç  db_name=æ•°æ®åº“åç§° db_schema=æž¶æž„æ¨¡å¼ -db_schema_helper=留空则数æ®åº“中默认值为("public")。 +db_schema_helper=留空则数æ®åº“中默认值为("public")。 ssl_mode=SSL path=æ•°æ®åº“文件路径 sqlite_helper=SQLite3 æ•°æ®åº“的文件路径。
      如果以æœåŠ¡çš„æ–¹å¼è¿è¡Œ Forgejo,请输入ç»å¯¹è·¯å¾„。 @@ -280,16 +269,16 @@ ssh_port_helper=SSH æœåŠ¡å™¨çš„ç«¯å£å·ï¼Œä¸ºç©ºåˆ™ç¦ç”¨å®ƒã€‚ http_port=HTTP æœåŠ¡ç«¯å£ http_port_helper=Forgejos web æœåС噍将侦å¬çš„端å£å·ã€‚ app_url=基础URL -app_url_helper=用于 HTTP(S) 克隆和电å­é‚®ä»¶é€šçŸ¥çš„基础URL。 +app_url_helper=用于 HTTP (S) 克隆和电å­é‚®ä»¶é€šçŸ¥çš„基本地å€ã€‚ 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=需è¦å‘电å­é‚®ä»¶ç¡®è®¤æ³¨å†Œ @@ -321,16 +310,16 @@ 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=默认情况下å…许创建组织 @@ -354,7 +343,7 @@ app_slogan = 实例标语 app_slogan_helper = 在此处输入您的实例标语。留空则ç¦ç”¨ã€‚ [home] -uname_holder=ç”¨æˆ·åæˆ–电å­é‚®ä»¶åœ°å€ +uname_holder=ç”¨æˆ·åæˆ–电å­é‚®ç®± password_holder=å¯†ç  switch_dashboard_context=åˆ‡æ¢æŽ§åˆ¶é¢æ¿ç”¨æˆ· my_repos=仓库列表 @@ -368,12 +357,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=åªæ˜¾ç¤ºå…¬å¼€çš„ @@ -479,7 +468,7 @@ 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 = å·²ç»æœ‰è´¦æˆ·äº†å—?立å³ç™»å½•ï¼ @@ -488,7 +477,6 @@ sign_in_openid = 继续使用 OpenID sign_up_button = ç«‹å³æ³¨å†Œã€‚ hint_register = 需è¦è´¦å·ï¼Ÿç«‹å³æ³¨å†Œã€‚ unauthorized_credentials = 凭æ®ä¸æ­£ç¡®æˆ–已过期。请é‡è¯•您的命令,或查看 %s ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ -use_onetime_code = ä½¿ç”¨ä¸€æ¬¡æ€§ä»£ç  [mail] view_it_on=在 %s 上查看 @@ -517,8 +505,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。 @@ -537,11 +525,11 @@ 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" 仓库转让给你 @@ -604,24 +592,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=éžæœ¬åœ°ç”¨æˆ·ä¸å…许更改用户å。 @@ -645,21 +633,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 @@ -683,9 +671,7 @@ To = 分支å AccessToken = 访问令牌 Description = æè¿° Pronouns = 代称 -Biography = 简介 -username_claiming_cooldown = 用户åä¸èƒ½è¢«è®¤é¢†ï¼Œå› ä¸ºå…¶ä»å¤„äºŽä¿æŠ¤æœŸã€‚å…¶å¯ä»¥åœ¨%[1]såŽè¢«è®¤é¢†ã€‚ -email_domain_is_not_allowed = 用户电å­é‚®ä»¶åœ°å€çš„域å%s与EMAIL_DOMAIN_ALLOWLIST或EMAIL_DOMAIN_BLOCKLIST冲çªã€‚è¯·ç¡®ä¿æ‚¨æ­£ç¡®è®¾ç½®äº†ç”µå­é‚®ä»¶åœ°å€ã€‚ +Biography = 简历 [user] change_avatar=修改头åƒâ€¦ @@ -751,9 +737,9 @@ uid=UID webauthn=两步验è¯ï¼ˆå®‰å…¨å¯†é’¥ï¼‰ public_profile=å…¬å¼€ä¿¡æ¯ -biography_placeholder=å‘他人介ç»ä¸€ä¸‹ä½ è‡ªå·±ï¼ï¼ˆæ”¯æŒ Markdown) +biography_placeholder=å‘Šè¯‰æˆ‘ä»¬ä¸€ç‚¹æ‚¨è‡ªå·±ï¼ (您å¯ä»¥ä½¿ç”¨Markdown) location_placeholder=与他人分享你的大概ä½ç½® -profile_desc=关于您 +profile_desc=控制您的个人资料对其他用户的显示方å¼ã€‚您的主è¦ç”µå­é‚®ä»¶åœ°å€å°†ç”¨äºŽé€šçŸ¥ã€å¯†ç æ¢å¤å’ŒåŸºäºŽç½‘页界é¢çš„ Git æ“作。 password_username_disabled=ä¸å…è®¸éžæœ¬åœ°ç”¨æˆ·æ›´æ”¹ä»–们的用户å。更多详情请è”系您的系统管ç†å‘˜ã€‚ full_name=å…¨å website=个人网站 @@ -763,10 +749,10 @@ 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=界é¢è¯­è¨€ @@ -794,14 +780,14 @@ privacy=éšç§è®¾ç½® keep_activity_private=éšè—个人资料页é¢ä¸­çš„æ´»åЍ keep_activity_private_popup=您的活动将åªå¯¹æ‚¨è‡ªå·±å’Œæœ¬å®žä¾‹çš„管ç†å‘˜å¯è§ -lookup_avatar_by_mail=使用电å­é‚®ä»¶åœ°å€æŸ¥æ‰¾å¤´åƒ +lookup_avatar_by_mail=使用电å­é‚®ç®±åœ°å€æŸ¥æ‰¾å¤´åƒ federated_avatar_lookup=查找è”åˆå¤´åƒ enable_custom_avatar=ä½¿ç”¨è‡ªå®šä¹‰å¤´åƒ choose_new_avatar=é€‰æ‹©æ–°çš„å¤´åƒ update_avatar=æ›´æ–°å¤´åƒ delete_current_avatar=删除当å‰å¤´åƒ uploaded_avatar_not_a_image=ä¸Šä¼ çš„æ–‡ä»¶ä¸æ˜¯ä¸€å¼ å›¾ç‰‡ã€‚ -uploaded_avatar_is_too_big=上传的文件大å°ï¼ˆ%d KiB) 超过最大é™åˆ¶ï¼ˆ%d KiB)。 +uploaded_avatar_is_too_big=上传的文件大å°(%d KiB) 超过最大é™åˆ¶(%d KiB)。 update_avatar_success=您的头åƒå·²æ›´æ–°ã€‚ update_user_avatar_success=用户头åƒå·²æ›´æ–°ã€‚ @@ -810,15 +796,15 @@ old_password=当å‰å¯†ç  new_password=æ–°çš„å¯†ç  retype_new_password=ç¡®è®¤æ–°å¯†ç  password_incorrect=当å‰å¯†ç ä¸æ­£ç¡®ã€‚ -change_password_success=您的密ç å·²æ›´æ–°ã€‚从现在开始请使用您的新密ç ç™»å½•。 +change_password_success=您的密ç å·²æ›´æ–°ã€‚从现在开始使用您的新密ç ç™»å½•。 password_change_disabled=éžæœ¬åœ°å¸æˆ·ä¸èƒ½é€šè¿‡ Forgejo çš„ web ç•Œé¢æ›´æ”¹å¯†ç ã€‚ emails=é‚®ç®±åœ°å€ manage_emails=管ç†é‚®ç®±åœ°å€ manage_themes=默认主题 manage_openid=OpenID åœ°å€ -email_desc=您的主è¦ç”µå­é‚®ä»¶åœ°å€å°†ç”¨äºŽé€šçŸ¥ã€å¯†ç æ¢å¤ï¼ŒåŸºäºŽç½‘页界é¢çš„Gitæ“作(åªè¦å®ƒä¸æ˜¯è®¾ç½®ä¸ºéšè—的)。 -theme_desc=此主题将在您已登录时被用于网页界é¢ã€‚ +email_desc=您的主è¦ç”µå­é‚®ä»¶åœ°å€å°†ç”¨äºŽé€šçŸ¥ã€å¯†ç æ¢å¤ï¼ŒåŸºäºŽç½‘页界é¢çš„Gitæ“作(åªè¦å®ƒä¸æ˜¯è®¾ç½®ä¸ºéšè—çš„)。 +theme_desc=这将是您在整个网站上的默认主题。 primary=ä¸»è¦ activated=已激活 requires_activation=éœ€è¦æ¿€æ´» @@ -828,8 +814,8 @@ activations_pending=等待激活 can_not_add_email_activations_pending=有一个待处ç†çš„æ¿€æ´»è¯·æ±‚,请ç¨ç­‰å‡ åˆ†é’ŸåŽå†å°è¯•添加新的电å­é‚®ä»¶åœ°å€ã€‚ delete_email=移除 email_deletion=移除电å­é‚®ä»¶åœ°å€ -email_deletion_desc=电å­é‚®ä»¶åœ°å€å’Œç›¸å…³ä¿¡æ¯å°†ä¼šè¢«åˆ é™¤ã€‚使用此电å­é‚®ä»¶åœ°å€å‘é€çš„Gitæäº¤å°†ä¼šä¿ç•™ï¼Œç»§ç»­ï¼Ÿ -email_deletion_success=您的电å­é‚®ä»¶åœ°å€å·²è¢«ç§»é™¤ã€‚ +email_deletion_desc=电å­é‚®ç®±åœ°å€å’Œç›¸å…³ä¿¡æ¯å°†ä¼šè¢«åˆ é™¤ã€‚使用此电å­é‚®ç®±åœ°å€å‘é€çš„Gitæäº¤å°†ä¼šä¿ç•™ï¼Œç»§ç»­ï¼Ÿ +email_deletion_success=您的电å­é‚®ç®±åœ°å€å·²è¢«ç§»é™¤ã€‚ theme_update_success=您的主题已更新。 theme_update_error=所选主题ä¸å­˜åœ¨ã€‚ openid_deletion=移除 OpenID åœ°å€ @@ -844,7 +830,7 @@ add_email_success=新的电å­é‚®ä»¶åœ°å€å·²æ·»åŠ ã€‚ email_preference_set_success=电å­é‚®ä»¶é¦–选项已æˆåŠŸè®¾ç½®ã€‚ add_openid_success=æ–°çš„ OpenID 地å€å·²æ·»åŠ ã€‚ keep_email_private=éšè—é‚®ç®±åœ°å€ -keep_email_private_popup=您的邮件地å€ä¸ä¼šåœ¨ä¸ªäººèµ„料中显示,也ä¸ä¼šæˆä¸ºé€šè¿‡ç½‘é¡µç•Œé¢æäº¤çš„é»˜è®¤åœ°å€ï¼Œä¾‹å¦‚文件上传ã€ç¼–辑和åˆå¹¶æäº¤ã€‚相å,å¯ä»¥ä½¿ç”¨ç‰¹æ®Šåœ°å€ %s å°†æäº¤é“¾æŽ¥åˆ°æ‚¨çš„è´¦å·ã€‚此选项ä¸ä¼šå½±å“现有æäº¤ã€‚ +keep_email_private_popup=这将从您的个人资料中éšè—您的电å­é‚®ä»¶åœ°å€ã€‚它将ä¸å†æ˜¯é€šè¿‡ Web 界é¢åˆ›å»ºæ‹‰å–请求的默认地å€ï¼Œå¦‚文件上传和编辑,也ä¸ä¼šç”¨äºŽåˆå¹¶æäº¤ã€‚相å,å¯ä»¥ä½¿ç”¨ç‰¹æ®Šåœ°å€ %s å°†æäº¤ä¸Žæ‚¨çš„è´¦å·ç›¸å…³è”。请注æ„,更改此选项ä¸ä¼šå½±å“现有的æäº¤ã€‚ openid_desc=OpenID 让你å¯ä»¥å°†è®¤è¯è½¬å‘到外部æœåŠ¡ã€‚ manage_ssh_keys=ç®¡ç† SSH 密钥 @@ -904,7 +890,7 @@ ssh_principal_deletion=删除 SSH è¯ä¹¦è§„则 ssh_key_deletion_desc=删除 SSH 公钥将喿¶ˆå¯¹åº”çš„ç§é’¥å¯¹æ‚¨çš„ Forgejo 叿ˆ·çš„访问æƒé™ã€‚继续? gpg_key_deletion_desc=删除 GPG 公钥将无法认知使用对应ç§é’¥ç­¾åçš„æäº¤ï¼Œç»§ç»­ï¼Ÿ ssh_principal_deletion_desc=删除此 SSH è¯ä¹¦è§„åˆ™å°†å–æ¶ˆå®ƒå¯¹æ‚¨çš„账户的访问æƒé™ã€‚继续? -ssh_key_deletion_success=SSH 密钥已被删除。 +ssh_key_deletion_success=GPG 密钥已被删除。 gpg_key_deletion_success=GPG 密钥已被删除。 ssh_principal_deletion_success=此规则删除æˆåŠŸã€‚ added_on=添加于 %s @@ -942,12 +928,12 @@ access_token_deletion_desc=删除令牌将撤销程åºå¯¹æ‚¨è´¦æˆ·çš„è®¿é—®æƒ delete_token_success=令牌已ç»è¢«åˆ é™¤ã€‚使用该令牌的应用将ä¸å†èƒ½å¤Ÿè®¿é—®ä½ çš„è´¦å·ã€‚ repo_and_org_access=仓库和组织访问æƒé™ permissions_public_only=仅公开 -permissions_access_all=全部(公开ã€ç§æœ‰å’Œå—é™ï¼‰ +permissions_access_all=全部(公开ã€ç§æœ‰å’Œå—é™) select_permissions=选择æƒé™ permission_no_access=无访问æƒé™ permission_read=å¯è¯» permission_write=读写 -access_token_desc=所选令牌æƒé™ä»…é™äºŽå¯¹åº”çš„ API 路由的授æƒã€‚阅读 文档 ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚ +access_token_desc=所选令牌æƒé™ä»…é™äºŽå¯¹åº”çš„ API 路由的授æƒã€‚阅读 文档 ä»¥èŽ·å–æ›´å¤šä¿¡æ¯ã€‚ at_least_one_permission=你需è¦é€‰æ‹©è‡³å°‘一个æƒé™æ‰èƒ½åˆ›å»ºä»¤ç‰Œ permissions_list=æƒé™ï¼š @@ -978,7 +964,7 @@ oauth2_application_locked=如果é…ç½®å¯ç”¨ï¼ŒForgejo预注册一些OAuth2应 authorized_oauth2_applications=已授æƒçš„ OAuth2 应用 authorized_oauth2_applications_description=您已授予这些第三方应用程åºè®¿é—®æ‚¨çš„个人 Forgejo 账户的æƒé™ã€‚请撤销那些您ä¸å†ä½¿ç”¨çš„应用程åºçš„访问æƒé™ã€‚ revoke_key=撤销 -revoke_oauth2_grant=撤销访问æƒé™ +revoke_oauth2_grant=撤回æƒé™ revoke_oauth2_grant_description=确定撤销此三方应用程åºçš„æŽˆæƒï¼Œå¹¶é˜»æ­¢æ­¤åº”用程åºè®¿é—®æ‚¨çš„æ•°æ®ï¼Ÿ revoke_oauth2_grant_success=æˆåŠŸæ’¤é”€äº†è®¿é—®æƒé™ã€‚ @@ -1017,7 +1003,7 @@ remove_account_link=åˆ é™¤å·²ç»‘å®šçš„è´¦å· remove_account_link_desc=åˆ é™¤å·²ç»‘å®šå¸æˆ·å°†åŠé”€å…¶å¯¹æ‚¨çš„ Forgejo 叿ˆ·çš„访问æƒé™ã€‚继续? remove_account_link_success=已喿¶ˆç»‘å®šå¸æˆ·ã€‚ -hooks.desc=添加会在您拥有的所有仓库上触å‘çš„ Web é’©å­ã€‚ +hooks.desc=添加 Web é’©å­ï¼Œå®ƒä»¬å°†ä¼šåœ¨æ‚¨æ‹¥æœ‰çš„æ‰€æœ‰ä»“åº“ä¸Šè§¦å‘ orgs_none=æ‚¨çŽ°åœ¨è¿˜ä¸æ˜¯ä»»ä½•组织的æˆå‘˜ã€‚ repos_none=你并䏿‹¥æœ‰ä»»ä½•仓库。 @@ -1032,16 +1018,16 @@ delete_account_desc=ç¡®å®žè¦æ°¸ä¹…åˆ é™¤æ­¤ç”¨æˆ·å¸æˆ·å—? email_notifications.enable=å¯ç”¨é‚®ä»¶é€šçŸ¥ email_notifications.onmention=åªåœ¨è¢«æåˆ°æ—¶é‚®ä»¶é€šçŸ¥ email_notifications.disable=åœç”¨é‚®ä»¶é€šçŸ¥ -email_notifications.submit=设置邮件å好 +email_notifications.submit=邮件通知设置 email_notifications.andyourown=和您自己的通知 visibility=用户å¯è§æ€§ visibility.public=公开 visibility.public_tooltip=对所有人å¯è§ visibility.limited=å—é™ -visibility.limited_tooltip=仅对登录用户å¯è§ +visibility.limited_tooltip=仅对已认è¯çš„用户å¯è§ visibility.private=ç§æœ‰ -visibility.private_tooltip=仅对您已加入的组织的æˆå‘˜å¯è§ +visibility.private_tooltip=仅对您已加入的组织的æˆå‘˜å¯è§ã€‚ blocked_users = å·²å±è”½çš„用户 blocked_users_none = 黑åå•中没有用户。 blocked_since = 自 %s 起被å±è”½ @@ -1055,44 +1041,14 @@ additional_repo_units_hint_description = 在所有存在未å¯ç”¨çš„功能的仓 update_hints_success = æç¤ºæ›´æ”¹æˆåŠŸã€‚ pronouns_custom = 自定义 pronouns = ä»£è¯ -pronouns_unspecified = 未指定 +pronouns_unspecified = 䏿Œ‡å®š 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 = é…é¢ -quota.applies_to_org = 以下é…é¢è§„则适用于此组织 -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.assets.all = èµ„æº -quota.sizes.assets.attachments.all = 附件 -quota.sizes.assets.attachments.issues = å·¥å•附件 -quota.sizes.assets.attachments.releases = 版本å‘布附件 -quota.sizes.assets.artifacts = åˆ¶å“ -quota.sizes.assets.packages.all = 软件包 -quota.sizes.wiki = 百科 -storage_overview = 存储概览 -quota.applies_to_user = 以下é…é¢è§„åˆ™é€‚ç”¨äºŽæ‚¨çš„è´¦å· -quota.sizes.repos.public = 公开仓库 -regenerate_token_success = 已釿–°ç”Ÿæˆä»¤ç‰Œã€‚使用旧令牌的应用程åºä¸å†å¯ä»¥è®¿é—®æ‚¨çš„è´¦å·ï¼Œå¿…须使用新令牌更新。 -regenerate_token = 釿–°ç”Ÿæˆ -access_token_regeneration = 釿–°ç”Ÿæˆè®¿é—®ä»¤ç‰Œ -access_token_regeneration_desc = 釿–°ç”Ÿæˆä»¤ç‰Œå°†æ’¤é”€ä½¿ç”¨è¯¥ä»¤ç‰Œçš„应用程åºå¯¹æ‚¨çš„è´¦å·çš„访问æƒé™ã€‚æ­¤æ“作无法撤销。继续? [repo] -new_repo_helper=代ç ä»“库包å«äº†æ‰€æœ‰çš„项目文件,包括版本历å²è®°å½•。已ç»åœ¨å…¶ä»–地方托管了?è¿ç§»ä»“库。 +new_repo_helper=代ç ä»“库包å«äº†æ‰€æœ‰çš„项目文件,包括版本历å²è®°å½•。已ç»åœ¨å…¶ä»–地方托管了?è¿ç§»ä»“库。 owner=拥有者 owner_helper=由于最大仓库数é‡é™åˆ¶ï¼Œä¸€äº›ç»„织å¯èƒ½ä¸ä¼šæ˜¾ç¤ºåœ¨ä¸‹æ‹‰åˆ—表中。 repo_name=仓库åç§° @@ -1113,7 +1069,7 @@ fork_from=派生自 already_forked=ä½ å·²ç»æ´¾ç”Ÿè¿‡ %s fork_to_different_account=æ´¾ç”Ÿåˆ°å…¶ä»–è´¦å· fork_visibility_helper=无法更改派生仓库的å¯è§æ€§ã€‚ -fork_branch=è¦å¤åˆ¶åˆ°æ´¾ç”Ÿçš„分支 +fork_branch=è¦å…‹éš†åˆ° Fork 的分支 all_branches=所有分支 fork_no_valid_owners=这个代ç ä»“库无法被派生,因为没有有效的所有者。 use_template=ä½¿ç”¨æ­¤æ¨¡æ¿ @@ -1124,7 +1080,7 @@ download_bundle=下载 BUNDLE generate_repo=生æˆä»“库 generate_from=生æˆè‡ª repo_desc=仓库æè¿° -repo_desc_helper=è¾“å…¥ç®€è¦æè¿°ï¼ˆå¯é€‰ï¼‰ +repo_desc_helper=è¾“å…¥ç®€è¦æè¿° (å¯é€‰) repo_lang=仓库语言 repo_gitignore_helper=选择 .gitignore æ¨¡æ¿ repo_gitignore_helper_desc=从常è§è¯­è¨€çš„æ¨¡æ¿åˆ—è¡¨ä¸­é€‰æ‹©å¿½ç•¥è·Ÿè¸ªçš„æ–‡ä»¶ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œç”±å¼€å‘æˆ–构建工具生æˆçš„特殊文件都包å«åœ¨ .gitignore 中。 @@ -1132,13 +1088,13 @@ issue_labels=标签 issue_labels_helper=选择标签集 license=授æƒè®¸å¯ license_helper=选择授æƒè®¸å¯æ–‡ä»¶ -license_helper_desc=许å¯è¯è¯´æ˜Žäº†å…¶ä»–人å¯ä»¥å’Œä¸å¯ä»¥ç”¨æ‚¨çš„代ç åšä»€ä¹ˆã€‚ä¸ç¡®å®šå“ªä¸€ä¸ªé€‚åˆä½ çš„é¡¹ç›®ï¼Ÿè¯·è§ é€‰æ‹©ä¸€ä¸ªè®¸å¯è¯ã€‚ +license_helper_desc=许å¯è¯è¯´æ˜Žäº†å…¶ä»–人å¯ä»¥å’Œä¸å¯ä»¥ç”¨æ‚¨çš„代ç åšä»€ä¹ˆã€‚ä¸ç¡®å®šå“ªä¸€ä¸ªé€‚åˆä½ çš„é¡¹ç›®ï¼Ÿè§ é€‰æ‹©ä¸€ä¸ªè®¸å¯è¯ object_format = å¯¹è±¡æ ¼å¼ object_format_helper = 仓库的对象格å¼ï¼Œä¸€æ—¦è®¾ç½®æ— æ³•更改。SHA1 的兼容性最强。 readme=自述 readme_helper=é€‰æ‹©è‡ªè¿°æ–‡ä»¶æ¨¡æ¿ readme_helper_desc=这是您å¯ä»¥ä¸ºæ‚¨çš„项目撰写完整æè¿°çš„地方。 -auto_init=åˆå§‹åŒ–仓库 +auto_init=åˆå§‹åŒ–仓库(添加 .gitignoreã€è®¸å¯è¯å’Œè‡ªè¿°æ–‡ä»¶) trust_model_helper=选择签å验è¯çš„“信任模型â€ã€‚å¯èƒ½çš„选项是: trust_model_helper_collaborator=å作者:信任å作者的签å trust_model_helper_committer=æäº¤è€…:信任与æäº¤è€…相符的签å @@ -1157,14 +1113,14 @@ mirror_sync_on_commit=æŽ¨é€æäº¤æ—¶åŒæ­¥ mirror_address=从 URL 克隆 mirror_address_desc=åœ¨æŽˆæƒæ¡†ä¸­è¾“入必è¦çš„凭æ®ã€‚ mirror_address_url_invalid=URL无效。请检查您所输入的URLæ˜¯å¦æ­£ç¡®ã€‚ -mirror_address_protocol_invalid=æä¾›çš„URL无效。åªèƒ½ä½¿ç”¨http(s)://或git://地å€è¿›è¡Œé•œåƒæ“作。 -mirror_lfs=大文件存储(LFS) +mirror_address_protocol_invalid=æä¾›çš„URL无效。åªèƒ½ä½¿ç”¨http(s)://或git://地å€è¿›è¡Œé•œåƒæ“作。 +mirror_lfs=大文件存储 (LFS) mirror_lfs_desc=é•œåƒ LFS æ•°æ®ã€‚ mirror_lfs_endpoint=LFS ç½‘å€ mirror_lfs_endpoint_desc=åŒæ­¥å°†å°è¯•ä½¿ç”¨å…‹éš†ç½‘å€æ¥ 确定 LFS æœåŠ¡å™¨ã€‚å¦‚æžœä»“åº“ LFS æ•°æ®å­˜å‚¨åœ¨å…¶ä»–ä½ç½®ï¼Œä½ è¿˜å¯ä»¥æŒ‡å®šè‡ªå®šä¹‰ç½‘å€ã€‚ mirror_last_synced=ä¸Šæ¬¡åŒæ­¥ -mirror_password_placeholder=(未更改) -mirror_password_blank_placeholder=(未设置) +mirror_password_placeholder=(未更改) +mirror_password_blank_placeholder=(未设置) mirror_password_help=更改用户å以删除已储存的密ç ã€‚ watchers=关注者 stargazers=称赞者 @@ -1173,12 +1129,12 @@ forks=派生仓库 reactions_more=å†åŠ è½½ %d unit_disabled=站点管ç†å‘˜å·²ç¦ç”¨æ­¤ä»“库å•元。 language_other=其它 -adopt_search=输入用户å以æœç´¢æœªè¢«æ”¶å½•的仓库…(留空以查找全部) +adopt_search=输入用户å以æœç´¢æœªè¢«æ”¶å½•的仓库... (留空以查找全部) adopt_preexisting_label=收录文件 adopt_preexisting=收录已存在的仓库 adopt_preexisting_content=从 %s 创建仓库 adopt_preexisting_success=从 %s 收录仓库æˆåŠŸ -delete_preexisting_label=删除 +delete_preexisting_label=刪除 delete_preexisting=删除已存在的文件 delete_preexisting_content=删除 %s 中的文件 delete_preexisting_success=删除 %s 中未收录的文件 @@ -1198,14 +1154,14 @@ transfer.reject_desc=`å–æ¶ˆè½¬ç§»åˆ° "%s"` transfer.no_permission_to_accept=您没有æƒé™æŽ¥å—此转让。 transfer.no_permission_to_reject=您没有æƒé™æ‹’ç»æ­¤è½¬è®©ã€‚ -desc.private=ç§æœ‰ +desc.private=ç§æœ‰åº“ desc.public=公开 desc.template=æ¨¡æ¿ desc.internal=内部 desc.archived=已存档 desc.sha256 = SHA256 template.items=模æ¿é€‰é¡¹ -template.git_content=Gitæ•°æ®ï¼ˆé»˜è®¤åˆ†æ”¯ï¼‰ +template.git_content=Gitæ•°æ®(默认分支) template.git_hooks=Git é’©å­ template.git_hooks_tooltip=ä½ ç›®å‰æ— æ³•修改或删除被添加过的 Git Hook。仅当你信任模æ¿ä»“库时æ‰å¯ä»¥é€‰æ‹©æ­¤é¡¹ã€‚ template.webhooks=Web é’©å­ @@ -1215,10 +1171,10 @@ template.issue_labels=工啿 ‡ç­¾ template.one_item=必须至少选择一个模æ¿é¡¹ template.invalid=必须选择一个模æ¿ä»“库 -archive.title=此仓库已存档。您å¯ä»¥æŸ¥çœ‹æ–‡ä»¶å’Œå…‹éš†ä»“库,但无法对其状æ€è¿›è¡Œä»»ä½•更改,例如推é€å’Œåˆ›å»ºæ–°å·¥å•ã€åˆå¹¶è¯·æ±‚或评论。 -archive.title_date=此仓库已于 %s 存档。您å¯ä»¥æŸ¥çœ‹æ–‡ä»¶æˆ–克隆它,但无法对其状æ€è¿›è¡Œä»»ä½•更改,例如推é€å’Œåˆ›å»ºæ–°å·¥å•ã€åˆå¹¶è¯·æ±‚或评论。 -archive.issue.nocomment=此仓库已存档,您ä¸èƒ½åœ¨å·¥å•添加评论。 -archive.pull.nocomment=此仓库已存档,您ä¸èƒ½åœ¨åˆå¹¶è¯·æ±‚添加评论。 +archive.title=该仓库已被归档。您å¯ä»¥æŸ¥çœ‹æ–‡ä»¶å’Œå…‹éš†å®ƒï¼Œä½†ä¸èƒ½æŽ¨é€ã€åˆ›å»ºå·¥å•或åˆå¹¶è¯·æ±‚。 +archive.title_date=该仓库已于 %s 归档。您å¯ä»¥æŸ¥çœ‹æ–‡ä»¶æˆ–克隆它,但ä¸èƒ½æŽ¨é€ã€åˆ›å»ºå·¥å•或åˆå¹¶è¯·æ±‚。 +archive.issue.nocomment=此仓库已存档,您ä¸èƒ½åœ¨æ­¤å·¥å•添加评论。 +archive.pull.nocomment=此仓库已存档,您ä¸èƒ½åœ¨æ­¤åˆå¹¶è¯·æ±‚添加评论。 form.reach_limit_of_creation_1=ä½ å·²ç»è¾¾åˆ°äº† %d 仓库的上é™ã€‚ form.reach_limit_of_creation_n=ä½ å·²ç»è¾¾åˆ°äº† %d 个仓库的上é™ã€‚ @@ -1244,7 +1200,7 @@ migrate_items_merge_requests=åˆå¹¶è¯·æ±‚ migrate_items_releases=版本å‘布 migrate_repo=è¿ç§»ä»“库 migrate.clone_address=从 URL è¿ç§»/克隆 -migrate.clone_address_desc=现有仓库的 HTTP(s) 或 Git “clone†URL +migrate.clone_address_desc=现有仓库的 HTTP(s) 或 Git “clone†URL migrate.github_token_desc=由于 GitHub API 速率é™åˆ¶ï¼Œæ‚¨å¯ä»¥åœ¨æ­¤å¤„放置一个或多个以逗å·åˆ†éš”的令牌,以加快è¿ç§»é€Ÿåº¦ã€‚ 警告:滥用此功能å¯èƒ½ä¼šè¿åæœåŠ¡æä¾›å•†çš„æ”¿ç­–å¹¶å¯¼è‡´å¸æˆ·è¢«å°ã€‚ migrate.clone_local_path=或æœåŠ¡å™¨æœ¬åœ°è·¯å¾„ migrate.permission_denied=您没有获得导入本地仓库的æƒé™ã€‚ @@ -1256,14 +1212,14 @@ 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_no_addr=è¿ç§»å¤±è´¥ã€‚ migrate.github.description=从 github.com 或 GitHub Enterprise æœåС噍è¿ç§»æ•°æ®ã€‚ migrate.git.description=ä»Žä»»æ„ Git æœåŠ¡è¿ç§»ä»“库。 migrate.gitlab.description=从 gitlab.com 或其他 GitLab 实例è¿ç§»æ•°æ®ã€‚ -migrate.gitea.description=从 gitea.com 或其他 Gitea 实例è¿ç§»æ•°æ®ã€‚ +migrate.gitea.description=从 gitea.com 或其他 Gitea/Forgejo 实例è¿ç§»æ•°æ®ã€‚ migrate.gogs.description=从 notabug.org 或其他 Gogs 实例è¿ç§»æ•°æ®ã€‚ migrate.onedev.description=从 code.onedev.io 或其他 OneDev 实例è¿ç§»æ•°æ®ã€‚ migrate.codebase.description=从 codebasehq.com è¿ç§»æ•°æ®ã€‚ @@ -1282,9 +1238,9 @@ mirror_from=镜åƒè‡ªåœ°å€ forked_from=派生自 generated_from=生æˆè‡ª fork_from_self=无法派生您拥有的仓库。 -fork_guest_user=è¯·å…ˆç™»å½•å†æ´¾ç”Ÿæ­¤ä»“库。 -watch_guest_user=请登录åŽå†å…³æ³¨æ­¤ä»“库。 -star_guest_user=请登录åŽå†ç‚¹èµžæ­¤ä»“库。 +fork_guest_user=登录并 派生 这个仓库。 +watch_guest_user=请登录åŽå†å…³æ³¨æ­¤ä»“库 +star_guest_user=请登录åŽå†ç‚¹èµžæ­¤ä»“库 unwatch=å–æ¶ˆå…³æ³¨ watch=关注 unstar=å–æ¶ˆç‚¹èµž @@ -1361,7 +1317,7 @@ commit_graph.select=选择分支 commit_graph.hide_pr_refs=éšè—åˆå¹¶è¯·æ±‚ commit_graph.monochrome=黑白 commit_graph.color=彩色 -commit.contained_in=这个æäº¤å­˜åœ¨äºŽï¼š +commit.contained_in=这个æäº¤åŒ…å«åœ¨ï¼š commit.contained_in_default_branch=æ­¤æäº¤æ˜¯é»˜è®¤åˆ†æ”¯çš„一部分 commit.load_referencing_branches_and_tags=加载引用该æäº¤çš„分支和标签 blame=责任归属 @@ -1369,7 +1325,7 @@ download_file=下载文件 normal_view=普通视图 line=行 lines=行 -from_comment=(评论) +from_comment=(评论) editor.add_file=添加文件 editor.new_file=新建文件 @@ -1382,7 +1338,7 @@ editor.cannot_edit_non_text_files=网页ä¸èƒ½ç¼–辑二进制文件。 editor.edit_this_file=编辑文件 editor.this_file_locked=文件已é”定 editor.must_be_on_a_branch=您必须在æŸä¸ªåˆ†æ”¯ä¸Šæ‰èƒ½å¯¹æ­¤æ–‡ä»¶è¿›è¡Œä¿®æ”¹æ“作。 -editor.fork_before_edit=您必须先派生这个仓库æ‰èƒ½å¯¹æ­¤æ–‡ä»¶è¿›è¡Œä¿®æ”¹æ“作。 +editor.fork_before_edit=您必须在派生这个仓库æ‰èƒ½å¯¹æ­¤æ–‡ä»¶è¿›è¡Œä¿®æ”¹æ“作 editor.delete_this_file=删除文件 editor.must_have_write_access=您必须具有写æƒé™æ‰èƒ½å¯¹æ­¤æ–‡ä»¶è¿›è¡Œä¿®æ”¹æ“作。 editor.file_delete_success=文件 %s 已被删除。 @@ -1392,7 +1348,7 @@ editor.or=或 editor.cancel_lower=å–æ¶ˆ editor.commit_signed_changes=æäº¤å·²ç­¾å的更改 editor.commit_changes=æäº¤å˜æ›´ -editor.add_tmpl=添加 “<%s>†+editor.add_tmpl=添加 Ҡeditor.add=添加 %s editor.update=æ›´æ–° %s editor.delete=删除 %s @@ -1402,7 +1358,7 @@ editor.fail_to_apply_patch=æ— æ³•åº”ç”¨è¡¥ä¸ %s editor.new_patch=æ–°è¡¥ä¸ editor.commit_message_desc=添加一个å¯é€‰çš„æ‰©å±•æè¿°â€¦ editor.signoff_desc=在æäº¤æ—¥å¿—æ¶ˆæ¯æœ«å°¾æ·»åŠ ç­¾ç½²äººä¿¡æ¯ã€‚ -editor.commit_directly_to_this_branch=直接æäº¤è‡³ %[1]s 分支。 +editor.commit_directly_to_this_branch=直接æäº¤è‡³ %s 分支。 editor.create_new_branch=为此æäº¤åˆ›å»ºä¸€ä¸ª 新的分支 å¹¶å‘èµ·åˆå¹¶è¯·æ±‚。 editor.create_new_branch_np=为此æäº¤åˆ›å»º 新分支。 editor.propose_file_change=æè®®æ–‡ä»¶æ›´æ”¹ @@ -1410,7 +1366,7 @@ editor.new_branch_name=为这次æäº¤çš„æ–°åˆ†æ”¯å‘½å editor.new_branch_name_desc=新的分支å称… editor.cancel=å–æ¶ˆ editor.filename_cannot_be_empty=文件åä¸èƒ½ä¸ºç©ºã€‚ -editor.filename_is_invalid=文件å %s 无效。 +editor.filename_is_invalid=文件å %s 无效 editor.branch_does_not_exist=此仓库中ä¸å­˜åœ¨å为 %s 的分支。 editor.branch_already_exists=此仓库已存在å为 %s 的分支。 editor.directory_is_a_file=%s å·²ç»ä½œä¸ºæ–‡ä»¶å在此仓库中存在。 @@ -1418,7 +1374,7 @@ editor.file_is_a_symlink=`"%s" 是一个符å·é“¾æŽ¥ï¼Œæ— æ³•在 web 编辑器 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=æ‚¨è¦æäº¤çš„æ–‡ä»¶æ˜¯ç©ºçš„ï¼Œç»§ç»­å—? @@ -1439,12 +1395,12 @@ editor.require_signed_commit=分支需è¦ç­¾åæäº¤ editor.cherry_pick=Cherry-pick %s 到: editor.revert=å°† %s 还原到: -commits.desc=æµè§ˆä»£ç ä¿®æ”¹åކå²ã€‚ +commits.desc=æµè§ˆä»£ç ä¿®æ”¹åŽ†å² commits.commits=æ¬¡ä»£ç æäº¤ commits.no_commits=没有共åŒçš„æäº¤ã€‚%s å’Œ %s 的历å²å®Œå…¨ä¸åŒã€‚ commits.nothing_to_compare=这些分支是相åŒçš„。 commits.search=æœç´¢æäº¤åŽ†å² -commits.search.tooltip=您å¯ä»¥åœ¨å…³é”®è¯å‰åŠ ä¸Šå‰ç¼€ï¼Œå¦‚"author:", "committer:", "after:", 或"before:", 例如 "retrin author:Alice before:2019-01-13"。 +commits.search.tooltip=`您å¯ä»¥åœ¨å…³é”®è¯å‰åŠ ä¸Šå‰ç¼€ï¼Œå¦‚"author:", "committer:", "after:", 或"before:", 例如 "retrin author:Alice before:2019-01-13"` commits.find=æœç´¢ commits.search_all=所有分支 commits.author=作者 @@ -1461,7 +1417,7 @@ commits.view_path=在历å²è®°å½•中的此处查看 commit.operations=æ“作 commit.revert=还原 -commit.revert-header=还原:%s +commit.revert-header=还原: %s commit.revert-content=选择è¦è¿˜åŽŸçš„åˆ†æ”¯ï¼š commit.cherry-pick=拣选 commit.cherry-pick-header=Cherry-pick:%s @@ -1477,7 +1433,7 @@ ext_issues.desc=链接到外部工å•跟踪系统。 projects=项目 projects.desc=在项目看æ¿ä¸­ç®¡ç†å·¥å•å’Œåˆå¹¶è¯·æ±‚。 -projects.description=æè¿°ï¼ˆå¯é€‰ï¼‰ +projects.description=æè¿°(å¯é€‰) projects.description_placeholder=æè¿° projects.create=创建项目 projects.title=标题 @@ -1526,16 +1482,16 @@ issues.new=åˆ›å»ºå·¥å• issues.new.title_empty=标题ä¸èƒ½ä¸ºç©º issues.new.labels=标签 issues.new.no_label=未选择标签 -issues.new.clear_labels=清除选中的标签 +issues.new.clear_labels=清除选中标签 issues.new.projects=项目 -issues.new.clear_projects=清除选中的项目 +issues.new.clear_projects=清除项目 issues.new.no_projects=暂无项目 issues.new.open_projects=开放中的项目 issues.new.closed_projects=已关闭的项目 issues.new.no_items=æ— å¯é€‰é¡¹ issues.new.milestone=里程碑 issues.new.no_milestone=未选择里程碑 -issues.new.clear_milestone=清除选中的里程碑 +issues.new.clear_milestone=å–æ¶ˆé€‰ä¸­é‡Œç¨‹ç¢‘ issues.new.open_milestone=开放中的里程碑 issues.new.closed_milestone=已关闭的里程碑 issues.new.assignees=指派æˆå‘˜ @@ -1572,7 +1528,7 @@ issues.change_project_at=修改项目从 %s 到 %s %s issues.remove_milestone_at=`%[2]s 删除了里程碑 %[1]s` issues.remove_project_at=`从 %s 项目 %s 中删除` issues.deleted_milestone=(已删除) -issues.deleted_project=`(已删除)` +issues.deleted_project=`(已删除)` issues.self_assign_at=`于 %s 指派给自己` issues.add_assignee_at=`于 %[2]s 被 %[1]s 指派` issues.remove_assignee_at=`%s å–æ¶ˆäº†æŒ‡æ´¾åœ¨ %s` @@ -1645,24 +1601,24 @@ issues.num_comments=%d æ¡è¯„论 issues.commented_at=`评论于 %s` issues.delete_comment_confirm=您确定è¦åˆ é™¤è¯¥æ¡è¯„论å—? issues.context.copy_link=å¤åˆ¶é“¾æŽ¥ -issues.context.quote_reply=å›žå¤ +issues.context.quote_reply=å¼•ç”¨å›žå¤ issues.context.reference_issue=在新工å•中引用 issues.context.edit=编辑 -issues.context.delete=删除 +issues.context.delete=刪除 issues.no_content=没有æä¾›è¯´æ˜Žã€‚ -issues.close=关闭 +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.reopen_issue=釿–°å¼€æ”¾ issues.reopen_comment_issue=釿–°æ‰“开评论 issues.create_comment=评论 -issues.closed_at=`于%[2]s关闭此工å•` +issues.closed_at=`于 %[2]s 关闭此工å•` issues.reopened_at=`釿–°æ‰“开此问题 %[2]s` -issues.commit_ref_at=`于%[2]såœ¨ä»£ç æäº¤ä¸­å¼•ç”¨äº†è¯¥å·¥å•` +issues.commit_ref_at=`于 %[2]s åœ¨ä»£ç æäº¤ä¸­å¼•ç”¨äº†è¯¥å·¥å•` issues.ref_issue_from=`å¼•ç”¨äº†å·¥å• %[4]s %[2]s` issues.ref_pull_from=`引用了åˆå¹¶è¯·æ±‚ %[4]s %[2]s` -issues.ref_closing_from=`于 %[2]s 从åˆå¹¶è¯·æ±‚ %[4]s引用了此工å•,将关闭此工å•` +issues.ref_closing_from=`于 %[2]s 引用了åˆå¹¶è¯·æ±‚ %[4]s 将关闭此工å•` issues.ref_reopening_from=`于 %[2]s 引用了åˆå¹¶è¯·æ±‚ %[4]s 将釿–°è®¨è®ºæ­¤å·¥å• ` issues.ref_closed_from=`å…³é—­äº†è¿™ä¸ªå·¥å• %[4]s %[2]s` issues.ref_reopened_from=`釿–°æ‰“å¼€è¿™ä¸ªå·¥å• %[4]s %[2]s` @@ -1693,7 +1649,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=命忠‡ç­¾ä¸º scope/item 以使其与其他以 scope/ 开头的标签互斥。 @@ -1740,7 +1696,7 @@ issues.unlock.title=è§£é”æœ‰å…³æ­¤é—®é¢˜çš„对è¯ã€‚ issues.comment_on_locked=您ä¸èƒ½å¯¹é”定的问题å‘表评论。 issues.delete=删除 issues.delete.title=是å¦åˆ é™¤å·¥å•? -issues.delete.text=您真的è¦åˆ é™¤è¿™ä¸ªå·¥å•å—?(该æ“作将会永久删除所有内容。如果您需è¦ä¿ç•™ï¼Œè¯·å…³é—­å®ƒï¼‰ +issues.delete.text=您真的è¦åˆ é™¤è¿™ä¸ªå·¥å•å—?(该æ“作将会永久删除所有内容。如果您需è¦ä¿ç•™ï¼Œè¯·å…³é—­å®ƒ) issues.tracker=时间跟踪 issues.start_tracking_short=å¯åŠ¨è®¡æ—¶å™¨ issues.start_tracking=开始时间跟踪 @@ -1768,7 +1724,7 @@ issues.error_modifying_due_date=修改到期时间失败。 issues.error_removing_due_date=删除到期时间失败。 issues.push_commit_1=于 %[2]s 推é€äº† %[1]d 个æäº¤ issues.push_commits_n=于 %[2]s 推é€äº† %[1]d 个æäº¤ -issues.force_push_codes=`于 %[6]s å¼ºåˆ¶æŽ¨é€ %[1]s,从 %[2]s,至 %[4]s` +issues.force_push_codes=`于 %[6]s å¼ºåˆ¶æŽ¨é€ %[1]s,从 %[2]s,至 %[4]s` issues.force_push_compare=比较 issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=设置到期时间 @@ -1782,7 +1738,7 @@ issues.due_date_remove=于 %[2]s 删除了到期时间 %[1]s issues.due_date_overdue=超期 issues.due_date_invalid=到期日期无效或超出范围。请使用“yyyy-mm-ddâ€æ ¼å¼ã€‚ issues.dependency.title=ä¾èµ–å·¥å• -issues.dependency.issue_no_dependencies=未设置ä¾èµ–项。 +issues.dependency.issue_no_dependencies=没有设置ä¾èµ–项。 issues.dependency.pr_no_dependencies=没有设置ä¾èµ–项。 issues.dependency.no_permission_1=æ‚¨æ²¡æœ‰è¯»å– %d ä¾èµ–关系的æƒé™ issues.dependency.no_permission_n=æ‚¨æ²¡æœ‰è¯»å– %d ä¾èµ–关系的æƒé™ @@ -1820,7 +1776,7 @@ issues.review.dismissed=于 %[2]s å–æ¶ˆäº† %[1]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=于 %[2]s 请求 %[1]s 评审 issues.review.remove_review_request=于 %[2]s å–æ¶ˆå¯¹ %[1]s 的评审请求 @@ -1829,7 +1785,7 @@ issues.review.pending=待定 issues.review.pending.tooltip=此评论目å‰å¯¹å…¶ä»–用户ä¸å¯è§ã€‚ è‹¥è¦æäº¤æ‚¨çš„å¾…å®šè¯„è®ºï¼Œè¯·åœ¨é¡µé¢é¡¶éƒ¨é€‰æ‹© %s -> %s/%s/%s。 issues.review.review=评审 issues.review.reviewers=评审人 -issues.review.outdated=已过时 +issues.review.outdated=已过期 issues.review.outdated_description=评论å‘布åŽå†…容已ç»ä¿®æ”¹ issues.review.option.show_outdated_comments=显示过时的评论 issues.review.option.hide_outdated_comments=éšè—过时的评论 @@ -1837,8 +1793,8 @@ issues.review.show_outdated=显示过时的 issues.review.hide_outdated=éšè—过时的 issues.review.show_resolved=显示已解决的 issues.review.hide_resolved=éšè—已解决的 -issues.review.resolve_conversation=已解决 -issues.review.un_resolve_conversation=未解决 +issues.review.resolve_conversation=已解决问题 +issues.review.un_resolve_conversation=未解决问题 issues.review.resolved_by=标记问题为已解决 issues.assignee.error=å› ä¸ºæœªçŸ¥åŽŸå› ï¼Œå¹¶éžæ‰€æœ‰çš„æŒ‡æ´¾éƒ½æˆåŠŸã€‚ issues.reference_issue.body=内容 @@ -1848,9 +1804,9 @@ issues.content_history.created=创建于 issues.content_history.delete_from_history=从历å²è®°å½•中删除 issues.content_history.delete_from_history_confirm=从历å²è®°å½•中删除å—? issues.content_history.options=选项 -issues.reference_link=引用:%s +issues.reference_link=å‚考:%s -compare.compare_base=基准 +compare.compare_base=基准分支 compare.compare_head=比较 pulls.desc=å¯ç”¨åˆå¹¶è¯·æ±‚和代ç è¯„审。 @@ -1863,7 +1819,7 @@ pulls.allow_edits_from_maintainers_err=更新失败 pulls.compare_changes_desc=选择åˆå¹¶çš„目标分支和æºåˆ†æ”¯ã€‚ pulls.has_viewed_file=已查看 pulls.has_changed_since_last_review=自您上次评审以æ¥å·²æœ‰æ›´æ”¹ -pulls.viewed_files_label=已查看 %[1]d / %[2]d 个文件 +pulls.viewed_files_label=%[1]d / %[2]d 文件已查看 pulls.expand_files=展开所有文件 pulls.collapse_files=æŠ˜å æ‰€æœ‰æ–‡ä»¶ pulls.compare_base=åˆå¹¶åˆ° @@ -1871,7 +1827,7 @@ pulls.compare_compare=拉å–从 pulls.switch_comparison_type=åˆ‡æ¢æ¯”较类型 pulls.switch_head_and_base=åˆ‡æ¢ head å’Œ base pulls.filter_branch=过滤分支 -pulls.no_results=未找到结果。 +pulls.no_results=未找到结果 pulls.show_all_commits=显示所有æäº¤ pulls.show_changes_since_your_last_review=显示自您上次评审以æ¥çš„æ›´æ”¹ pulls.showing_only_single_commit=仅显示æäº¤ %[1]s 的更改 @@ -1882,12 +1838,12 @@ pulls.filter_changes_by_commit=按æäº¤ç­›é€‰ pulls.nothing_to_compare=分支内容相åŒï¼Œæ— éœ€åˆ›å»ºåˆå¹¶è¯·æ±‚。 pulls.nothing_to_compare_have_tag = 所选分支/标签相åŒã€‚ pulls.nothing_to_compare_and_allow_empty_pr=这些分支是相等的,此åˆå¹¶è¯·æ±‚将为空。 -pulls.has_pull_request=这些分支之间的åˆå¹¶è¯·æ±‚已存在:%[2]s#%[3]d +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=于 %[4]s å°† %[1]d æ¬¡ä»£ç æäº¤ä»Ž %[2]såˆå¹¶è‡³ %[3]s pulls.change_target_branch_at=将目标分支从 %s 更改为 %s %s -pulls.tab_conversation=å¯¹è¯ +pulls.tab_conversation=对è¯å†…容 pulls.tab_commits=ä»£ç æäº¤ pulls.tab_files=文件å˜åЍ pulls.reopen_to_merge=è¯·é‡æ–°åˆ›å»ºæ­¤åˆå¹¶è¯·æ±‚。 @@ -1908,9 +1864,9 @@ pulls.files_conflicted=æ­¤åˆå¹¶è¯·æ±‚æœ‰å˜æ›´ä¸Žç›®æ ‡åˆ†æ”¯å†²çªã€‚ pulls.is_checking=正在进行åˆå¹¶å†²çªæ£€æµ‹ï¼Œè¯·ç¨åŽå†è¯•。 pulls.is_ancestor=此分支已ç»åŒ…å«åœ¨ç›®æ ‡åˆ†æ”¯ä¸­ï¼Œæ²¡æœ‰æ›´æ”¹å¯ä»¥åˆå¹¶ã€‚ pulls.is_empty=此分支上的更改已ç»åœ¨ç›®æ ‡åˆ†æ”¯ä¸Šã€‚这将是一个空æäº¤ã€‚ -pulls.required_status_check_failed=一些必è¦çš„æ£€æŸ¥æ²¡æœ‰æˆåŠŸã€‚ +pulls.required_status_check_failed=一些必è¦çš„æ£€æŸ¥æ²¡æœ‰æˆåŠŸ pulls.required_status_check_missing=缺少一些必è¦çš„æ£€æŸ¥ã€‚ -pulls.required_status_check_administrator=作为管ç†å‘˜ï¼Œæ‚¨ä»å¯åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚。 +pulls.required_status_check_administrator=作为管ç†å‘˜ï¼Œæ‚¨ä»å¯åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚ pulls.blocked_by_approvals=æ­¤åˆå¹¶è¯·æ±‚当å‰è¿˜æ²¡æœ‰é€šè¿‡å®¡æ‰¹ã€‚已获å–审批数%d个,共需è¦å®¡æ‰¹æ•°%d个。 pulls.blocked_by_rejection=æ­¤åˆå¹¶è¯·æ±‚有官方评审员请求的更改。 pulls.blocked_by_official_review_requests=æ­¤åˆå¹¶è¯·æ±‚需è¦ä¸€å或多å评审员审阅批准。 @@ -1919,7 +1875,7 @@ pulls.blocked_by_changed_protected_files_1=æ­¤åˆå¹¶è¯·æ±‚因修改了下列被 pulls.blocked_by_changed_protected_files_n=æ­¤åˆå¹¶è¯·æ±‚å› ä¿®æ”¹äº†ä¸‹åˆ—è¢«ä¿æŠ¤çš„æ–‡ä»¶è€Œè¢«é˜»æ­¢ï¼š pulls.can_auto_merge_desc=该åˆå¹¶è¯·æ±‚å¯ä»¥è¿›è¡Œè‡ªåЍåˆå¹¶æ“作。 pulls.cannot_auto_merge_desc=该åˆå¹¶è¯·æ±‚存在冲çªï¼Œæ— æ³•进行自动åˆå¹¶æ“作。 -pulls.cannot_auto_merge_helper=手动åˆå¹¶ä»¥è§£å†³å†²çªã€‚ +pulls.cannot_auto_merge_helper=手动åˆå¹¶è§£å†³æ­¤å†²çª pulls.num_conflicting_files_1=%d ä¸ªå†²çªæ–‡ä»¶ pulls.num_conflicting_files_n=%d ä¸ªå†²çªæ–‡ä»¶ pulls.approve_count_1=%d 项批准 @@ -1955,7 +1911,7 @@ pulls.has_merged=失败:åˆå¹¶è¯·æ±‚å·²ç»è¢«åˆå¹¶ï¼Œæ‚¨ä¸èƒ½å†æ¬¡åˆå¹¶æˆ– pulls.push_rejected=åˆå¹¶å¤±è´¥ï¼šæŽ¨é€è¢«æ‹’ç»ã€‚请查看此仓库的 Git é’©å­ã€‚ pulls.push_rejected_summary=详细拒ç»ä¿¡æ¯ pulls.push_rejected_no_message=推é€å¤±è´¥ï¼šæ­¤æŽ¨é€è¢«æ‹’ç»ä½†æœªæä¾›å…¶ä»–ä¿¡æ¯ã€‚请检查此仓库的 Git é’©å­ -pulls.open_unmerged_pull_exists=`您ä¸èƒ½æ‰§è¡Œé‡æ–°æ‰“å¼€æ“作, 因为已ç»å­˜åœ¨ç›¸åŒçš„åˆå¹¶è¯·æ±‚(#%d)。` +pulls.open_unmerged_pull_exists=`您ä¸èƒ½æ‰§è¡Œé‡æ–°æ‰“å¼€æ“作, 因为已ç»å­˜åœ¨ç›¸åŒçš„åˆå¹¶è¯·æ±‚ (#%d)。` pulls.status_checking=一些检测ä»åœ¨ç­‰å¾…è¿è¡Œ pulls.status_checks_success=æ‰€æœ‰æ£€æµ‹å‡æˆåŠŸ pulls.status_checks_warning=一些检查报告了警告 @@ -1971,17 +1927,17 @@ pulls.update_branch_success=分支更新æˆåŠŸ pulls.update_not_allowed=æ‚¨æ— æƒæ›´æ–°åˆ†æ”¯ pulls.outdated_with_base_branch=此分支相比基础分支已过期 pulls.close=关闭 -pulls.closed_at=`于%[2]s关闭此åˆå¹¶è¯·æ±‚ ` +pulls.closed_at=`于 %[2]s 关闭此åˆå¹¶è¯·æ±‚ ` pulls.reopened_at=`釿–°æ‰“开此åˆå¹¶è¯·æ±‚ %[2]s` pulls.cmd_instruction_hint=查看命令行说明 pulls.cmd_instruction_checkout_title=检出 pulls.cmd_instruction_checkout_desc=ä»Žä½ çš„ä»“åº“ä¸­æ£€å‡ºä¸€ä¸ªæ–°çš„åˆ†æ”¯å¹¶æµ‹è¯•å˜æ›´ã€‚ pulls.cmd_instruction_merge_title=åˆå¹¶ -pulls.cmd_instruction_merge_desc=åˆå¹¶æ›´æ”¹å¹¶åœ¨ Forgejo 上更新。 +pulls.cmd_instruction_merge_desc=åˆå¹¶å˜æ›´å¹¶æ›´æ–°åˆ° Gitea 上 pulls.clear_merge_message=清除åˆå¹¶ä¿¡æ¯ pulls.clear_merge_message_hint=清除åˆå¹¶æ¶ˆæ¯åªä¼šåˆ é™¤æäº¤æ¶ˆæ¯å†…容,并ä¿ç•™ç”Ÿæˆçš„ git 附加内容,如“Co-Authored-By …â€ã€‚ -pulls.auto_merge_button_when_succeed=(当检查æˆåŠŸæ—¶ï¼‰ +pulls.auto_merge_button_when_succeed=(当检查æˆåŠŸæ—¶) pulls.auto_merge_when_succeed=在所有检查æˆåŠŸåŽè‡ªåЍåˆå¹¶ pulls.auto_merge_newly_scheduled=åˆå¹¶è¯·æ±‚计划在所有检查æˆåŠŸåŽåˆå¹¶ã€‚ pulls.auto_merge_has_pending_schedule=%[1]s 安排此拉å–请求在所有检查æˆåŠŸæ—¶è‡ªåŠ¨åˆå¹¶ %[2]s。 @@ -1994,11 +1950,11 @@ pulls.auto_merge_newly_scheduled_comment=`已安排此拉å–请求在所有检 pulls.auto_merge_canceled_schedule_comment=`已喿¶ˆå½“所有检查æˆåŠŸåŽè‡ªåЍåˆå¹¶æ­¤æ‹‰å–请求 %[1]s` pulls.delete.title=删除此拉å–请求? -pulls.delete.text=你真的è¦åˆ é™¤è¿™ä¸ªæ‹‰å–请求å—?(这将永久删除所有内容。如果你打算将内容存档,请考虑关闭它) +pulls.delete.text=你真的è¦åˆ é™¤è¿™ä¸ªæ‹‰å–请求å—? (这将永久删除所有内容。如果你打算将内容存档,请考虑关闭它) pulls.recently_pushed_new_branches=您已于%[2]s推é€äº†åˆ†æ”¯ %[1]s -pull.deleted_branch=(已删除):%s +pull.deleted_branch=(已删除): %s milestones.new=新的里程碑 milestones.closed=于 %s关闭 @@ -2050,7 +2006,7 @@ ext_wiki.desc=链接到外部 wiki。 wiki=百科 wiki.welcome=欢迎æ¥åˆ°ç™¾ç§‘。 wiki.welcome_desc=百科å…许你撰写并与å作者分享文档。 -wiki.desc=撰写并与å作者共享文档。 +wiki.desc=撰写和与å作者分享文档 wiki.create_first_page=åˆ›å»ºç¬¬ä¸€ä¸ªé¡µé¢ wiki.page=é¡µé¢ wiki.filter_page=è¿‡æ»¤é¡µé¢ @@ -2091,12 +2047,12 @@ activity.merged_prs_count_1=å·²åˆå¹¶çš„åˆå¹¶è¯·æ±‚ activity.merged_prs_count_n=å·²åˆå¹¶çš„åˆå¹¶è¯·æ±‚ activity.opened_prs_count_1=æ–°åˆå¹¶è¯·æ±‚ activity.opened_prs_count_n=æ–°åˆå¹¶è¯·æ±‚ -activity.title.user_1=%d å用户 -activity.title.user_n=%d å用户 +activity.title.user_1=%d 用户 +activity.title.user_n=%d 用户 activity.title.prs_1=%d 个åˆå¹¶è¯·æ±‚ activity.title.prs_n=%d 个åˆå¹¶è¯·æ±‚ -activity.title.prs_merged_by=%[2]s å…±åˆå¹¶äº† %[1]s -activity.title.prs_opened_by=%[2]s 共创建了 %[1]s +activity.title.prs_merged_by=%[2]s ç”± %[1]s åˆå¹¶ +activity.title.prs_opened_by=%[2]s 创建了 %[1]s activity.merged_prs_label=å·²åˆå¹¶ activity.opened_prs_label=已创建 activity.active_issues_count_1=%d é¡¹æ´»åŠ¨çš„å·¥å• @@ -2105,8 +2061,8 @@ activity.closed_issues_count_1=å·²å…³é—­çš„å·¥å• activity.closed_issues_count_n=å·²å…³é—­çš„å·¥å• activity.title.issues_1=%d é¡¹å·¥å• activity.title.issues_n=%d é¡¹å·¥å• -activity.title.issues_closed_from=%[2]s 共关闭了 %[1]s -activity.title.issues_created_by=%[2]s 共创建了 %[1]s +activity.title.issues_closed_from=%s 从 %s 被关闭 +activity.title.issues_created_by=%[2]s 创建了 %[1]s activity.closed_issue_label=已关闭 activity.new_issues_count_1=æ–°å·¥å• activity.new_issues_count_n=æ–°å·¥å• @@ -2117,33 +2073,33 @@ activity.unresolved_conv_desc=这些最近更新的工å•å’Œåˆå¹¶è¯·æ±‚还没 activity.unresolved_conv_label=打开 activity.title.releases_1=%d 个版本å‘布 activity.title.releases_n=%d 个版本å‘布 -activity.title.releases_published_by=%[2]s å…±å‘布了 %[1]s +activity.title.releases_published_by=%[2]s å‘布了 %[1]s activity.published_release_label=版本å‘布 activity.no_git_activity=在此期间没有任何æäº¤æ´»åŠ¨ã€‚ -activity.git_stats_exclude_merges=除去åˆå¹¶æäº¤ä»¥å¤–, -activity.git_stats_author_1=%d å作者 -activity.git_stats_author_n=%d å作者 -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_exclude_merges=排除åˆå¹¶ï¼Œ +activity.git_stats_author_1=%d 作者 +activity.git_stats_author_n=%d 作者 +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_all_branches=到所有分支。 -activity.git_stats_on_default_branch=在 %s 分支上, -activity.git_stats_file_1=%d 个文件 -activity.git_stats_file_n=%d 个文件 -activity.git_stats_files_changed_1=被改动 -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_deletion_1=%d 行被删除 -activity.git_stats_deletion_n=%d 行被删除 +activity.git_stats_on_default_branch=在 %s 上, +activity.git_stats_file_1=%d 文件 +activity.git_stats_file_n=%d 文件 +activity.git_stats_files_changed_1=å·²ç»æ”¹å˜ +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_deletion_1=删除 %d 行 +activity.git_stats_deletion_n=删除 %d 行 contributors.contribution_type.filter_label=贡献类型: contributors.contribution_type.commits=æäº¤ -contributors.contribution_type.additions=增加 +contributors.contribution_type.additions=更多 contributors.contribution_type.deletions=删除 search=æœç´¢ @@ -2183,7 +2139,7 @@ settings.mirror_settings.docs.doc_link_title=如何镜åƒä»“库? settings.mirror_settings.docs.doc_link_pull_section=文档中的 “从远程仓库拉å–†部分。 settings.mirror_settings.docs.pulling_remote_title=从远程仓库拉å–ä»£ç  settings.mirror_settings.mirrored_repository=镜åƒåº“ -settings.mirror_settings.pushed_repository = 推é€åˆ°çš„仓库 +settings.mirror_settings.pushed_repository = 已推é€çš„仓库 settings.mirror_settings.direction=æ–¹å‘ settings.mirror_settings.direction.pull=æ‹‰å– settings.mirror_settings.direction.push=æŽ¨é€ @@ -2207,16 +2163,16 @@ settings.wiki_desc=å¯ç”¨ä»“库百科 settings.use_internal_wiki=使用内置百科 settings.use_external_wiki=使用外部百科 settings.external_wiki_url=外部百科链接 -settings.external_wiki_url_error=å¤–éƒ¨ç™¾ç§‘é“¾æŽ¥ä¸æ˜¯æœ‰æ•ˆçš„ URL。 +settings.external_wiki_url_error=外部百科链接无效 settings.external_wiki_url_desc=当点击百科标签时,访问者将被é‡å®šå‘到外部百科系统的URL。 settings.issues_desc=å¯ç”¨ä»“库工å•系统 settings.use_internal_issue_tracker=使用内置的工å•系统 settings.use_external_issue_tracker=使用外部的工å•系统 settings.external_tracker_url=外部工å•系统 URL -settings.external_tracker_url_error=外部百科链接无效。 +settings.external_tracker_url_error=外部百科链接无效 settings.external_tracker_url_desc=å½“ç‚¹å‡»å·¥å•æ ‡ç­¾æ—¶ï¼Œè®¿é—®è€…将被é‡å®šå‘到外部工å•系统的URL。 settings.tracker_url_format=外部工å•系统的 URL æ ¼å¼ -settings.tracker_url_format_error=外部工å•追踪器链接无效。 +settings.tracker_url_format_error=外部工å•链接无效 settings.tracker_issue_style=外部工å•ç³»ç»Ÿçš„ç¼–å·æ ¼å¼ settings.tracker_issue_style.numeric=çº¯æ•°å­—å½¢å¼ settings.tracker_issue_style.alphanumeric=è‹±æ–‡å­—æ¯æ•°å­—组åˆå½¢å¼ @@ -2228,7 +2184,7 @@ settings.enable_timetracker=å¯ç”¨æ—¶é—´è·Ÿè¸ª settings.allow_only_contributors_to_track_time=ä»…å…许æˆå‘˜è·Ÿè¸ªæ—¶é—´ settings.pulls_desc=å¯ç”¨åˆå¹¶è¯·æ±‚ settings.pulls.ignore_whitespace=å¿½ç•¥ç©ºæ ¼å†²çª -settings.pulls.enable_autodetect_manual_merge=å¯ç”¨è‡ªåŠ¨æ£€æµ‹æ‰‹åŠ¨åˆå¹¶ï¼ˆæ³¨æ„:在æŸäº›ç‰¹æ®Šæƒ…况下å¯èƒ½å‘生错误判断) +settings.pulls.enable_autodetect_manual_merge=å¯ç”¨è‡ªåŠ¨æ£€æµ‹æ‰‹åŠ¨åˆå¹¶ (注æ„:在æŸäº›ç‰¹æ®Šæƒ…况下å¯èƒ½å‘生错误判断) settings.pulls.allow_rebase_update=å…许通过å˜åŸºæ›´æ–°æ‹‰å–请求分支 settings.pulls.default_delete_branch_after_merge=默认åˆå¹¶åŽåˆ é™¤åˆå¹¶è¯·æ±‚分支 settings.pulls.default_allow_edits_from_maintainers=默认开å¯å…许维护者编辑 @@ -2237,7 +2193,7 @@ 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_enable_health_check=å¯ç”¨ä»“库å¥åº·æ£€æŸ¥ (git fsck) settings.admin_code_indexer=代ç ç´¢å¼•器 settings.admin_stats_indexer=代ç ç»Ÿè®¡ç´¢å¼•器 settings.admin_indexer_commit_sha=上次索引的æäº¤ @@ -2267,8 +2223,8 @@ settings.transfer_desc=您å¯ä»¥å°†ä»“库转移至您拥有管ç†å‘˜æƒé™çš„å¸ settings.transfer_form_title=输入仓库å称以åšç¡®è®¤: settings.transfer_in_progress=当剿­£åœ¨è¿›è¡Œè½¬è®©ã€‚ 如果你想将此代ç åº“转让给å¦ä¸€ä¸ªç”¨æˆ·ï¼Œè¯·å–消它。 settings.transfer_notices_1=- 如果将此仓库转移给其他用户, 您将失去对此仓库的访问æƒé™ã€‚ -settings.transfer_notices_2=-如果将其转移到您(共åŒï¼‰ 拥有的组织,您å¯ä»¥ç»§ç»­è®¿é—®è¯¥ä»“库。 -settings.transfer_notices_3=- å¦‚æžœä»“åº“æ˜¯ç§æœ‰çš„并且被转移给æŸä¸ªç”¨æˆ·ï¼Œé‚£ä¹ˆæ­¤æ“作å¯ä»¥ç¡®ä¿è¯¥ç”¨æˆ·è‡³å°‘具有读æƒé™ï¼ˆä»¥åŠå¿…è¦æ—¶çš„æ›´æ”¹æƒé™ï¼‰ã€‚ +settings.transfer_notices_2=-如果将其转移到您 (å…±åŒ) 拥有的组织,您å¯ä»¥ç»§ç»­è®¿é—®è¯¥ä»“库。 +settings.transfer_notices_3=- å¦‚æžœä»“åº“æ˜¯ç§æœ‰çš„并且被转移给æŸä¸ªç”¨æˆ·ï¼Œé‚£ä¹ˆæ­¤æ“作å¯ä»¥ç¡®ä¿è¯¥ç”¨æˆ·è‡³å°‘具有读æƒé™(以åŠå¿…è¦æ—¶çš„æ›´æ”¹æƒé™)。 settings.transfer_owner=新拥有者 settings.transfer_perform=执行转让 settings.transfer_started=该代ç åº“已被标记为转让并等待æ¥è‡ª %s 的确认 @@ -2279,10 +2235,10 @@ 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.collaborator.desc=此仓库中å作者的有效签å将被标记为「å¯ä¿¡ã€(æ— è®ºå®ƒä»¬æ˜¯å¦æ˜¯æäº¤è€…),签ååªç¬¦åˆæäº¤è€…时将标记为「ä¸å¯ä¿¡ã€ï¼Œéƒ½ä¸åŒ¹é…时标记为「ä¸åŒ¹é…ã€ã€‚ settings.trust_model.committer=æäº¤è€… -settings.trust_model.committer.long=æäº¤è€…:信任与æäº¤è€…相符的签å(此特性类似 GitHub,这会强制采用 Forgejo 作为æäº¤è€…和签å者) -settings.trust_model.committer.desc=有效签ååªæœ‰å’Œæäº¤è€…ç›¸åŒ¹é…æ‰ä¼šè¢«æ ‡è®°ä¸ºâ€œå—ä¿¡ä»»â€ï¼Œå¦åˆ™å®ƒä»¬å°†è¢«æ ‡è®°ä¸ºâ€œä¸åŒ¹é…â€ã€‚这强制 Forgejo æˆä¸ºç­¾åæäº¤çš„æäº¤è€…,而实际æäº¤è€…被加上 Co-authored-by:和 Co-committed-by:的标记。 默认的 Forgejo å¯†é’¥å¿…é¡»åŒ¹é…æ•°æ®åº“中的一å用户。 +settings.trust_model.committer.long=æäº¤è€…: 信任与æäº¤è€…相符的签å (此特性类似 GitHub,这会强制采用 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.desc=此仓库中å作者的有效签ååœ¨ä»–åŒæ—¶æ˜¯æäº¤è€…时将被标记为「å¯ä¿¡ã€ï¼Œç­¾ååªåŒ¹é…了æäº¤è€…时将标记为「ä¸å¯ä¿¡ã€ï¼Œéƒ½ä¸åŒ¹é…时标记为「ä¸åŒ¹é…ã€ã€‚这会强制 Forgejo æˆä¸ºç­¾å者和æäº¤è€…,实际的æäº¤è€…将被标记于æäº¤æ¶ˆæ¯ç»“尾处的「Co-Authored-By:ã€å’Œã€ŒCo-Committed-By:ã€ã€‚默认的 Forgejo ç­¾åå¯†é’¥å¿…é¡»åŒ¹é…æ•°æ®åº“中的一个用户密钥。 @@ -2293,7 +2249,7 @@ settings.confirm_wiki_delete=åˆ é™¤ç™¾ç§‘æ•°æ® settings.wiki_deletion_success=å·²æˆåŠŸåˆ é™¤ä»“åº“ç™¾ç§‘æ•°æ®ã€‚ settings.delete=删除本仓库 settings.delete_desc=删除仓库是永久性的, 无法撤消。 -settings.delete_notices_1=- æ­¤æ“作ä¸å¯è¢«å›žæ»šã€‚ +settings.delete_notices_1=- æ­¤æ“作 ä¸å¯ä»¥ 被回滚。 settings.delete_notices_2=- æ­¤æ“作将永久删除仓库 %s,包括 Git æ•°æ®ã€ å·¥å•ã€è¯„论ã€ç™¾ç§‘å’Œå作者的æ“作æƒé™ã€‚ settings.delete_notices_fork_1=- 在此仓库删除åŽï¼Œå®ƒçš„æ´¾ç”Ÿä»“åº“å°†å˜æˆç‹¬ç«‹ä»“库。 settings.deletion_success=仓库已被删除。 @@ -2326,7 +2282,7 @@ settings.add_webhook.invalid_channel_name=Webhook 通é“åç§°ä¸èƒ½ä¸ºç©ºä¸”ä¸ settings.hooks_desc=当Forgejo事件å‘生时,Webé’©å­è‡ªåЍå‘出HTTP POST请求。在 æŒ‡å— ä¸­é˜…è¯»æ›´å¤šå†…å®¹ã€‚ settings.webhook_deletion=删除 Web é’©å­ settings.webhook_deletion_desc=删除 webé’©å­ å°†åˆ é™¤å…¶è®¾ç½®å’ŒåŽ†å²è®°å½•。继续? -settings.webhook_deletion_success=Web é’©å­å·²ç§»é™¤ã€‚ +settings.webhook_deletion_success=Web é’©å­åˆ é™¤æˆåŠŸï¼ settings.webhook.test_delivery=æµ‹è¯•æŽ¨é€ settings.webhook.test_delivery_desc=用å‡äº‹ä»¶æµ‹è¯•这个 webé’©å­ã€‚ settings.webhook.test_delivery_desc_disabled=è¦ç”¨ 虚å‡äº‹ä»¶ 测试这个Webhook,请激活它。 @@ -2359,8 +2315,8 @@ settings.event_send_everything=所有事件 settings.event_choose=自定义事件… settings.event_header_repository=仓库事件 settings.event_create=创建 -settings.event_create_desc=创建分支或标签。 -settings.event_delete=删除 +settings.event_create_desc=创建分支或标签 +settings.event_delete=刪除 settings.event_delete_desc=分支或标签已删除。 settings.event_fork=派生 settings.event_fork_desc=仓库被派生。 @@ -2369,9 +2325,9 @@ settings.event_wiki_desc=创建ã€é‡å‘½åã€ç¼–辑或删除了百科页é¢ã€‚ settings.event_release=版本å‘布 settings.event_release_desc=å‘å¸ƒã€æ›´æ–°æˆ–删除版本时。 settings.event_push=æŽ¨é€ -settings.event_push_desc=推é€åˆ° Git 仓库。 +settings.event_push_desc=Git ä»“åº“æŽ¨é€ settings.event_repository=仓库 -settings.event_repository_desc=创建或删除仓库。 +settings.event_repository_desc=创建或删除仓库 settings.event_header_issue=å·¥å•事件 settings.event_issues=修改 settings.event_issues_desc=å·¥å•已打开ã€å·²å…³é—­ã€å·²é‡æ–°æ‰“开或已编辑。 @@ -2382,7 +2338,7 @@ 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_issue_comment_desc=å·¥å•评论被创建ã€ç¼–辑或删除 settings.event_header_pull_request=åˆå¹¶è¯·æ±‚事件 settings.event_pull_request=修改 settings.event_pull_request_desc=åˆå¹¶è¯·æ±‚被打开ã€è¢«å…³é—­ã€è¢«é‡æ–°æ‰“开或被编辑。 @@ -2399,7 +2355,7 @@ 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_request_desc=åˆå¹¶è¯·æ±‚è¯„å®¡å·²è¯·æ±‚æˆ–å·²å–æ¶ˆ settings.event_pull_request_approvals=åˆå¹¶è¯·æ±‚批准 settings.event_pull_request_merge=åˆå¹¶è¯·æ±‚åˆå¹¶ settings.event_package=软件包 @@ -2407,12 +2363,12 @@ settings.event_package_desc=软件包已在仓库中被创建或删除。 settings.branch_filter=分支过滤 settings.branch_filter_desc=推é€ã€åˆ›å»ºï¼Œåˆ é™¤åˆ†æ”¯äº‹ä»¶çš„分支白åå•,使用 glob 模å¼åŒ¹é…指定。若为空或 *ï¼Œåˆ™å°†æŠ¥å‘Šæ‰€æœ‰åˆ†æ”¯çš„äº‹ä»¶ã€‚è¯­æ³•æ–‡æ¡£è§ %[2]s。示例:master,{master,release*}。 settings.authorization_header=æŽˆæƒæ ‡å¤´ -settings.authorization_header_desc=å½“å­˜åœ¨æ—¶å°†è¢«ä½œä¸ºæŽˆæƒæ ‡å¤´åŒ…å«åœ¨å†…。例如:%s。 +settings.authorization_header_desc=å½“å­˜åœ¨æ—¶å°†è¢«ä½œä¸ºæŽˆæƒæ ‡å¤´åŒ…å«åœ¨å†…。例如: %s。 settings.active=激活 settings.active_helper=触å‘事件的信æ¯å°†å‘é€åˆ°æ­¤ webhook 网å€ã€‚ -settings.add_hook_success=Web é’©å­å·²æ·»åŠ ã€‚ +settings.add_hook_success=Web é’©å­æ·»åŠ æˆåŠŸï¼ settings.update_webhook=æ›´æ–° Web é’©å­ -settings.update_hook_success=Web é’©å­å·²æ›´æ–°ã€‚ +settings.update_hook_success=Web é’©å­æ›´æ–°æˆåŠŸï¼ settings.delete_webhook=删除 Web é’©å­ settings.recent_deliveries=最近推é€è®°å½• settings.hook_type=é’©å­ç±»åž‹ @@ -2446,7 +2402,7 @@ settings.no_deploy_keys=没有部署密钥。 settings.title=标题 settings.deploy_key_content=密钥文本 settings.key_been_used=具有相åŒå†…容的部署密钥已在使用中。 -settings.key_name_used=使用相åŒå称的部署密钥已ç»å­˜åœ¨ã€‚ +settings.key_name_used=使用相åŒå称的部署密钥已ç»å­˜åœ¨ï¼ settings.add_key_success=部署密钥 %s 添加æˆåŠŸã€‚ settings.deploy_key_deletion=删除部署密钥 settings.deploy_key_deletion_desc=åˆ é™¤éƒ¨ç½²å¯†é’¥å°†å–æ¶ˆæ­¤å¯†é’¥å¯¹æ­¤ä»“库的访问æƒé™ã€‚继续? @@ -2464,11 +2420,11 @@ settings.protect_this_branch_desc=阻止删除并é™åˆ¶Git推é€å’Œåˆå¹¶åˆ°åˆ† settings.protect_disable_push=ç¦ç”¨æŽ¨é€ settings.protect_disable_push_desc=此分支ä¸å…许推é€ã€‚ settings.protect_enable_push=å¯ç”¨æŽ¨é€ -settings.protect_enable_push_desc=任何拥有写访问æƒé™çš„人将被å…许推é€åˆ°æ­¤åˆ†æ”¯ï¼ˆä½†ä¸èƒ½å¼ºè¡ŒæŽ¨é€ï¼‰ã€‚ +settings.protect_enable_push_desc=任何拥有写访问æƒé™çš„人将被å…许推é€åˆ°æ­¤åˆ†æ”¯(但ä¸èƒ½å¼ºè¡ŒæŽ¨é€)。 settings.protect_enable_merge=å¯ç”¨åˆå¹¶ settings.protect_enable_merge_desc=任何具有写入æƒé™çš„人都å¯ä»¥å°†åˆå¹¶è¯·æ±‚åˆå¹¶åˆ°æ­¤åˆ†æ”¯ä¸­ã€‚ settings.protect_whitelist_committers=å—白åå•é™åˆ¶çš„æŽ¨é€ -settings.protect_whitelist_committers_desc=åªæœ‰åˆ—入白åå•的用户或团队æ‰èƒ½è¢«å…许推é€åˆ°æ­¤åˆ†æ”¯ï¼ˆä½†ä¸èƒ½å¼ºè¡ŒæŽ¨é€ï¼‰ã€‚ +settings.protect_whitelist_committers_desc=åªæœ‰åˆ—入白åå•的用户或团队æ‰èƒ½è¢«å…许推é€åˆ°æ­¤åˆ†æ”¯(但ä¸èƒ½å¼ºè¡ŒæŽ¨é€)。 settings.protect_whitelist_deploy_keys=å°†å…·æœ‰æŽ¨é€æƒé™çš„部署密钥加入白åå•。 settings.protect_whitelist_users=推é€ç™½åå•用户 settings.protect_whitelist_search_users=æœç´¢ç”¨æˆ·... @@ -2497,14 +2453,14 @@ settings.dismiss_stale_approvals_desc=当新的æäº¤æ›´æ”¹åˆå¹¶è¯·æ±‚内容被 settings.ignore_stale_approvals = 忽略过时的批准 settings.ignore_stale_approvals_desc = ä¸å°†æ—§çš„æäº¤ï¼ˆé™ˆæ—§çš„评审)计入已批准的åˆå¹¶è¯·æ±‚æ•°é‡ã€‚æ³¨ï¼šå¦‚è¿‡æœŸçš„è¯„å®¡å·²è¢«å–æ¶ˆï¼Œåˆ™æ— éœ€è®¾ç½®ã€‚ settings.require_signed_commits=需è¦ç­¾åæäº¤ -settings.require_signed_commits_desc=æ‹’ç»æŽ¨é€æœªç­¾å或无法验è¯çš„æäº¤åˆ°æ­¤åˆ†æ”¯ã€‚ +settings.require_signed_commits_desc=æ‹’ç»æŽ¨é€æœªç­¾å或无法验è¯çš„æäº¤åˆ°åˆ†æ”¯ 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=å³ä½¿ç”¨æˆ·æœ‰æƒæ·»åŠ ã€ç¼–辑或删除此分支中的文件,也ä¸å…许直接更改å—ä¿æŠ¤çš„æ–‡ä»¶ã€‚ å¯ä»¥ä½¿ç”¨åŠè§’分å·ï¼ˆâ€œ;â€ï¼‰åˆ†éš”多个模å¼ã€‚ è§%[2]s文档了解模å¼è¯­æ³•。例如:.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.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 æ›´æ–°æˆåŠŸã€‚ @@ -2522,7 +2478,7 @@ settings.default_branch_desc=请选择一个默认的分支用于åˆå¹¶è¯·æ±‚å’Œ settings.merge_style_desc=åˆå¹¶æ–¹å¼ settings.default_merge_style_desc=默认åˆå¹¶æ–¹å¼ settings.choose_branch=选择一个分支… -settings.no_protected_branch=没有分支å—åˆ°ä¿æŠ¤ã€‚ +settings.no_protected_branch=没有å—ä¿æŠ¤çš„åˆ†æ”¯ settings.edit_protected_branch=编辑 settings.protected_branch_required_rule_name=必须填写规则åç§° settings.protected_branch_duplicate_rule_name=这些分支已设有规则 @@ -2535,7 +2491,7 @@ settings.tags.protection.allowed.users=å…è®¸çš„è´¦å· settings.tags.protection.allowed.teams=å…许的团队 settings.tags.protection.allowed.noone=æ—  settings.tags.protection.create=添加规则 -settings.tags.protection.none=没有Git标签å—åˆ°ä¿æŠ¤ã€‚ +settings.tags.protection.none=没有å—ä¿æŠ¤çš„Git标签 settings.tags.protection.pattern.description=ä½ å¯ä»¥ä½¿ç”¨å•个å称或 glob 模å¼åŒ¹é…æˆ–æ­£åˆ™è¡¨è¾¾å¼æ¥åŒ¹é…多个标签。了解详情请访问 å—ä¿æŠ¤Git标签指å—。 settings.bot_token=机器人令牌 settings.chat_id=èŠå¤© ID @@ -2543,20 +2499,20 @@ settings.thread_id=线程 ID settings.matrix.homeserver_url=主æœåŠ¡å™¨ç½‘å€ settings.matrix.room_id=房间ID settings.matrix.message_type=消æ¯ç±»åž‹ -settings.archive.button=存档仓库 -settings.archive.header=存档此仓库 -settings.archive.text=存档仓库将使其完全åªè¯»ã€‚它将在首页éšè—。没有人(甚至包括你ï¼ï¼‰èƒ½å¤Ÿè¿›è¡Œæ–°çš„æäº¤ï¼Œæˆ–打开工å•åŠåˆå¹¶è¯·æ±‚。 -settings.archive.success=仓库已æˆåŠŸå­˜æ¡£ã€‚ -settings.archive.error=仓库在存档时出现异常。请通过日志获å–详细信æ¯ã€‚ -settings.archive.error_ismirror=ä¸èƒ½å­˜æ¡£é•œåƒä»“库。 -settings.archive.branchsettings_unavailable=分支设置对已存档的仓库ä¸å¯ç”¨ã€‚ -settings.archive.tagsettings_unavailable=标签设置对已存档的仓库ä¸å¯ç”¨ã€‚ -settings.archive.mirrors_unavailable = 镜åƒå¯¹å·²å­˜æ¡£çš„仓库ä¸å¯ç”¨ã€‚ -settings.unarchive.button=撤销仓库存档 -settings.unarchive.header=撤销此仓库存档 -settings.unarchive.text=撤销存档将æ¢å¤ä»“库接收æäº¤ã€æŽ¨é€ï¼Œä»¥åŠæ–°å·¥å•å’Œåˆå¹¶è¯·æ±‚的能力。 -settings.unarchive.success=仓库已æˆåŠŸæ’¤é”€å­˜æ¡£ã€‚ -settings.unarchive.error=ä»“åº“åœ¨å–æ¶ˆå­˜æ¡£æ—¶å‡ºçŽ°å¼‚å¸¸ã€‚è¯·é€šè¿‡æ—¥å¿—èŽ·å–详细信æ¯ã€‚ +settings.archive.button=归档仓库 +settings.archive.header=归档此仓库 +settings.archive.text=归档仓库将使其完全åªè¯»ã€‚它将在首页éšè—。没有人(甚至你ï¼ï¼‰èƒ½å¤Ÿè¿›è¡Œæ–°çš„æäº¤ï¼Œæˆ–打开工å•åŠåˆå¹¶è¯·æ±‚。 +settings.archive.success=仓库已æˆåŠŸå½’æ¡£ã€‚ +settings.archive.error=仓库在归档时出现异常。请通过日志获å–详细信æ¯ã€‚ +settings.archive.error_ismirror=请ä¸è¦å¯¹é•œåƒä»“åº“å½’æ¡£ï¼Œè°¢è°¢ï¼ +settings.archive.branchsettings_unavailable=已归档仓库无法进行分支设置。 +settings.archive.tagsettings_unavailable=已归档仓库的Git标签设置ä¸å¯ç”¨ã€‚ +settings.archive.mirrors_unavailable = ä¸èƒ½é•œåƒå·²å½’档的仓库。 +settings.unarchive.button=撤销仓库归档 +settings.unarchive.header=撤销此仓库归档 +settings.unarchive.text=撤销归档将æ¢å¤ä»“库接收æäº¤ã€æŽ¨é€ï¼Œä»¥åŠæ–°å·¥å•å’Œåˆå¹¶è¯·æ±‚的能力。 +settings.unarchive.success=仓库已æˆåŠŸæ’¤é”€å½’æ¡£ã€‚ +settings.unarchive.error=ä»“åº“åœ¨å–æ¶ˆå½’档时出现异常。请通过日志获å–详细信æ¯ã€‚ settings.update_avatar_success=仓库头åƒå·²ç»æ›´æ–°ã€‚ settings.lfs=LFS settings.lfs_filelist=存储在此仓库中的 LFS 文件 @@ -2572,11 +2528,11 @@ 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=å¼ºåˆ¶è§£é” -settings.lfs_pointers.found=找到 %d ä¸ªå—æŒ‡é’ˆ - %d 个关è”, %d 个未关è”(%d 个从仓库丢失) +settings.lfs_pointers.found=找到 %d ä¸ªå—æŒ‡é’ˆ - %d 个关è”, %d 个未关è”(%d 个从仓库丢失) settings.lfs_pointers.sha=Blob SHA settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=在仓库中 @@ -2593,7 +2549,7 @@ settings.rename_branch=é‡å‘½å分支 diff.browse_source=æµè§ˆä»£ç  diff.parent=父节点 diff.commit=å½“å‰æäº¤ -diff.git-notes=注释 +diff.git-notes=Notes diff.data_not_available=比较内容ä¸å¯ç”¨ diff.options_button=Diff 选项 diff.show_diff_stats=æ˜¾ç¤ºç»Ÿè®¡ä¿¡æ¯ @@ -2634,9 +2590,9 @@ diff.review=完æˆè¯„审 diff.review.header=æäº¤è¯„审 diff.review.placeholder=评审æ„è§ diff.review.comment=评论 -diff.review.approve=批准 +diff.review.approve=通过 diff.review.self_reject=åˆå¹¶è¯·æ±‚作者ä¸èƒ½å¯¹è‡ªå·±çš„åˆå¹¶è¯·æ±‚更改 -diff.review.reject=请求更改 +diff.review.reject=è¯·æ±‚å˜æ›´ diff.review.self_approve=åˆå¹¶è¯·æ±‚作者ä¸èƒ½æ‰¹å‡†è‡ªå·±çš„åˆå¹¶è¯·æ±‚ diff.committed_by=æäº¤è€… diff.protected=å—ä¿æŠ¤çš„ @@ -2683,11 +2639,11 @@ release.deletion=删除å‘布 release.deletion_desc=删除版本å‘布åªä¼šä»Ž Forgejo 中移除。这ä¸ä¼šå½±å“ Git çš„æ ‡ç­¾ä»¥åŠæ‚¨ä»“库的内容和历å²ã€‚是å¦ç»§ç»­ï¼Ÿ release.deletion_success=Release已被删除。 release.deletion_tag_desc=将从仓库中删除此 Git标签。仓库内容和历å²è®°å½•ä¿æŒä¸å˜ã€‚ç»§ç»­å—? -release.deletion_tag_success=该 Git 标签已被删除。 +release.deletion_tag_success=该 Git标签 å·²ç»è¢«åˆ é™¤ release.tag_name_already_exist=使用此标签åç§°çš„å‘布版本已ç»å­˜åœ¨ã€‚ release.tag_name_invalid=标签å称无效。 release.tag_name_protected=Git标签åç§°å·²å—ä¿æŠ¤ã€‚ -release.tag_already_exist=æ­¤ Git 标签已存在。 +release.tag_already_exist=æ­¤ Git标签 å称已存在 release.downloads=下载附件 release.download_count=下载:%s release.add_tag_msg=使用å‘布的标题和内容作为标签消æ¯ã€‚ @@ -2697,7 +2653,7 @@ release.tags_for=%s 的标签 branch.name=分支åç§° branch.already_exists=å为 %s 的分支已存在。 -branch.delete_head=删除 +branch.delete_head=刪除 branch.delete=删除分支 "%s" branch.delete_html=删除分支 branch.delete_desc=åˆ é™¤åˆ†æ”¯æ˜¯æ°¸ä¹…çš„ã€‚è™½ç„¶å·²åˆ é™¤çš„åˆ†æ”¯åœ¨å®žé™…è¢«åˆ é™¤å‰æœ‰å¯èƒ½ä¼šçŸ­æ—¶é—´å­˜åœ¨ï¼Œä½†è¿™åœ¨å¤§å¤šæ•°æƒ…况下无法撤销。是å¦ç»§ç»­ï¼Ÿ @@ -2736,7 +2692,7 @@ tag.create_tag_operation=创建标签 tag.confirm_create_tag=创建标签 tag.create_tag_from=基于"%s"创建新标签 -tag.create_success=已创建标签“%sâ€ã€‚ +tag.create_success=标签"%s"已存在 topic.manage_topics=管ç†ä¸»é¢˜ topic.done=ä¿å­˜ @@ -2756,8 +2712,8 @@ rss.must_be_on_branch = 您必须处于一个分支上æ‰èƒ½æ‹¥æœ‰ä¸€ä¸ªRSS订 admin.manage_flags = ç®¡ç†æ ‡å¿— admin.failed_to_replace_flags = 替æ¢ä»“库标志失败 clone_in_vscodium = 在 VSCodium 中克隆 -issues.blocked_by_user = 由于你已被仓库所有者å±è”½ï¼Œä½ æ— æ³•在此仓库创建工å•。 -issues.comment.blocked_by_user = 因为你已被仓库所有者或工å•作者å±è”½ï¼Œä½ æ— æ³•对此工å•进行评论。 +issues.blocked_by_user = 你无法在此仓库创建工å•,因为你已被仓库所有者å±è”½ã€‚ +issues.comment.blocked_by_user = 你无法对此工å•进行评论,因为你已被仓库所有者或此工å•çš„å‘布者å±è”½ã€‚ settings.wiki_rename_branch_main_desc = 将百科内部使用的分支é‡å‘½å为“%sâ€ã€‚此更改是永久性的且ä¸å¯æ’¤é”€ã€‚ editor.invalid_commit_mail = 用于创建æäº¤çš„é‚®ä»¶åœ°å€æ— æ•ˆã€‚ pulls.blocked_by_user = 你无法在此仓库上创建åˆå¹¶è¯·æ±‚,因为您已被仓库所有者å±è”½ã€‚ @@ -2788,12 +2744,12 @@ pulls.made_using_agit = AGit activity.navbar.pulse = åŠ¨æ€ activity.navbar.code_frequency = 代ç é¢‘率 activity.navbar.recent_commits = 近期æäº¤ -pulls.agit_explanation = 该åˆå¹¶è¯·æ±‚是用 AGit 工作æµåˆ›å»ºçš„。使用 AGit,贡献者无需派生或创建分支就å¯ä»¥ç›´æŽ¥é€šè¿‡ “git push†æå‡ºæ›´æ”¹ä»£ç ã€‚ +pulls.agit_explanation = 该åˆå¹¶è¯·æ±‚是用 AGit 创建的。AGit 是一ç§å¯ä»¥è®©è´¡çŒ®è€…直接通过 “git push†æå‡ºæ›´æ”¹ä»£ç è€Œä¸éœ€è¦æ´¾ç”Ÿæˆ–建立新分支。 error.broken_git_hook = 该仓库的 Git é’©å­ä¼¼ä¹Žå·²ç»æŸå,请按照 此文档æ¥ä¿®å¤è¿™äº›é—®é¢˜ï¼Œç„¶å޿ލé€ä¸€äº›æäº¤æ¥åˆ·æ–°çжæ€ã€‚ pulls.merged_title_desc_one = 已将æ¥è‡ª %[2]s çš„ %[1]d æäº¤åˆå¹¶å…¥ %[3]s %[4]s commits.search_branch = 此分支 open_with_editor = 使用 %s 打开 -pulls.title_desc_one = 想è¦å°†æ¥è‡ª %[2]s çš„ %[1]d 笔æäº¤åˆå¹¶åˆ° %[3]s +pulls.title_desc_one = 想è¦å°†æ¥è‡ª %[2]s çš„ %[1]d æäº¤åˆå¹¶åˆ° %[3]s settings.rename_branch_failed_protected = 无法é‡å‘½åå—ä¿æŠ¤çš„åˆ†æ”¯ %s。 stars = 点赞 settings.confirmation_string = 确认输入 @@ -2804,13 +2760,13 @@ n_branch_few = %s 分支 n_tag_one = %s 标签 n_tag_few = %s 标签 editor.commit_id_not_matching = 您在编辑文件时该文件已被更改。请æäº¤åˆ°ä¸€ä¸ªæ–°çš„分支,然åŽå†å°†è¿™ä¸ªæ–°çš„分支åˆå¹¶å›žå½“å‰åˆ†æ”¯ã€‚ -issues.num_participants_one = %d ä½å‚与者 -issues.archived_label_description = (已存档)%s +issues.num_participants_one = %d 个å‚与者 +issues.archived_label_description = (已归档)%s editor.push_out_of_date = 推é€ä¼¼ä¹Žå·²è¿‡æœŸã€‚ settings.enforce_on_admins = 对仓库的管ç†å‘˜é€‚用该规则 settings.enforce_on_admins_desc = 使仓库管ç†å‘˜ä¹Ÿé¡»éµå®ˆæ­¤è§„则。 settings.sourcehut_builds.secrets = 密钥 -size_format = %[1]s:%[2]s, %[3]s:%[4]s +size_format = %[1]s: %[2]s, %[3]s: %[4]s settings.sourcehut_builds.graphql_url = GraphQL URL (例如: https://builds.sr.ht/query) settings.add_webhook.invalid_path = 路径中ä¸èƒ½åŒ…å«â€œ.â€æˆ–“..â€ï¼Œä¹Ÿä¸èƒ½åœ¨å¼€å¤´æˆ–结尾中使用斜æ ã€‚ settings.sourcehut_builds.secrets_helper = 给予任务访问构建密钥的æƒé™ï¼ˆéœ€è¦ SECRETS:RO æƒé™ï¼‰ @@ -2818,7 +2774,7 @@ release.download_count_one = %s 下载 release.download_count_few = %s 下载 release.system_generated = 此附件是自动生æˆçš„。 pulls.ready_for_review = 准备好接å—评审了å—? -settings.web_hook_name_sourcehut_builds = SourceHut Builds +settings.web_hook_name_sourcehut_builds = SourceHut 构建 settings.graphql_url = GraphQL URL 链接 settings.sourcehut_builds.access_token_helper = 已授予 JOBS:RW æƒé™çš„访问令牌。å¯åœ¨ meta.sr.ht ä¸Šç”Ÿæˆæ ‡å‡†çš„ builds.sr.ht 令牌或带有密匙访问æƒé™çš„ builds.sr.ht 令牌 。 settings.matrix.access_token_helper = 推è为此设立专门的 Matrix 账户。访问令牌å¯ä»Ž Element Web 客户端(在éšç§/无痕模å¼é€‰é¡¹å¡ä¸­æ‰“开)> 用户èœå•(左上角)> 所有设置 > 帮助åŠå…³äºŽ > 高级 > 访问令牌(在主æœåС噍 URL 下方)检索。获å–完æˆåŽï¼Œè¯·ç›´æŽ¥å…³é—­éšç§/无痕选项å¡ï¼ˆæ³¨é”€ä¼šä½¿ä»¤ç‰Œå¤±æ•ˆï¼‰ã€‚ @@ -2840,7 +2796,7 @@ issues.edit.already_changed = 无法ä¿å­˜å¯¹å·¥å•的更改。工å•似乎已 pulls.edit.already_changed = 无法ä¿å­˜å¯¹åˆå¹¶è¯·æ±‚的更改。内容似乎已ç»è¢«å¦ä¸€ä¸ªç”¨æˆ·ä¿®æ”¹äº†ï¼Œä¸ºäº†é˜²æ­¢ä¿®æ”¹è¢«è¦†ç›–,请刷新页é¢åŽå†æ¬¡å°è¯•编辑 comments.edit.already_changed = 无法ä¿å­˜å¯¹è¯„论的更改。内容似乎已ç»è¢«å¦ä¸€ä¸ªç”¨æˆ·ä¿®æ”¹äº†ï¼Œä¸ºäº†é˜²æ­¢ä¿®æ”¹è¢«è¦†ç›–,请刷新页é¢åŽå†æ¬¡å°è¯•编辑 subscribe.issue.guest.tooltip = 登录以订阅工å•。 -subscribe.pull.guest.tooltip = 登录以订阅此åˆå¹¶è¯·æ±‚。 +subscribe.pull.guest.tooltip = 登录以订阅此拉å–请求。 settings.federation_following_repos = 关注的仓库URL地å€ï¼Œå¤šä¸ªåœ°å€ä»¥ “;†分隔,ä¸éœ€è¦å‰åŽç©ºæ ¼ã€‚ settings.federation_settings = 邦è”设置 settings.federation_apapiurl = 此仓库的邦è”URL地å€ã€‚将其作为关注的仓库URL地å€å¡«å†™åˆ°å¦ä¸€ä¸ªä»“库的邦è”设置中。 @@ -2848,10 +2804,10 @@ settings.federation_not_enabled = 当å‰å®žä¾‹æœªå¯ç”¨é‚¦è”功能。 issues.author.tooltip.issue = 此用户是本工å•的作者。 issues.author.tooltip.pr = 此用户是此åˆå¹¶è¯·æ±‚的作者。 release.type_attachment = 附件 -release.type_external_asset = å¤–éƒ¨èµ„æº -release.asset_name = 资æºåç§° +release.type_external_asset = 外部资产 +release.asset_name = 资产åç§° release.asset_external_url = 外部 URL -release.add_external_asset = æ·»åŠ å¤–éƒ¨èµ„æº +release.add_external_asset = 添加外部资产 release.invalid_external_url = 无效的外部 URL:“%s†milestones.filter_sort.name = åç§° settings.pull_mirror_sync_quota_exceeded = 超出é…é¢ï¼Œæœªæ‹‰å–更改。 @@ -2879,41 +2835,9 @@ issues.review.add_remove_review_requests = 于 %[3]s 请求 %[1]s 评审,并 pulls.delete_after_merge.head_branch.is_protected = 您è¦åˆ é™¤çš„头部分支是å—ä¿æŠ¤çš„åˆ†æ”¯ï¼Œæ— æ³•åˆ é™¤ã€‚ pulls.delete_after_merge.head_branch.insufficient_branch = 您没有æƒé™åˆ é™¤å¤´éƒ¨åˆ†æ”¯ã€‚ pulls.delete_after_merge.head_branch.is_default = 您è¦åˆ é™¤çš„头部分支是默认分支,无法删除。 -issues.filter_sort.relevance = 相关性 -diff.git-notes.add = 添加注释 -diff.git-notes.remove-header = 移除注释 -diff.git-notes.remove-body = 此注释将被移除。 -issues.num_reviews_one = %d 评审 -issues.num_reviews_few = %d 评审 -issues.summary_card_alt = 仓库 %[2]s 中标题为 %[1]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 = 以一个自述文件ã€å¯é€‰çš„许å¯è¯ä¸Ž .gitignore 文件开始Git历å²ã€‚ -issues.reaction.add = 添加回应 -issues.reaction.alt_few = %[1]s 回应了 %[2]s。 -issues.reaction.alt_many = %[1]s å’Œå¦å¤– %[2]d 人回应了 %[3]s。 -issues.reaction.alt_remove = 从评论中移除 %[1] 回应。 -issues.context.menu = 评论èœå• -issues.reaction.alt_add = 对评论添加 %[1]s 回应。 -release.summary_card_alt = 仓库 %[2]s 中标题为 %[1]s 的版本å‘布的摘è¦å¡ç‰‡ -summary_card_alt = 仓库 %s 的摘è¦å¡ç‰‡ -editor.commit_email = æäº¤ç”µå­é‚®ä»¶ -archive.pull.noreview = 此仓库已存档,您无法评审åˆå¹¶è¯·æ±‚。 -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=正在加载 %s… +component_loading=正在加载 %s... component_loading_failed=无法加载 %s component_loading_info=è¿™å¯èƒ½éœ€è¦ä¸€ç‚¹â€¦ component_failed_to_load=æ„外的错误å‘生了。 @@ -2942,11 +2866,11 @@ team_desc_helper=æè¿°å›¢é˜Ÿçš„目的或作用。 team_access_desc=仓库æƒé™ team_permission_desc=æƒé™ team_unit_desc=å…许访问仓库å•å…ƒ -team_unit_disabled=(已ç¦ç”¨ï¼‰ +team_unit_disabled=(å·²ç¦ç”¨) form.name_reserved=组织åç§° '%s' 是被ä¿ç•™çš„。 form.name_pattern_not_allowed=仓库å称中ä¸å…许使用 "%s"。 -form.create_org_not_allowed=您ä¸èƒ½åˆ›å»ºç»„织。 +form.create_org_not_allowed=此账å·ç¦æ­¢åˆ›å»ºç»„织 settings=组织设置 settings.options=组织 @@ -2958,9 +2882,9 @@ 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=ç§æœ‰ (仅对组织æˆå‘˜å¯è§) settings.visibility.private_shortname=ç§æœ‰ settings.update_settings=更新设置 @@ -3046,8 +2970,6 @@ teams.invite.by=邀请人 %s teams.invite.description=请点击下é¢çš„æŒ‰é’®åŠ å…¥å›¢é˜Ÿã€‚ follow_blocked_user = 你无法关注此组织,因为此组织已å±è”½ä½ ã€‚ open_dashboard = 打开仪表盘 -settings.change_orgname_redirect_prompt.with_cooldown.one = 旧的组织å将在%[1]då¤©çš„ä¿æŠ¤æœŸåŽå¯¹æ‰€æœ‰äººå¯ç”¨ï¼Œæ‚¨ä»å¯ä»¥åœ¨æ­¤æœŸé—´é‡æ–°è®¤é¢†æ—§çš„å字。 -settings.change_orgname_redirect_prompt.with_cooldown.few = 旧的组织å将在%[1]då¤©çš„ä¿æŠ¤æœŸåŽå¯¹æ‰€æœ‰äººå¯ç”¨ï¼Œæ‚¨ä»å¯ä»¥åœ¨æ­¤æœŸé—´é‡æ–°è®¤é¢†æ—§å字。 [admin] dashboard=管ç†é¢æ¿ @@ -3055,7 +2977,7 @@ self_check = 自检 identity_access=身份åŠè®¤è¯ users=ç”¨æˆ·å¸æˆ· organizations=ç»„ç»‡ç®¡ç† -assets=代ç èµ„æº +assets=代ç èµ„产 repositories=ä»“åº“ç®¡ç† hooks=Web é’©å­ integrations=é›†æˆ @@ -3079,15 +3001,15 @@ dashboard.operation_run=执行 dashboard.clean_unbind_oauth=æ¸…ç†æœªç»‘定的 OAuth 连接 dashboard.clean_unbind_oauth_success=所有未绑定的 OAuth 连接已被删除。 dashboard.task.started=已开始任务:%[1]s -dashboard.task.process=任务:%[1]s -dashboard.task.cancelled=任务:%[1]s 已喿¶ˆï¼š%[3]s -dashboard.task.error=任务中的错误:%[1]s:%[3]s -dashboard.task.finished=任务:%[2]s å¯åŠ¨çš„ %[1]s å·²å®Œæˆ -dashboard.task.unknown=未知任务:%[1]s +dashboard.task.process=任务: %[1]s +dashboard.task.cancelled=任务: %[1]s 已喿¶ˆ: %[3]s +dashboard.task.error=任务中的错误: %[1]s: %[3]s +dashboard.task.finished=任务: %[2]s å¯åŠ¨çš„ %[1]s å·²å®Œæˆ +dashboard.task.unknown=未知任务: %[1]s dashboard.cron.started=已开始计划任务:%[1]s dashboard.cron.process=计划任务:%[1]s -dashboard.cron.cancelled=定时任务:%[1]s 已喿¶ˆï¼š%[3]s -dashboard.cron.error=任务中的错误:%s:%[3]s +dashboard.cron.cancelled=定时任务: %[1]s 已喿¶ˆ: %[3]s +dashboard.cron.error=任务中的错误: %s: %[3]s dashboard.cron.finished=任务:%[1]s å·²ç»å®Œæˆ dashboard.delete_inactive_accounts=åˆ é™¤æ‰€æœ‰æœªæ¿€æ´»çš„å¸æˆ· dashboard.delete_inactive_accounts.started=删除所有未激活的账户任务已å¯åŠ¨ã€‚ @@ -3217,11 +3139,11 @@ emails.email_manage_panel=管ç†ç”¨æˆ·é‚®ä»¶åœ°å€ emails.primary=主è¦çš„ emails.activated=已激活 emails.filter_sort.email=电å­é‚®ä»¶ -emails.filter_sort.email_reverse=电å­é‚®ä»¶ï¼ˆé€†åºï¼‰ +emails.filter_sort.email_reverse=电å­é‚®ä»¶(逆åº) emails.filter_sort.name=用户å -emails.filter_sort.name_reverse=用户å(倒åºï¼‰ +emails.filter_sort.name_reverse=用户å(倒åº) emails.updated=电å­é‚®ä»¶å·²æ›´æ–° -emails.not_updated=无法更新请求的电å­é‚®ä»¶åœ°å€ï¼š%v +emails.not_updated=无法更新请求的电å­é‚®ä»¶åœ°å€ï¼š %v emails.duplicate_active=此电å­é‚®ä»¶åœ°å€å·²è¢«å¦ä¸€ä¸ªç”¨æˆ·æ¿€æ´»ä½¿ç”¨ã€‚ emails.change_email_header=更新电å­é‚®ä»¶å±žæ€§ emails.change_email_text=æ‚¨ç¡®å®šè¦æ›´æ–°è¯¥ç”µå­é‚®ä»¶åœ°å€å—? @@ -3237,7 +3159,7 @@ repos.unadopted=未收录仓库 repos.unadopted.no_more=找ä¸åˆ°æ›´å¤šæœªè¢«æ”¶å½•的仓库。 repos.owner=所有者 repos.name=åç§° -repos.private=ç§æœ‰ +repos.private=ç§æœ‰åº“ repos.watches=关注数 repos.stars=点赞数 repos.forks=派生数 @@ -3247,7 +3169,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=所有者 @@ -3290,7 +3212,7 @@ auths.attribute_username=用户å属性 auths.attribute_username_placeholder=置空将使用Forgejo的用户å。 auths.attribute_name=å字属性 auths.attribute_surname=å§“æ°å±žæ€§ -auths.attribute_mail=电å­é‚®ä»¶åœ°å€å±žæ€§ +auths.attribute_mail=电å­é‚®ç®±å±žæ€§ auths.attribute_ssh_public_key=SSH公钥属性 auths.attribute_avatar=头åƒå±žæ€§ auths.attributes_in_bind=从 bind DN 中拉å–å±žæ€§ä¿¡æ¯ @@ -3300,12 +3222,12 @@ auths.search_page_size=åˆ†é¡µå¤§å° auths.filter=用户过滤规则 auths.admin_filter=管ç†å‘˜è¿‡æ»¤è§„则 auths.restricted_filter=å—é™çš„过滤器 -auths.restricted_filter_helper=留空则ä¸å°†ä»»ä½•用户设置为å—é™ã€‚使用星å·ï¼ˆ'*') 将所有ä¸åŒ¹é…管ç†è¿‡æ»¤å™¨çš„用户设置为å—é™ç”¨æˆ·ã€‚ -auths.verify_group_membership=éªŒè¯ LDAP 组æˆå‘˜èµ„格(留空过滤器跳过) +auths.restricted_filter_helper=留空则ä¸å°†ä»»ä½•用户设置为å—é™ã€‚使用星å·('*') 将所有ä¸åŒ¹é…管ç†è¿‡æ»¤å™¨çš„用户设置为å—é™ç”¨æˆ·ã€‚ +auths.verify_group_membership=éªŒè¯ LDAP 组æˆå‘˜èµ„æ ¼ (留空过滤器跳过) auths.group_search_base=群组æœç´¢åŸºç¡€ DN auths.group_attribute_list_users=包å«ç”¨æˆ·åˆ—表的群组属性 auths.user_attribute_in_group=群组中列出的用户属性 -auths.map_group_to_team=å°† LDAP 组映射到组织团队(留空字段则跳过) +auths.map_group_to_team=å°† LDAP 组映射到组织团队 (留空字段则跳过) auths.map_group_to_team_removal=如果用户ä¸å±žäºŽç›¸åº”çš„ LDAP ç»„ï¼Œä»Žå·²åŒæ­¥å›¢é˜Ÿä¸­ç§»é™¤ç”¨æˆ· auths.enable_ldap_groups=å¯ç”¨ LDAP 组 auths.ms_ad_sa=MS AD æœç´¢å±žæ€§ @@ -3316,12 +3238,12 @@ auths.allowed_domains=域å白åå• auths.allowed_domains_helper=æ¯ä¸ªåŸŸå用逗å·åˆ†éš”,如è¦å…许任æ„域å则留空。 auths.skip_tls_verify=忽略 TLS éªŒè¯ auths.force_smtps=强制 SMTPS -auths.force_smtps_helper=SMTPS 始终用于 465 端å£ã€‚设置此项会强制其他端å£ä¹Ÿä½¿ç”¨ SMTPS。(å¦åˆ™ï¼Œå¦‚果主机支æŒï¼Œå°†åœ¨å…¶ä»–端å£ä¸Šä½¿ç”¨ STARTTLS。) +auths.force_smtps_helper=SMTPS 始终用于 465 端å£ã€‚设置此项会强制其他端å£ä¹Ÿä½¿ç”¨ SMTPS。(å¦åˆ™ï¼Œå¦‚果主机支æŒï¼Œå°†åœ¨å…¶ä»–端å£ä¸Šä½¿ç”¨ STARTTLS。) auths.helo_hostname=HELO 主机å auths.helo_hostname_helper=用 HELO å‘é€çš„主机å。 留空å‘é€å½“å‰ä¸»æœºå。 auths.disable_helo=ç¦ç”¨ HELO auths.pam_service_name=PAM æœåŠ¡åç§° -auths.pam_email_domain=PAM 电å­é‚®ä»¶åŸŸï¼ˆå¯é€‰ï¼‰ +auths.pam_email_domain=PAM 电å­é‚®ä»¶åŸŸ(å¯é€‰) auths.oauth2_provider=OAuth2 æä¾›ç¨‹åº auths.oauth2_icon_url=图标 URL auths.oauth2_clientID=客户端 ID (键) @@ -3340,20 +3262,20 @@ auths.oauth2_required_claim_name=必须填写 Claim 声明的åç§° auths.oauth2_required_claim_name_helper=设置此åç§°ï¼Œåªæœ‰å…·æœ‰æ­¤å称的声明(Claim)的用户å¯ä»Žæ­¤æºç™»å½• auths.oauth2_required_claim_value=必须填写 Claim 声明的值 auths.oauth2_required_claim_value_helper=è®¾ç½®æ­¤å€¼ï¼Œåªæœ‰æ‹¥æœ‰å¯¹åº”的声明(Claim)的å称和值的用户æ‰è¢«å…许从此æºç™»å½• -auths.oauth2_group_claim_name=用于æä¾›ç”¨æˆ·ç»„åç§°çš„ Claim 声明å称。(å¯é€‰ï¼‰ -auths.oauth2_admin_group=管ç†å‘˜ç”¨æˆ·ç»„çš„ Claim 声明值。(å¯é€‰ - 需è¦ä¸Šé¢çš„声明å称) -auths.oauth2_restricted_group=å—é™ç”¨æˆ·ç»„çš„ Claim 声明值。(å¯é€‰ - 需è¦ä¸Šé¢çš„声明å称) +auths.oauth2_group_claim_name=用于æä¾›ç”¨æˆ·ç»„åç§°çš„ Claim 声明å称。(å¯é€‰) +auths.oauth2_admin_group=管ç†å‘˜ç”¨æˆ·ç»„çš„ Claim 声明值。(å¯é€‰ - 需è¦ä¸Šé¢çš„声明åç§°) +auths.oauth2_restricted_group=å—é™ç”¨æˆ·ç»„çš„ Claim 声明值。(å¯é€‰ - 需è¦ä¸Šé¢çš„声明åç§°) auths.oauth2_map_group_to_team=映射声明的组到组织团队。(å¯é€‰ - è¦æ±‚在上é¢å¡«å†™å£°æ˜Žçš„å字) -auths.oauth2_map_group_to_team_removal=如果用户ä¸å±žäºŽç›¸åº”çš„ç»„ï¼Œåˆ™ä»ŽåŒæ­¥çš„团队中移除用户。 +auths.oauth2_map_group_to_team_removal=如果用户ä¸å±žäºŽç›¸åº”çš„ç»„ï¼Œä»Žå·²åŒæ­¥å›¢é˜Ÿä¸­ç§»é™¤ç”¨æˆ· auths.enable_auto_register=å…许自动注册 auths.sspi_auto_create_users=自动创建用户 auths.sspi_auto_create_users_helper=å…许 SSPI 认è¯åœ¨ç”¨æˆ·ç¬¬ä¸€æ¬¡ç™»å½•æ—¶è‡ªåŠ¨åˆ›å»ºæ–°è´¦å· auths.sspi_auto_activate_users=自动激活用户 auths.sspi_auto_activate_users_helper=å…许 SSPI 认è¯è‡ªåŠ¨æ¿€æ´»æ–°ç”¨æˆ· auths.sspi_strip_domain_names=从用户å中删除域å部分 -auths.sspi_strip_domain_names_helper=如果选中此项,域å将从登录å中删除(例如,"DOMAIN\user"å’Œ"user@example.org"ï¼Œä¸¤è€…éƒ½å°†å˜æˆåªæ˜¯ "user")。 +auths.sspi_strip_domain_names_helper=如果选中此项,域å将从登录å中删除(例如,"DOMAIN\user"å’Œ"user@example.org"ï¼Œä¸¤è€…éƒ½å°†å˜æˆåªæ˜¯ "user")。 auths.sspi_separator_replacement=è¦ä½¿ç”¨çš„分隔符代替\, / å’Œ @ -auths.sspi_separator_replacement_helper=用于替æ¢ä¸‹çº§ç™»å½•å称分隔符的字符(例如 "DOMAIN\user") 中的 \ 和用户主å字(如"user@example.org"中的 @)。 +auths.sspi_separator_replacement_helper=用于替æ¢ä¸‹çº§ç™»å½•å称分隔符的字符 (例如 "DOMAIN\user") 中的 \ 和用户主åå­—(如"user@example.org"中的 @)。 auths.sspi_default_language=默认语言 auths.sspi_default_language_helper=SSPI è®¤è¯æ–¹æ³•为用户自动创建的默认语言。如果您想è¦è‡ªåŠ¨æ£€æµ‹åˆ°è¯­è¨€ï¼Œè¯·ç•™ç©ºã€‚ auths.tips=帮助æç¤º @@ -3361,18 +3283,18 @@ auths.tips.oauth2.general=OAuth2 è®¤è¯ auths.tips.oauth2.general.tip=当注册新的 OAuth2 èº«ä»½éªŒè¯æ—¶ï¼Œå›žè°ƒ/é‡å®šå‘ URL 应该是: auths.tip.oauth2_provider=OAuth2 æä¾›ç¨‹åº auths.tip.bitbucket=`在 %s -auths.tip.nextcloud=使用èœå•“设置->安全->OAuth 2.0客户端â€åœ¨æ‚¨çš„实例上注册一个新的 OAuth 客户端 +auths.tip.nextcloud=使用下é¢çš„èœå•“设置(Settings) -> 安全(Security) -> OAuth 2.0 clientâ€åœ¨æ‚¨çš„实例上注册一个新的 OAuth 客户端。 auths.tip.dropbox=在 %s ä¸Šåˆ›å»ºä¸€ä¸ªæ–°çš„åº”ç”¨ç¨‹åº auths.tip.facebook=`在 %s 注册一个新的应用,并添加产å“"Facebook 登录"` auths.tip.github=在 %s 注册一个 OAuth åº”ç”¨ç¨‹åº auths.tip.gitlab=在 https://gitlab.com/profile/applications ä¸Šæ³¨å†Œæ–°åº”ç”¨ç¨‹åº -auths.tip.google_plus=从谷歌 API 控制å°ï¼ˆ%s) 获得 OAuth2 å®¢æˆ·ç«¯å‡­æ® -auths.tip.openid_connect=使用 OpenID 连接å‘现 URL(/.well-known/openid-configuration) æ¥æŒ‡å®šç»ˆç‚¹ -auths.tip.twitter=å‰å¾€ %s,创建一个应用程åºå¹¶ç¡®ä¿å¯ç”¨äº†â€œå…许此应用程åºç”¨äºŽä½¿ç”¨ Twitter 登录â€é€‰é¡¹ +auths.tip.google_plus=从谷歌 API æŽ§åˆ¶å° (%s) 获得 OAuth2 å®¢æˆ·ç«¯å‡­æ® +auths.tip.openid_connect=使用 OpenID 连接å‘现 URL (/.well-known/openid-configuration) æ¥æŒ‡å®šç»ˆç‚¹ +auths.tip.twitter=访问 %s,创建应用并确ä¿å¯ç”¨äº†"å…许此应用程åºç”¨äºŽç™»å½• Twitter"的选项。 auths.tip.discord=在 %s ä¸Šæ³¨å†Œæ–°åº”ç”¨ç¨‹åº auths.tip.gitea=注册一个新的 OAuth2 应用程åºã€‚å¯ä»¥è®¿é—® %s 查看帮助 auths.tip.yandex=在 %s 上创建一个新的应用程åºã€‚在“ Yandex.Passport APIâ€è¿™éƒ¨åˆ†ä¸­é€‰æ‹©ä»¥ä¸‹æƒé™ï¼šâ€œè®¿é—®ç”µå­é‚®ä»¶åœ°å€ï¼ˆAccess to email address)â€ï¼Œâ€œè®¿é—®ç”¨æˆ·å¤´åƒï¼ˆAccess to user avatar)â€å’Œâ€œè®¿é—®ç”¨æˆ·å,å字和姓æ°ï¼Œæ€§åˆ«ï¼ˆAccess to username, first name and surname, genderAccess to username, first name and surname, gender)†-auths.tip.mastodon=输入您想è¦è®¤è¯çš„ mastodon 实例的自定义 URL(或使用默认值) +auths.tip.mastodon=输入您想è¦è®¤è¯çš„ mastodon 实例的自定义 URL (或使用默认值) auths.edit=ä¿®æ”¹è®¤è¯æº auths.activated=è¯¥è®¤è¯æºå·²ç»å¯ç”¨ auths.new_success=å·²æ·»åŠ èº«ä»½éªŒè¯ '%s'。 @@ -3385,8 +3307,8 @@ auths.still_in_used=è®¤è¯æºä»åœ¨ä½¿ç”¨ã€‚请先解除或者删除使用此认 auths.deletion_success=è®¤è¯æºå·²ç»æ›´æ–°ã€‚ auths.login_source_exist=è®¤è¯æº '%s' å·²ç»å­˜åœ¨ã€‚ auths.login_source_of_type_exist=æ­¤ç±»åž‹çš„è®¤è¯æºå·²å­˜åœ¨ã€‚ -auths.unable_to_initialize_openid=无法åˆå§‹åŒ– OpenID Connect æä¾›å•†ï¼š%s -auths.invalid_openIdConnectAutoDiscoveryURL=无效的 Auto Discovery URL(这必须是一个以 http:// 或 https://开头的有效的 URL) +auths.unable_to_initialize_openid=无法åˆå§‹åŒ– OpenID Connect æä¾›å•†ï¼š %s +auths.invalid_openIdConnectAutoDiscoveryURL=无效的 Auto Discovery URL (这必须是一个以 http:// 或 https://开头的有效的 URL) config.server_config=æœåС噍é…ç½® config.app_name=实例åç§° @@ -3474,7 +3396,7 @@ config.mailer_sendmail_path=Sendmail 路径 config.mailer_sendmail_args=Sendmail çš„é¢å¤–傿•° config.mailer_sendmail_timeout=Sendmail è¶…æ—¶ config.mailer_use_dummy=Dummy -config.test_email_placeholder=电å­é‚®å€ï¼ˆä¾‹å¦‚,test@example.com) +config.test_email_placeholder=电å­é‚®å€ (例如,test@example.com) config.send_test_mail=å‘逿µ‹è¯•邮件 config.send_test_mail_submit=å‘é€ config.test_mail_failed=å‘逿µ‹è¯•邮件至 "%s" 时失败:%v @@ -3546,7 +3468,7 @@ monitor.process.cancel_notices=中止:%s ? monitor.process.children=å­è¿›ç¨‹ monitor.queues=队列 -monitor.queue=队列:%s +monitor.queue=队列: %s monitor.queue.name=åç§° monitor.queue.type=类型 monitor.queue.exemplar=æ•°æ®ç±»åž‹ @@ -3581,9 +3503,9 @@ notices.op=æ“作 notices.delete_success=系统通知已被删除。 self_check.no_problem_found=尚未å‘现问题。 self_check.database_collation_mismatch=期望数æ®åº“使用的校验方å¼ï¼š%s -self_check.database_collation_case_insensitive=æ•°æ®åº“正在使用排åºè§„则%sï¼Œè¿™æ˜¯ä¸€ä¸ªä¸æ•感的排åºè§„则。虽然Forgejoå¯ä»¥ä¸Žå…¶ä¸€åŒå·¥ä½œï¼Œä½†å¯èƒ½æœ‰ä¸€äº›ç½•è§çš„æƒ…况存在问题。 +self_check.database_collation_case_insensitive=æ•°æ®åº“正在使用一个校验 %s, è¿™æ˜¯ä¸€ä¸ªä¸æ•感的校验. 虽然Giteaå¯ä»¥ä¸Žå®ƒåˆä½œï¼Œä½†å¯èƒ½æœ‰ä¸€äº›ç½•è§çš„æƒ…况ä¸å¦‚预期的那样起作用。 self_check.database_inconsistent_collation_columns=æ•°æ®åº“正在使用%s的排åºè§„则,但是这些列使用了ä¸åŒ¹é…的排åºè§„则。这å¯èƒ½ä¼šé€ æˆä¸€äº›æ„外问题。 -self_check.database_fix_mysql=对于 MySQL/MariaDB 用户,您å¯ä»¥ä½¿ç”¨â€œforgejo doctor convertâ€å‘½ä»¤æ¥ä¿®å¤æŽ’åºè§„则问题,或者您也å¯ä»¥æ‰‹åŠ¨é€šè¿‡â€œALTER ... COLLATE ...†SQL ä¿®å¤è¯¥é—®é¢˜ã€‚ +self_check.database_fix_mysql=对于MySQL/MariaDB用户,您å¯ä»¥ä½¿ç”¨â€œgitea doctor convertâ€å‘½ä»¤æ¥è§£å†³æ ¡éªŒé—®é¢˜ã€‚ 或者您也å¯ä»¥é€šè¿‡ "ALTER ... COLLATE ..." 这样的SQL æ¥æ‰‹åŠ¨è§£å†³è¿™ä¸ªé—®é¢˜ã€‚ auths.tips.gmail_settings = Gmail 设置: auths.tip.gitlab_new = 在 %s 上注册新应用 config_settings = 设置 @@ -3605,7 +3527,6 @@ users.admin.description = 授予此用户对通过 Web UI å’Œ API æä¾›çš„æ‰€ users.restricted.description = ä»…å…许与添加此用户作为å作者的仓库和组织进行交互。这将阻止访问此实例上的公开仓库。 users.local_import.description = å…许从æœåŠ¡å™¨çš„æœ¬åœ°æ–‡ä»¶ç³»ç»Ÿå¯¼å…¥ä»“åº“ã€‚è¿™å¯èƒ½æ˜¯ä¸€ä¸ªå®‰å…¨é—®é¢˜ã€‚ users.organization_creation.description = å…许创建新组织。 -monitor.duration = 时长(秒) [action] create_repo=创建了仓库 %s @@ -3661,9 +3582,9 @@ raw_seconds=ç§’ raw_minutes=分钟 [dropzone] -default_message=拖放文件或点击此处上传。 -invalid_input_type=您ä¸èƒ½ä¸Šä¼ è¯¥ç±»åž‹çš„æ–‡ä»¶ã€‚ -file_too_big=文件体积({{filesize}} MB)超过了最大å…许体积({{maxFilesize}} MB)。 +default_message=拖动文件或者点击此处上传。 +invalid_input_type=您ä¸èƒ½ä¸Šä¼ è¯¥ç±»åž‹çš„æ–‡ä»¶ +file_too_big=文件体积({{filesize}} MB)超过了最大å…许体积({{maxFilesize}} MB) remove_file=移除文件 [notification] @@ -3694,7 +3615,7 @@ error.probable_bad_default_signature=警告ï¼è™½ç„¶é»˜è®¤å¯†é’¥æ‹¥æœ‰æ­¤ID, [units] unit=å•å…ƒ error.no_unit_allowed_repo=您没有被å…许访问此仓库的任何å•元。 -error.unit_not_allowed=您没有æƒé™è®¿é—®æ­¤ä»“库å•元。 +error.unit_not_allowed=您没有æƒé™è®¿é—®æ­¤ä»“库å•å…ƒ [packages] title=软件包 @@ -3718,10 +3639,10 @@ keywords=å…³é”®è¯ details=详情 details.author=作者 details.project_site=项目站点 -details.repository_site=仓库网站 +details.repository_site=仓库站点 details.documentation_site=文档站点 details.license=许å¯åè®® -assets=èµ„æº +assets=文件 versions=版本 versions.view_all=查看全部 dependency.id=ID @@ -3734,7 +3655,7 @@ alpine.repository=ä»“åº“ä¿¡æ¯ alpine.repository.branches=分支 alpine.repository.repositories=ä»“åº“ç®¡ç† alpine.repository.architectures=æž¶æž„ -cargo.registry=在 Cargo é…置文件中设置此注册中心(例如:~/.cargo/config.toml): +cargo.registry=在 Cargo é…置文件中设置此注册中心(例如:~/.cargo/config.toml): cargo.install=è¦ä½¿ç”¨ Cargo 安装软件包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š chef.registry=在您的 ~/.chef/config.rb 文件中设置此注册中心: chef.install=è¦å®‰è£…包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š @@ -3750,9 +3671,9 @@ conda.install=è¦ä½¿ç”¨ Conda 安装软件包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š container.details.type=镜åƒç±»åž‹ container.details.platform=å¹³å° container.pull=从命令行拉å–镜åƒï¼š -container.digest=æ‘˜è¦ +container.digest=摘è¦ï¼š container.multi_arch=æ“作系统 / æž¶æž„ -container.layers=镜åƒåˆ†å±‚ +container.layers=镜åƒå±‚ container.labels=标签 container.labels.key=é”® container.labels.value=值 @@ -3781,7 +3702,7 @@ npm.install=è¦ä½¿ç”¨ npm 安装软件包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š npm.install2=或将其添加到 package.json 文件: npm.dependencies=ä¾èµ–项 npm.dependencies.development=å¼€å‘ä¾èµ– -npm.dependencies.peer=åŒç­‰ä¾èµ– +npm.dependencies.peer=Peer ä¾èµ– npm.dependencies.optional=å¯é€‰ä¾èµ– npm.details.tag=标签 pub.install=è¦ä½¿ç”¨ Dart 安装软件包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š @@ -3812,17 +3733,17 @@ settings.link.success=仓库链接已æˆåŠŸæ›´æ–°ã€‚ settings.link.error=更新仓库链接失败。 settings.delete=删除软件包 settings.delete.description=删除软件包是永久性的,无法撤消。 -settings.delete.notice=您将è¦åˆ é™¤ %s(%s)。此æ“作是ä¸å¯é€†çš„,您确定å—? +settings.delete.notice=您将è¦åˆ é™¤ %s (%s)。此æ“作是ä¸å¯é€†çš„,您确定å—? settings.delete.success=软件包已被删除。 settings.delete.error=删除软件包失败。 owner.settings.cargo.title=Cargo 注册中心索引 owner.settings.cargo.initialize=åˆå§‹åŒ–索引 owner.settings.cargo.initialize.description=使用 Cargo 注册中心时需è¦ä¸€ä¸ªç‰¹æ®Šç´¢å¼•çš„ Git ä»“åº“ã€‚ä½¿ç”¨æ­¤é€‰é¡¹å°†ï¼ˆé‡æ–°ï¼‰åˆ›å»ºä»“库并自动é…置它。 -owner.settings.cargo.initialize.error=åˆå§‹åŒ–Cargo索引失败:%v +owner.settings.cargo.initialize.error=åˆå§‹åŒ–Cargo索引失败: %v owner.settings.cargo.initialize.success=Cargoç´¢å¼•å·²ç»æˆåŠŸåˆ›å»ºã€‚ owner.settings.cargo.rebuild=é‡å»ºç´¢å¼• owner.settings.cargo.rebuild.description=如果索引与存储的 Cargo 包ä¸åŒæ­¥ï¼Œé‡å»ºå¯èƒ½ä¼šæœ‰ç”¨ã€‚ -owner.settings.cargo.rebuild.error=无法é‡å»º Cargo 索引:%v +owner.settings.cargo.rebuild.error=无法é‡å»º Cargo 索引: %v owner.settings.cargo.rebuild.success=Cargo 索引已æˆåŠŸé‡å»ºã€‚ owner.settings.cleanuprules.title=清ç†è§„则 owner.settings.cleanuprules.add=添加清ç†è§„则 @@ -3838,7 +3759,7 @@ owner.settings.cleanuprules.keep.count=ä¿ç•™æœ€æ–°çš„ owner.settings.cleanuprules.keep.count.1=æ¯ä¸ªè½¯ä»¶åŒ…1个版本 owner.settings.cleanuprules.keep.count.n=æ¯ä¸ªè½¯ä»¶åŒ… %d 个版本 owner.settings.cleanuprules.keep.pattern=ä¿æŒç‰ˆæœ¬åŒ¹é… -owner.settings.cleanuprules.keep.pattern.container=容器的latest版本总是会被ä¿ç•™ã€‚ +owner.settings.cleanuprules.keep.pattern.container=容器包的 最新版本 总是会ä¿ç•™ã€‚ owner.settings.cleanuprules.remove.title=与这些规则相匹é…的版本将被删除,除éžå…¶ä¸­å­˜åœ¨æŸä¸ªä¿ç•™å®ƒä»¬çš„规则。 owner.settings.cleanuprules.remove.days=移除旧于天数的版本 owner.settings.cleanuprules.remove.pattern=删除匹é…的版本 @@ -3865,23 +3786,14 @@ arch.version.replaces = æ›¿æ¢ arch.version.backup = 备份 arch.version.checkdepends = 检查ä¾èµ– arch.version.makedepends = 编译ä¾èµ– -container.images.title = é•œåƒ -search_in_external_registry = 在 %s 中æœç´¢ -alt.registry.install = è¦å®‰è£…此软件包,请è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼š -alt.install = 安装软件包 -alt.registry = 通过命令行é…置此注册表: -alt.setup = 添加一个仓库到连接的仓库列表(选择必è¦çš„æž¶æž„而éžâ€œ_arch_â€ï¼‰ï¼š -alt.repository = ä»“åº“ä¿¡æ¯ -alt.repository.architectures = æž¶æž„ -alt.repository.multiple_groups = 此软件包在多个组中å¯ç”¨ã€‚ [secrets] secrets=密钥 -description=机密将被传给特定的 Action,其它情况将ä¸èƒ½è¢«è¯»å–。 +description=Secrets 将被传给特定的 Actions,其它情况将ä¸èƒ½è¯»å– none=还没有密钥。 creation=添加密钥 -creation.name_placeholder=ä¸åŒºåˆ†å¤§å°å†™ï¼Œåªèƒ½åŒ…å«è‹±æ–‡å­—æ¯ã€æ•°å­—或下划线,ä¸èƒ½ä»¥ GITEA_ 或 GITHUB_ 开头 -creation.value_placeholder=输入任何内容。开头和结尾的空格都会被çœç•¥ã€‚ +creation.name_placeholder=ä¸åŒºåˆ†å¤§å°å†™ï¼Œå­—æ¯æ•°å­—或下划线ä¸èƒ½ä»¥GITEA_ 或 GITHUB_ 开头。 +creation.value_placeholder=输入任何内容,开头和结尾的空白都会被çœç•¥ creation.success=您的密钥 '%s' 添加æˆåŠŸã€‚ creation.failed=添加密钥失败。 deletion=删除密钥 @@ -3905,8 +3817,8 @@ status.skipped=已忽略 status.blocked=阻塞中 runners=è¿è¡Œå™¨ -runners.runner_manage_panel=管ç†è¿è¡Œå™¨ -runners.new=创建新è¿è¡Œå™¨ +runners.runner_manage_panel=ç®¡ç† Runners +runners.new=创建 Runner runners.new_notice=如何å¯åŠ¨ä¸€ä¸ªè¿è¡Œå™¨ runners.status=çŠ¶æ€ runners.id=ID @@ -3916,7 +3828,7 @@ runners.description=组织æè¿° runners.labels=标签 runners.last_online=上次在线时间 runners.runner_title=è¿è¡Œå™¨ -runners.task_list=最近在此è¿è¡Œå™¨ä¸Šçš„任务 +runners.task_list=最近在此runner上的任务 runners.task_list.no_tasks=还没有任务。 runners.task_list.run=执行 runners.task_list.status=çŠ¶æ€ @@ -3932,7 +3844,7 @@ runners.delete_runner_success=è¿è¡Œå™¨åˆ é™¤æˆåŠŸ runners.delete_runner_failed=删除è¿è¡Œå™¨å¤±è´¥ runners.delete_runner_header=确认è¦åˆ é™¤æ­¤è¿è¡Œå™¨ runners.delete_runner_notice=如果一个任务正在è¿è¡Œåœ¨æ­¤è¿è¡Œå™¨ä¸Šï¼Œå®ƒå°†è¢«ç»ˆæ­¢å¹¶æ ‡è®°ä¸ºå¤±è´¥ã€‚它å¯èƒ½ä¼šæ‰“断正在构建的工作æµã€‚ -runners.none=æ— å¯ç”¨çš„è¿è¡Œå™¨ +runners.none=æ— å¯ç”¨çš„ Runner runners.status.unspecified=未知 runners.status.idle=空闲 runners.status.active=激活 @@ -3945,8 +3857,8 @@ runs.all_workflows=æ‰€æœ‰å·¥ä½œæµ runs.commit=æäº¤ runs.scheduled=已计划的 runs.pushed_by=推é€è€… -runs.invalid_workflow_helper=工作æµé…置文件无效。请检查您的é…置文件:%s -runs.no_matching_online_runner_helper=æ²¡æœ‰åŒ¹é…æ ‡ç­¾çš„在线è¿è¡Œå™¨ï¼š%s +runs.invalid_workflow_helper=工作æµé…置文件无效。请检查您的é…置文件: %s +runs.no_matching_online_runner_helper=æ²¡æœ‰åŒ¹é…æ ‡ç­¾çš„在线 runner: %s runs.actor=æ“作者 runs.status=çŠ¶æ€ runs.actors_no_select=所有æ“作者 @@ -3956,7 +3868,7 @@ runs.no_workflows=ç›®å‰è¿˜æ²¡æœ‰å·¥ä½œæµã€‚ runs.no_workflows.quick_start=ä¸çŸ¥é“如何使用 Forgejo Actionså—?请查看 快速å¯åŠ¨æŒ‡å—。 runs.no_workflows.documentation=关于Forgejo Actions的更多信æ¯ï¼Œè¯·å‚阅 文档。 runs.no_runs=工作æµå°šæœªè¿è¡Œè¿‡ã€‚ -runs.empty_commit_message=(空白的æäº¤æ¶ˆæ¯ï¼‰ +runs.empty_commit_message=(空白的æäº¤æ¶ˆæ¯) workflow.disable=ç¦ç”¨å·¥ä½œæµ workflow.disable_success=å·¥ä½œæµ "%s" å·²æˆåŠŸç¦ç”¨ã€‚ @@ -3972,7 +3884,7 @@ variables.creation=添加å˜é‡ variables.none=ç›®å‰è¿˜æ²¡æœ‰å˜é‡ã€‚ variables.deletion=删除å˜é‡ variables.deletion.description=删除å˜é‡æ˜¯æ°¸ä¹…性的,无法撤消。继续å—? -variables.description=å˜é‡å°†è¢«ä¼ ç»™ç‰¹å®šçš„ Action,其它情况将ä¸èƒ½è¢«è¯»å–。 +variables.description=å˜é‡å°†è¢«ä¼ ç»™ç‰¹å®šçš„ Actions,其它情况将ä¸èƒ½è¯»å– variables.id_not_exist=ID为 %d çš„å˜é‡ä¸å­˜åœ¨ã€‚ variables.edit=编辑å˜é‡ variables.deletion.failed=删除å˜é‡å¤±è´¥ã€‚ @@ -3984,7 +3896,7 @@ variables.update.success=该å˜é‡å·²è¢«ç¼–辑。 runs.workflow = å·¥ä½œæµ runs.no_job_without_needs = 工作æµå¿…须至少包å«ä¸€ç»„没有ä¾èµ–的作业。 runs.no_job = 工作æµå¿…须至少包å«ä¸€ä¸ªä½œä¸š -workflow.dispatch.trigger_found = æ­¤å·¥ä½œæµæœ‰ workflow_dispatch 事件触å‘器。 +workflow.dispatch.trigger_found = æ­¤å·¥ä½œæµæœ‰ä¸€ä¸ª workflow_dispatch 事件触å‘。 workflow.dispatch.use_from = ä½¿ç”¨å·¥ä½œæµ workflow.dispatch.invalid_input_type = 输入类型“%sâ€æ— æ•ˆã€‚ workflow.dispatch.warn_input_limit = ä»…æ˜¾ç¤ºå‰ %d 个输入。 @@ -3992,9 +3904,6 @@ workflow.dispatch.run = è¿è¡Œå·¥ä½œæµ workflow.dispatch.success = å·²æˆåŠŸè¯·æ±‚å·¥ä½œæµè¿è¡Œã€‚ workflow.dispatch.input_required = 需è¦è¾“入“%sâ€çš„值。 runs.expire_log_message = 已清除日志,因为它们太旧了。 -runs.no_workflows.help_write_access = ä¸çŸ¥é“如何上手 Forgejo Actions?查看用户文档的快速上手部分æ¥ç¼–写你的第一个工作æµï¼Œç„¶åŽé…置一个Forgejoè¿è¡Œå™¨æ¥è¿è¡Œä½ çš„任务。 -runs.no_workflows.help_no_write_access = 欲了解关于Forgejo Actions的更多信æ¯ï¼Œè¯·å‚è§æ–‡æ¡£ã€‚ -variables.not_found = 找ä¸åˆ°å˜é‡ã€‚ [projects] type-1.display_name=个人项目 @@ -4013,32 +3922,32 @@ submodule=å­æ¨¡å— [search] -keyword_search_unavailable = å…³é”®è¯æœç´¢ç›®å‰ä¸å¯ç”¨ã€‚请è”系站点管ç†å‘˜ã€‚ -search = æœç´¢â€¦ -repo_kind = æœç´¢ä»“库… -user_kind = æœç´¢ç”¨æˆ·â€¦ -org_kind = æœç´¢ç»„织… -team_kind = æœç´¢å›¢é˜Ÿâ€¦ -code_kind = æœç´¢ä»£ç â€¦ -code_search_unavailable = ä»£ç æœç´¢ç›®å‰ä¸å¯ç”¨ã€‚请è”系站点管ç†å‘˜ã€‚ -package_kind = æœç´¢è½¯ä»¶åŒ…… -project_kind = æœç´¢é¡¹ç›®â€¦ -branch_kind = æœç´¢åˆ†æ”¯â€¦ -commit_kind = æœç´¢æäº¤â€¦ -runner_kind = æœç´¢è¿è¡Œå™¨â€¦ +keyword_search_unavailable = å…³é”®è¯æœç´¢ç›®å‰ä¸å¯ç”¨ï¼Œè¯·è”系站点管ç†å‘˜ã€‚ +search = æœç´¢... +repo_kind = æœç´¢ä»“库... +user_kind = æœç´¢ç”¨æˆ·... +org_kind = æœç´¢ç»„织... +team_kind = æœç´¢å›¢é˜Ÿ... +code_kind = æœç´¢ä»£ç ... +code_search_unavailable = ä»£ç æœç´¢ç›®å‰ä¸å¯ç”¨ï¼Œè¯·è”系站点管ç†å‘˜ã€‚ +package_kind = æœç´¢è½¯ä»¶åŒ…... +project_kind = æœç´¢é¡¹ç›®... +branch_kind = æœç´¢åˆ†æ”¯... +commit_kind = æœç´¢æäº¤... +runner_kind = æœç´¢Runners... no_results = 未找到匹é…的结果。 type_tooltip = æœç´¢ç±»åž‹ fuzzy = 模糊 code_search_by_git_grep = 当剿œç´¢ç»“果由 git grep æä¾›ï¼Œå¦‚果站点管ç†å‘˜å¯ç”¨äº†ä»£ç ç´¢å¼•å¯èƒ½ä¼šæœ‰æ›´å¥½çš„结果。 match = åŒ¹é… match_tooltip = 仅包å«ä¸Žæœç´¢è¯å®Œå…¨åŒ¹é…的结果 -fuzzy_tooltip = 包å«ä¸Žæœç´¢è¯ç›¸è¿‘的结果 +fuzzy_tooltip = 在æœç´¢ç»“果中包å«ä¸Žæœç´¢è¯ç›¸è¿‘的项目 exact = 精确 -issue_kind = æœç´¢å·¥å•… -pull_kind = æœç´¢åˆå¹¶è¯·æ±‚… +issue_kind = æœç´¢å·¥å•... +pull_kind = æœç´¢åˆå¹¶è¯·æ±‚... exact_tooltip = 仅包å«ä¸Žæœç´¢è¯ç²¾ç¡®åŒ¹é…的结果 milestone_kind = æœç´¢é‡Œç¨‹ç¢‘… -union_tooltip = 包括与以空格分隔的关键字中任æ„一个相匹é…的结果 +union_tooltip = 包括与任何空格分隔的关键字匹é…的结果 union = 关键字 regexp = æ­£åˆ™è¡¨è¾¾å¼ regexp_tooltip = å°†æœç´¢å†…å®¹è§£é‡Šä¸ºæ­£åˆ™è¡¨è¾¾å¼ @@ -4066,7 +3975,7 @@ code.write = 写入:推é€åˆ°ä»“库,创建分支和标签。 code.read = 读å–:访问并克隆仓库的代ç ã€‚ actions.read = 读å–:查看集æˆçš„ CI/CD 管é“åŠå…¶æ—¥å¿—。 issues.write = 写入:关闭工å•并管ç†å…ƒæ•°æ®ï¼Œå¦‚标签ã€é‡Œç¨‹ç¢‘ã€æŒ‡æ´¾æˆå‘˜ã€æˆªæ­¢æ—¥æœŸå’Œä¾èµ–。 -releases.write = 写入:å‘布ã€ç¼–辑和删除版本å‘布åŠå…¶èµ„æºã€‚ +releases.write = 写入:å‘布ã€ç¼–辑和删除版本å‘布åŠå…¶èµ„产。 issues.read = 读å–:阅读并创建工å•和评论。 pulls.read = 读å–:阅读并创建åˆå¹¶è¯·æ±‚。 releases.read = 读å–:查看并下载版本å‘布。 @@ -4079,4 +3988,4 @@ actions.write = 写入:手动触å‘ã€é‡å¯ã€å–æ¶ˆæˆ–æ‰¹å‡†å¾…å¤„ç† ext_issues = 访问外部工å•系统的链接。æƒé™ç”±å¤–部管ç†ã€‚ ext_wiki = 访问外部百科的链接。æƒé™ç”±å¤–部管ç†ã€‚ projects.write = 写入:创建项目和列并进行编辑。 -pulls.write = 写入:关闭åˆå¹¶è¯·æ±‚并管ç†å…ƒæ•°æ®ï¼Œå¦‚标签ã€é‡Œç¨‹ç¢‘ã€æŒ‡æ´¾æˆå‘˜ã€æˆªæ­¢æ—¥æœŸå’Œä¾èµ–。 +pulls.write = 写入:关闭åˆå¹¶è¯·æ±‚并管ç†å…ƒæ•°æ®ï¼Œå¦‚标签ã€é‡Œç¨‹ç¢‘ã€æŒ‡æ´¾æˆå‘˜ã€æˆªæ­¢æ—¥æœŸå’Œä¾èµ–。 \ No newline at end of file diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 93744cbbcf..92ff5839e9 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -119,22 +119,6 @@ concept_user_individual = 個人 new_project = 新增專案 new_project_column = æ–°å¢žæ¬„ä½ filter.public = 公開 -remove_all = 移除全部 -admin_panel = ç¶²ç«™ç®¡ç† -add_all = 新增全部 -remove_label_str = 移除項目「%s〠-test = 測試 -new_repo.title = 新儲存庫 -new_migrate.title = æ–°é·ç§» -new_org.title = 新組織 -new_repo.link = 新儲存庫 -new_migrate.link = æ–°é·ç§» -new_org.link = 新組織 -copy_generic = 複製到剪貼簿 -copy_url = è¤‡è£½ç¶²å€ -copy_hash = 複製雜湊值 - -filter.private = ç§æœ‰åº« [aria] footer = é å°¾ @@ -229,6 +213,7 @@ create_new_account = 註冊帳戶 reset_password = 帳戶復原 [mail] + activate_account=請啟用您的帳戶 activate_email=è«‹é©—è­‰æ‚¨çš„éƒµç®±åœ°å€ @@ -494,7 +479,7 @@ editor.preview_changes=é è¦½æ›´æ”¹ editor.or=或 editor.cancel_lower=å–æ¶ˆ editor.commit_changes=æäº¤æ›´æ”¹å—Žï¼Ÿ -editor.commit_directly_to_this_branch=直接æäº¤åˆ° %[1]s 分支。 +editor.commit_directly_to_this_branch=直接æäº¤åˆ° %s 分支。 editor.create_new_branch=建立 新的分支 為此æäº¤å’Œé–‹å§‹åˆä½µè«‹æ±‚。 editor.cancel=å–æ¶ˆ editor.no_changes_to_show=沒有å¯ä»¥é¡¯ç¤ºçš„變更。 @@ -794,8 +779,6 @@ settings.branches.update_default_branch = æ›´æ–°é è¨­åˆ†æ”¯ -milestones.filter_sort.name = 組織å稱 - [graphs] [org] @@ -1081,8 +1064,6 @@ users = 使用者帳戶 defaulthooks = é è¨­ Webhook -config_settings = 組織設定 - [action] create_repo=建立了儲存庫 %s rename_repo=釿–°å‘½å儲存庫 %[1]s 為 %[3]s @@ -1140,6 +1121,9 @@ container.labels = 標籤 [secrets] [actions] + + + runners.name=組織å稱 runners.owner_type=èªè­‰é¡žåž‹ runners.description=組織æè¿° @@ -1154,5 +1138,4 @@ runners.labels = 標籤 [projects] [git.filemode] - -[search] +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 33f535c2fc..7437195b76 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -16,7 +16,7 @@ page=é é¢ template=æ¨¡æ¿ language=語言 notifications=通知 -active_stopwatch=啟動的時間追蹤器 +active_stopwatch=正在進行的時間追蹤 create_new=建立… user_profile_and_more=個人資料和設定… signed_in_as=已登入為 @@ -105,7 +105,7 @@ preview=é è¦½ loading=載入中… error=錯誤 -error404=您嘗試造訪的é é¢ä¸å­˜åœ¨ã€å·²è¢«ç§»é™¤ï¼Œæˆ–æ‚¨æ²’æœ‰æ¬Šé™æª¢è¦–該é é¢ã€‚ +error404=您嘗試造訪的é é¢ ä¸å­˜åœ¨ 或 æ‚¨æ²’æœ‰æ¬Šé™ æª¢è¦–è©²é é¢ã€‚ never=從來沒有 unknown=未知 @@ -166,7 +166,6 @@ new_repo.link = 新儲存庫 new_org.link = 新組織 new_repo.title = 新儲存庫 new_migrate.link = æ–°é·ç§» -copy_path = 複製路徑 [aria] navbar=導航列 @@ -198,16 +197,6 @@ buttons.ref.tooltip=引用å•題或åˆä½µè«‹æ±‚ buttons.enable_monospace_font=啟用等寬字型 buttons.disable_monospace_font=åœç”¨ç­‰å¯¬å­—åž‹ buttons.switch_to_legacy.tooltip = 使用舊版編輯器 -table_modal.placeholder.header = 表頭 -table_modal.placeholder.content = 內容 -table_modal.label.rows = 列 -table_modal.label.columns = 欄 -buttons.new_table.tooltip = 新增表格 -table_modal.header = 新增表格 -buttons.indent.tooltip = 使項目縮排一層 -buttons.unindent.tooltip = ä½¿é …ç›®å–æ¶ˆç¸®æŽ’一層 - -link_modal.header = æ–°å¢žé€£çµ [filter] string.asc=A - Z @@ -219,19 +208,19 @@ missing_csrf=錯誤的請求:未æä¾› CSRF 符記 invalid_csrf=錯誤的請求:無效的 CSRF 符記 not_found=找ä¸åˆ°ç›®æ¨™ã€‚ network_error=網路錯誤 -report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 Codeberg 上æœå°‹ç›¸é—œå•é¡Œï¼Œæˆ–åœ¨å¿…è¦æ™‚æå‡ºä¸€å€‹æ–°å•題。 +report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 Codeberg 上æœå°‹ç›¸é—œå•é¡Œï¼Œæˆ–åœ¨å¿…è¦æ™‚æå‡ºä¸€å€‹å•題。 server_internal = 伺æœå™¨å…§éƒ¨éŒ¯èª¤ [startpage] app_desc=一套極易架設的 Git æœå‹™ install=安è£å®¹æ˜“ platform=è·¨å¹³å° +platform_desc=Forgejo å¯ä»¥åœ¨æ‰€æœ‰èƒ½ç·¨è­¯ Go 語言的平å°ä¸ŠåŸ·è¡Œï¼šWindows,macOS,Linux,ARM 等。挑一個您喜歡的å§ï¼ lightweight=輕é‡ç´š lightweight_desc=一片便宜的 Raspberry Pi å°±å¯ä»¥æ»¿è¶³ Forgejo çš„æœ€ä½Žéœ€æ±‚ã€‚ç¯€çœæ‚¨çš„æ©Ÿå™¨è³‡æºï¼ license=開放原始碼 license_desc=å–å¾— Forgejo ï¼æˆç‚ºä¸€åè²¢ç»è€…和我們一起讓 Forgejo 更好,快點加入我們å§ï¼ install_desc = 輕鬆使用您平å°çš„å¯åŸ·è¡Œæª”,使用 Docker 部署,抑或是軟體包。 -platform_desc = Forgejo 已確èªå¯ä»¥åœ¨ Linux å’Œ FreeBSD 等自由作業系統和ä¸åŒçš„中央處ç†å™¨æž¶æ§‹ä¸Šé‹ä½œã€‚鏿“‡ä½ æ‰€æ„›çš„ï¼ [install] install=安è£é é¢ @@ -258,13 +247,13 @@ 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=無效的管ç†å“¡ä½¿ç”¨è€…å稱 +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 根目錄 @@ -295,21 +284,21 @@ 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=使用者åªèƒ½ä½¿ç”¨é…置的外部æœå‹™ä¾†å»ºç«‹æ–°å¸³è™Ÿã€‚ +disable_registration.description=ç¦æ­¢ä½¿ç”¨è€…è‡ªåŠ©è¨»å†Šï¼Œåªæœ‰ç®¡ç†å“¡å¯ä»¥æ–°å¢žå¸³è™Ÿã€‚ +allow_only_external_registration.description=åªå…許從外部æœå‹™è¨»å†Š openid_signin=啟用 OpenID 登入 -openid_signin.description=å…許使用者é€éŽ OpenID 登入。 +openid_signin.description=啟用 OpenID 登入。 openid_signup=啟用 OpenID 自助註冊 -openid_signup.description=如果啟用了自助註冊,則å…許使用者é€éŽ OpenID 建立帳號。 +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=建立管ç†å“¡å¸³è™Ÿæ˜¯é¸æ“‡æ€§çš„。第一個註冊的使用者將自動æˆç‚ºç®¡ç†å“¡ã€‚ +require_sign_in_view.description=僅有已登入的使用者能存å–é é¢ã€‚è¨ªå®¢åªæœƒçœ‹åˆ°ç™»å…¥å’Œè¨»å†Šé é¢ã€‚ +admin_setting.description=您ä¸éœ€è¦å»ºç«‹ç®¡ç†å“¡å¸³è™Ÿã€‚ 第一個註冊的使用者將自動æˆç‚ºç®¡ç†å“¡ã€‚ admin_title=管ç†å“¡å¸³è™Ÿè¨­å®š admin_name=管ç†å“¡å¸³è™Ÿå稱 admin_password=密碼 @@ -329,11 +318,11 @@ 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.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=éš±è—é›»å­ä¿¡ç®±çš„域å。例如,如果隱è—的電å­ä¿¡ç®±åŸŸå設定為「noreply.example.orgã€ï¼Œå¸³è™Ÿã€Œjoeã€å°‡ä»¥ã€Œjoe@noreply.example.orgã€çš„身分登入到 Git 中。 password_algorithm=密碼雜湊演算法 @@ -354,7 +343,7 @@ allow_only_external_registration = 僅å…許é€éŽå¤–部æœå‹™è¨»å†Š [home] uname_holder=帳號å稱或電å­ä¿¡ç®± password_holder=密碼 -switch_dashboard_context=切æ›å„€éŒ¶æ¿å…§å®¹ +switch_dashboard_context=切æ›å„€éŒ¶ç‰ˆå¸³è™Ÿ my_repos=儲存庫 show_more_repos=顯示更多儲存庫… collaborative_repos=åƒèˆ‡å”作的儲存庫 @@ -415,13 +404,13 @@ remember_me=記ä½é€™å°è£ç½® forgot_password_title=忘記密碼 forgot_password=忘記密碼? sign_up_now=還沒有帳號?馬上註冊。 -confirmation_mail_sent_prompt=新的確èªé›»å­éƒµä»¶å·²å‚³é€è‡³ %s。è¦å®Œæˆè¨»å†ŠéŽç¨‹ï¼Œè«‹æª¢æŸ¥ä½ çš„æ”¶ä»¶åŒ£ä¸¦åœ¨æŽ¥ä¸‹ä¾†çš„ %s 內按照æä¾›çš„連çµå®Œæˆè¨»å†Šæ‰‹çºŒã€‚如果電å­éƒµä»¶ä¸æ­£ç¢ºï¼Œä½ å¯ä»¥å†ç™»å…¥ä¸¦è«‹æ±‚å¦ä¸€å°æ–°çš„確èªé›»å­éƒµä»¶å‚³é€è‡³å…¶ä»–é›»å­ä¿¡ç®±ã€‚ +confirmation_mail_sent_prompt=已坄逿–°çš„確èªä¿¡è‡³ %s。請在 %s 內檢查您的收件匣並完æˆè¨»å†Šæ‰‹çºŒã€‚如果該 email 䏿­£ç¢ºï¼Œæ‚¨å¯ä»¥åœ¨ç™»å…¥å¾Œå†è«‹æ±‚䏀尿–°çš„確èªä¿¡åˆ°å¦ä¸€å€‹åœ°å€ã€‚ 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=é»žæ“Šæ­¤è™•ä¾†é‡æ–°ç™¼é€ç¢ºèªéƒµä»¶ @@ -461,7 +450,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=授權失效 sspi_auth_failed=SSPI èªè­‰å¤±æ•— @@ -472,7 +461,7 @@ change_unconfirmed_email = 如果您在註冊帳號時寫錯了信箱地å€ï¼Œ change_unconfirmed_email_error = 無法更改信箱地å€ï¼š%v tab_signup = 註冊 last_admin = 您無法刪除最後一個管ç†å“¡ã€‚必須至少有一個管ç†å“¡ã€‚ -prohibit_login_desc = 你的帳號已被暫åœèˆ‡ç«™é»žäº’動。è¯çµ¡ç«™é»žç®¡ç†å“¡ä»¥é‡æ–°ç²å¾—å­˜å–æ¬Šé™ã€‚ +prohibit_login_desc = æ‚¨çš„å¸³è™Ÿè¢«ç¦æ­¢ç™»å…¥ï¼Œè«‹é€£çµ¡ç¶²ç«™ç®¡ç†å“¡ã€‚ sign_up_successful = å·²æˆåŠŸå»ºç«‹å¸³è™Ÿã€‚æ­¡è¿Žï¼ invalid_code_forgot_password = 您的確èªä»£ç¢¼ç„¡æ•ˆæˆ–å·²éŽæœŸã€‚點擊這裡來開始一個新的連線階段。 reset_password_wrong_user = 您以 %s ç™»å…¥ï¼Œä½†æ˜¯å¸³è™Ÿå¾©åŽŸé€£çµæ˜¯çµ¦ %s çš„ @@ -485,8 +474,6 @@ hint_register = 需è¦ä¸€å€‹å¸³è™Ÿå—Žï¼Ÿé¦¬ä¸Šè¨»å†Šã€‚ sign_up_button = 馬上註冊。 sign_in_openid = 使用 OpenID 繼續 back_to_sign_in = 返回登入é é¢ -use_onetime_code = 使用一次性代碼 -unauthorized_credentials = æ†‘è­‰ä¸æ­£ç¢ºæˆ–å·²éŽæœŸã€‚é‡è©¦ä½ çš„命令或查看 %s 以ç²å–更多資訊 [mail] view_it_on=在 %s 上查看 @@ -566,11 +553,6 @@ removed_security_key.text_1 = 從您的帳號移除了安全金鑰「%[1]sã€ã€‚ account_security_caution.text_1 = 如果這是您,那您å¯ä»¥å®‰å…¨çš„忽略這則電å­éƒµä»¶ã€‚ account_security_caution.text_2 = å¦‚æžœé€™ä¸æ˜¯æ‚¨ï¼Œæ‚¨çš„帳號已被盜用。請連絡網站管ç†å“¡ã€‚ totp_disabled.text_1 = 你帳號上的基於時間的一次性密碼(TOTP)剛剛已åœç”¨ã€‚ -totp_enrolled.text_1.no_webauthn = 你剛剛為你的帳號啟用了 TOTP。這æ„å‘³è‘—å°‡ä¾†æ¯æ¬¡ç™»å…¥ä½ çš„帳號時,你都必須使用 TOTP 作為 2FA 方法。 -totp_enrolled.text_1.has_webauthn = 你剛剛為你的帳號啟用了 TOTP。這æ„å‘³è‘—å°‡ä¾†æ¯æ¬¡ç™»å…¥ä½ çš„帳號時,你å¯ä»¥ä½¿ç”¨ TOTP 作為 2FA 方法或使用任何安全金鑰。 -totp_enrolled.subject = 你已啟動 TOTP 作為 2FA 方法 -removed_security_key.no_2fa = 沒有å†é…置其他 2FA 方法,這表示ä¸å†éœ€è¦ä½¿ç”¨ 2FA 登入你的帳號。 -totp_disabled.no_2fa = 沒有å†é…置其他 2FA 方法,這表示ä¸å†éœ€è¦ä½¿ç”¨ 2FA 登入你的帳號。 [modal] yes=是 @@ -682,8 +664,6 @@ username_has_not_been_changed = 帳號å稱未被更改 admin_cannot_delete_self = 當您是管ç†å“¡æ™‚,您ä¸èƒ½åˆªé™¤è‡ªå·±ã€‚請先移除您的管ç†å“¡æ¬Šé™ã€‚ username_error_no_dots = ` åªèƒ½åŒ…å«è‹±æ•¸å­—符("0-9","a-z","A-Z"),破折號("-")和底線("_")。åªèƒ½ä»¥è‹±æ•¸å­—元開頭或çµå°¾ï¼Œé€£çºŒçš„éžè‹±æ•¸å­—元也ä¸è¢«å…許。` required_prefix = 輸入文字必須以「%sã€é–‹é ­ -username_claiming_cooldown =使用者å稱無法被èªé ˜ï¼Œå› ç‚ºå…¶å†·å»æœŸå°šæœªçµæŸã€‚å¯ä»¥åœ¨ %[1]s 後被èªé ˜ã€‚ -email_domain_is_not_allowed = 使用者電å­éƒµä»¶åœ°å€ %s 的網域與 EMAIL_DOMAIN_ALLOWLIST 或 EMAIL_DOMAIN_BLOCKLIST è¡çªã€‚確ä¿ä½ å·²æ­£ç¢ºè¨­å®šé›»å­éƒµä»¶åœ°å€ã€‚ [user] @@ -711,24 +691,19 @@ joined_on = æ–¼ %s 註冊 show_on_map = 在地圖上顯示這個地點 settings = 使用者設定 block_user = å°éŽ–ä½¿ç”¨è€… -block_user.detail_1 = ä½ å€‘å°‡åœæ­¢äº’相關注,並且無法互相關注。 -block_user.detail_2 = æ­¤ä½¿ç”¨è€…å°‡ç„¡æ³•èˆ‡ä½ æ“æœ‰çš„儲存庫或由你建立的å•題和評論進行互動。 +block_user.detail_1 = è©²ä½¿ç”¨è€…å·²åœæ­¢è¿½è¸ªæ‚¨ã€‚ +block_user.detail_2 = é€™å€‹ä½¿ç”¨è€…ç„¡æ³•å°æ‚¨çš„å„²å­˜åº«ã€æ‚¨æå‡ºçš„å•題或發表的留言åšå‡ºä»»ä½•æ“作。 followers_one = %d ä½è¿½è¹¤è€… following_one = 追蹤 %d 個人 -block_user.detail_3 = 你們將無法互相新增為儲存庫å”作者。 +block_user.detail_3 = 該使用者無法將您加為å”作者,您也無法將其加為å”作者。 follow_blocked_user = 因為這個使用者å°éŽ–æ‚¨æˆ–è¢«æ‚¨å°éŽ–ï¼Œæ‚¨ä¸èƒ½è¿½è¹¤æ­¤ä½¿ç”¨è€…。 block = å°éŽ– unblock = 解除å°éŽ– -block_user.detail = 請注æ„,å°éŽ–ä½¿ç”¨è€…é‚„æœ‰å…¶å®ƒå½±éŸ¿ï¼Œä¾‹å¦‚ï¼š +block_user.detail = 請注æ„,å°éŽ–æ­¤ä½¿ç”¨è€…å°‡æœƒå°Žè‡´ä»¥ä¸‹çµæžœã€‚例如: followers.title.one = ä½è¿½è¹¤è€… followers.title.few = ä½è¿½è¹¤è€… following.title.one = 關注中 following.title.few = 關注中 -public_activity.visibility_hint.admin_private = 由於你是管ç†å“¡ï¼Œå› æ­¤ä½ å¯ä»¥çœ‹åˆ°æ­¤æ´»å‹•ï¼Œä½†ä½¿ç”¨è€…å¸Œæœ›å°‡å…¶ä¿æŒç§å¯†ã€‚ -public_activity.visibility_hint.self_private_profile = 由於你的個人資料是ç§å¯†çš„ï¼Œå› æ­¤åªæœ‰ä½ å’Œç«™é»žç®¡ç†å“¡å¯ä»¥çœ‹åˆ°ä½ çš„æ´»å‹•。é…置。 -public_activity.visibility_hint.self_public = 除ç§äººç©ºé–“çš„äº’å‹•å¤–ï¼Œä½ çš„æ´»å‹•å°æ‰€æœ‰äººéƒ½å¯è¦‹ã€‚é…置。 -public_activity.visibility_hint.admin_public = æ¯å€‹äººéƒ½å¯ä»¥çœ‹åˆ°æ­¤æ´»å‹•,但作為管ç†å“¡ï¼Œä½ é‚„å¯ä»¥çœ‹åˆ°ç§äººç©ºé–“中的互動。 -public_activity.visibility_hint.self_private = 你的活動僅å°ä½ å’Œç«™é»žç®¡ç†å“¡å¯è¦‹ã€‚é…置。 [settings] profile=個人資料 @@ -798,14 +773,14 @@ 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_openid=OpenID åœ°å€ -theme_desc=此主題將在您已登入時套用於網站介é¢ã€‚ +theme_desc=這將是您在整個網站上的é è¨­ä½ˆæ™¯ä¸»é¡Œã€‚ primary=ä¸»è¦ activated=已啟用 requires_activation=需è¦å•Ÿå‹• @@ -1003,9 +978,9 @@ hints = æç¤º update_hints = æ›´æ–°æç¤º update_hints_success = æç¤ºå·²è¢«æ›´æ”¹ã€‚ added_on = æ–¼ %s 新增 -biography_placeholder = å‘別人簡單介紹一下自己ï¼ï¼ˆæ”¯æ´ Markdown) +biography_placeholder = 和我們介紹一下您自己å§ï¼ï¼ˆæ‚¨å¯ä»¥ä½¿ç”¨ Markdown) location_placeholder = 與其他人分享您粗略的地ç†ä½ç½® -profile_desc = 關於你 +profile_desc = 管ç†å…¶ä»–人如何看到您的個人資料。通知ã€å¯†ç¢¼å¾©åŽŸå’Œç¶²é ä¸Šçš„ Git æ“作會使用您的主è¦é›»å­ä¿¡ç®±ã€‚ hidden_comment_types.ref_tooltip = 註記哪些å•é¡Œï¼æäº¤ï¼â€¦ æåŠäº†æ­¤å•題 keep_activity_private = éš±è—個人é é¢ä¸­çš„æ´»å‹•資料 uploaded_avatar_is_too_big = ä¸Šå‚³æª”æ¡ˆçš„å¤§å° ï¼ˆ%d KiB)超éŽäº†ä¸Šé™ (%d KiB )。 @@ -1033,7 +1008,7 @@ ssh_signonly = å› ç‚ºç›®å‰ SSH 已被åœç”¨ï¼Œé€™å€‹é‡‘é‘°åªè¢«ç”¨ä¾†æ ¡é©—æ email_desc = 您的主è¦é›»å­ä¿¡ç®±å°‡è¢«ç”¨æ–¼é€šçŸ¥ã€å¯†ç¢¼å¾©åŽŸã€å’Œç¶²é  Git æ“ä½œï¼ˆå¦‚æžœæ‚¨çš„ä¿¡ç®±ä¸æ˜¯éš±è—的)。 pronouns_custom = 自訂 oauth2_client_secret_hint = é€™æŠŠå¯†é‘°åœ¨æ‚¨é›¢é–‹æˆ–é‡æ–°æ•´ç†æ­¤é é¢å¾Œå°‡ä¸å†è¢«é¡¯ç¤ºã€‚è«‹ç¢ºä¿æ‚¨å·²å„²å­˜å®ƒã€‚ -additional_repo_units_hint_description = å°æ–¼æœªå•Ÿç”¨æ‰€æœ‰å¯ç”¨åŠŸèƒ½çš„å„²å­˜åº«é¡¯ç¤ºã€Œå•Ÿç”¨æ›´å¤šã€æç¤ºã€‚ +additional_repo_units_hint_description = åœ¨æ²’æœ‰å•Ÿç”¨æ‰€æœ‰æ¨¡çµ„çš„å„²å­˜åº«ä¸­é¡¯ç¤ºã€Œæ–°å¢žæ›´å¤šæ¨¡çµ„â€¦ã€æŒ‰éˆ•。 hidden_comment_types.issue_ref_tooltip = 使用者更改與å•é¡Œç›¸é—œåˆ†æ”¯ï¼æ¨™ç±¤çš„留言 pronouns = 稱謂語 update_oauth2_application_success = 您已æˆåŠŸæ›´æ–°è©² OAuth2 應用程å¼ã€‚ @@ -1052,17 +1027,12 @@ webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法 user_unblock_success = å·²æˆåŠŸè§£é™¤å°æ­¤ä½¿ç”¨è€…çš„å°éŽ–ã€‚ webauthn_alternative_tip = 您å¯èƒ½æƒ³æ–°å¢žä¸€å€‹é¡å¤–的驗證方法。 user_block_success = å·²æˆåŠŸå°éŽ–æ­¤ä½¿ç”¨è€…ã€‚ -access_token_desc = 鏿“‡çš„ç¬¦è¨˜åƒ…æŽˆæ¬Šç›¸å°æ‡‰çš„ API路徑。請åƒé–±æ–‡ä»¶ä¾†äº†è§£æ›´å¤šã€‚ +access_token_desc = 鏿“‡çš„ç¬¦è¨˜åƒ…æŽˆæ¬Šç›¸å°æ‡‰çš„ API路徑。請åƒé–±æ–‡ä»¶ä¾†äº†è§£æ›´å¤šã€‚ oauth2_application_locked = å¯ä»¥åœ¨çµ„態中設定 Forgejo é å…ˆè¨»å†Šä¸€äº› OAuth2 應用程å¼ã€‚為了é¿å…ä¸å¯é æ–™çš„æƒ…æ³ï¼Œå®ƒå€‘無法被編輯或是移除。請åƒé–± OAuth2 文件來了解更多。 hidden_comment_types_description = 在這裡é¸å–çš„ç•™è¨€ç¨®é¡žå°‡ä¸æœƒé¡¯ç¤ºæ–¼å•題é é¢ä¸­ã€‚舉例來說,核å–「標籤ã€å°‡éš±è—所有「使用者新增ï¼ç§»é™¤äº†<標籤>ã€ç•™è¨€ã€‚ authorized_oauth2_applications_description = 您已授權給這些第三方應用程å¼å–用您的 Forgejo 個人帳號的權é™ã€‚請撤銷您ä¸å†ä½¿ç”¨çš„æ‡‰ç”¨ç¨‹å¼çš„æ¬Šé™ã€‚ language.localization_project = 幫助我們翻譯 Forgejo 至您的語言ï¼äº†è§£æ›´å¤šã€‚ language.description = 這個語言會被儲存至您的帳號,並被用作您登入後的é è¨­èªžè¨€ã€‚ -user_block_yourself = ä½ ä¸èƒ½å°éŽ–è‡ªå·±ã€‚ -pronouns_custom_label = 自訂代å詞 -change_username_redirect_prompt.with_cooldown.one = 舊的使用者å稱將在 %[1]d å¤©çš„å†·å»æœŸå¾Œå°æ‰€æœ‰äººé–‹æ”¾ï¼Œä½ ä»ç„¶å¯ä»¥åœ¨å†·å»æœŸå…§é‡æ–°ç²å¾—舊的使用者å稱。 -change_username_redirect_prompt.with_cooldown.few = 舊的使用者å稱將在 %[1]d å¤©çš„å†·å»æœŸå¾Œå°æ‰€æœ‰äººé–‹æ”¾ï¼Œä½ ä»ç„¶å¯ä»¥åœ¨å†·å»æœŸå…§é‡æ–°ç²å¾—舊的使用者å稱。 -keep_activity_private.description = ä½ çš„å…¬é–‹æ´»å‹•åªæœ‰ä½ å’Œç«™é»žç®¡ç†å“¡å¯è¦‹ã€‚ [repo] owner=所有者 @@ -1071,7 +1041,7 @@ repo_name=儲存庫å稱 repo_name_helper=好的儲存庫å稱通常是簡短的ã€å¥½è¨˜çš„ã€ä¸”ç¨ç‰¹çš„。 repo_size=å„²å­˜åº«å¤§å° template=範本 -template_select=鏿“‡ç¯„本 +template_select=鏿“‡ç¯„本。 template_helper=將儲存庫設為範本 template_description=å„²å­˜åº«ç¯„æœ¬è®“ä½¿ç”¨è€…å¯æ–°å¢žç›¸åŒç›®éŒ„çµæ§‹ã€æª”案以åŠè¨­å®šçš„儲存庫。 visibility=ç€è¦½æ¬Šé™ @@ -1094,17 +1064,17 @@ generate_from=產生自 repo_desc=æè¿° repo_desc_helper=輸入簡介 (é¸ç”¨) repo_lang=儲存庫語言 -repo_gitignore_helper=鏿“‡ .gitignore 範本 +repo_gitignore_helper=鏿“‡ .gitignore 範本。 repo_gitignore_helper_desc=從常見語言範本清單中挑é¸å¿½ç•¥è¿½è¹¤çš„æª”案。é è¨­æƒ…æ³ä¸‹å„種語言建置工具產生的特殊檔案都包å«åœ¨ .gitignore 中。 issue_labels=標籤 -issue_labels_helper=鏿“‡æ¨™ç±¤é›† +issue_labels_helper=鏿“‡å•題標籤集。 license=æŽˆæ¬Šæ¢æ¬¾ -license_helper=鏿“‡æŽˆæ¬Šæ¢æ¬¾æª”案 -license_helper_desc=æŽˆæ¬Šæ¢æ¬¾å®šç¾©äº†ä»–人使用您原始碼的å…è¨±å’Œç¦æ­¢äº‹é …。ä¸ç¢ºå®šå“ªå€‹é©ç”¨æ–¼æ‚¨çš„å°ˆæ¡ˆï¼ŸæŸ¥çœ‹é¸æ“‡æŽˆæ¬Šæ¢æ¬¾ã€‚ +license_helper=è«‹é¸æ“‡æŽˆæ¬Šæ¢æ¬¾æª”案。 +license_helper_desc=æŽˆæ¬Šæ¢æ¬¾å®šç¾©äº†ä»–人使用您原始碼的å…è¨±å’Œç¦æ­¢äº‹é …。ä¸ç¢ºå®šå“ªå€‹é©ç”¨æ–¼æ‚¨çš„å°ˆæ¡ˆï¼ŸæŸ¥çœ‹é¸æ“‡æŽˆæ¬Šæ¢æ¬¾ã€‚ readme=讀我檔案 -readme_helper=鏿“‡è®€æˆ‘檔案範本 +readme_helper=鏿“‡è®€æˆ‘檔案範本。 readme_helper_desc=這是您能為專案撰寫完整æè¿°çš„地方。 -auto_init=åˆå§‹åŒ–儲存庫 +auto_init=åˆå§‹åŒ–儲存庫(加入 .gitignoreã€æŽˆæ¬Šæ¢æ¬¾ã€è®€æˆ‘檔案) trust_model_helper=鏿“‡ç°½ç½²é©—證的信任模型。å¯ç”¨çš„é¸é …: trust_model_helper_collaborator=å”作者: ä¿¡ä»»å”作者的簽署 trust_model_helper_committer=æäº¤è€…: 信任與æäº¤è€…相符的簽署 @@ -1120,7 +1090,7 @@ mirror_interval_invalid=é¡åƒé€±æœŸç„¡æ•ˆã€‚ mirror_sync_on_commit=æŽ¨é€æäº¤å¾Œé€²è¡ŒåŒæ­¥ mirror_address=從 URL 拓製 mirror_address_desc=在授權資訊中填入必è¦çš„資料。 -mirror_lfs=大檔案儲存(LFS) +mirror_lfs=Large File Storage (LFS) mirror_lfs_desc=啟動 LFS 檔案的é¡åƒåŠŸèƒ½ã€‚ mirror_lfs_endpoint=LFS 端點 mirror_lfs_endpoint_desc=åŒæ­¥å°‡æœƒå˜—試使用 Clone URL ä¾†ç¢ºèª LFS 伺æœå™¨ã€‚如果存儲庫的 LFS 資料放在其他地方,您也å¯ä»¥æŒ‡å®šè‡ªè¨‚的端點。 @@ -1206,7 +1176,7 @@ 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_no_addr=é·ç§»å¤±æ•—。 migrate.github.description=從 github.com 或 GitHub Enterprise 伺æœå™¨é·ç§»è³‡æ–™ã€‚ @@ -1288,7 +1258,7 @@ ambiguous_runes_line=`這一行有易混淆的 Unicode å­—å…ƒ` ambiguous_character=`%[1]c [U+%04[1]X] 容易與 %[2]c [U+%04[2]X] æ··æ·†` escape_control_characters=Escape -unescape_control_characters=å–æ¶ˆè½‰ç¾© +unescape_control_characters=Unescape file_copy_permalink=è¤‡è£½æ°¸ä¹…é€£çµ view_git_blame=檢視 Git Blame video_not_supported_in_browser=您的ç€è¦½å™¨ä¸æ”¯æ´ HTML5 的「videoã€æ¨™ç±¤ã€‚ @@ -1329,8 +1299,7 @@ editor.or=或 editor.cancel_lower=å–æ¶ˆ editor.commit_signed_changes=æäº¤ç°½ç½²çš„變更 editor.commit_changes=æäº¤è®Šæ›´ -editor.add_tmpl=新增「<%s>〠-editor.add_tmpl.filename = 檔案 +editor.add_tmpl=新增「<檔案>〠editor.add=新增 %s editor.update=æ›´æ–° %s editor.delete=刪除 %s @@ -1340,7 +1309,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=直接æäº¤åˆ° %[1]s 分支。 +editor.commit_directly_to_this_branch=直接æäº¤åˆ° %s 分支。 editor.create_new_branch=為此æäº¤å»ºç«‹æ–°åˆ†æ”¯ä¸¦æå‡ºåˆä½µè«‹æ±‚。 editor.create_new_branch_np=為本次æäº¤å»ºç«‹æ–°åˆ†æ”¯ã€‚ editor.propose_file_change=æå‡ºæª”案變更 @@ -1404,7 +1373,7 @@ commitstatus.failure=失敗 commitstatus.pending=å¾…è™•ç† commitstatus.success=æˆåŠŸ -ext_issues=外部å•題 +ext_issues=å­˜å–外部å•題 ext_issues.desc=連çµåˆ°å¤–部å•題追蹤器。 projects=專案 @@ -1624,10 +1593,10 @@ issues.attachment.open_tab=`在新分é ä¸­æŸ¥çœ‹ã€Œ%sã€` issues.attachment.download=`點擊下載「%sã€` issues.subscribe=訂閱 issues.unsubscribe=å–æ¶ˆè¨‚é–± -issues.unpin_issue=å–æ¶ˆé‡˜é¸å•題 -issues.max_pinned=您ä¸èƒ½é‡˜é¸æ›´å¤šå•題 -issues.pin_comment=é‡˜é¸æ–¼ %s -issues.unpin_comment=å–æ¶ˆé‡˜é¸æ–¼ %s +issues.unpin_issue=å–æ¶ˆå›ºå®šå•題 +issues.max_pinned=您ä¸èƒ½å›ºå®šæ›´å¤šå•題 +issues.pin_comment=固定於 %s +issues.unpin_comment=å–æ¶ˆå›ºå®šæ–¼ %s issues.lock=鎖定å°è©± issues.unlock=解鎖å°è©± issues.lock.unknown_reason=由於未知的原因而無法鎖定å•題。 @@ -1650,13 +1619,13 @@ issues.comment_on_locked=您無法在已鎖定的å•題上留言。 issues.delete=刪除 issues.delete.title=刪除此å•題? issues.delete.text=您真的è¦åˆªé™¤æ­¤å•題嗎?(這將會永久移除所有內容。若您還想ä¿ç•™ï¼Œè«‹è€ƒæ…®æ”¹ç‚ºé—œé–‰å®ƒã€‚) -issues.tracker=時間追蹤器 -issues.start_tracking_short=開始計時器 +issues.tracker=時間追蹤 +issues.start_tracking_short=開始計時 issues.start_tracking=開始時間追蹤 issues.start_tracking_history=`開始工作 %s` issues.tracker_auto_close=當這個å•é¡Œè¢«é—œé–‰æ™‚ï¼Œè‡ªå‹•åœæ­¢è¨ˆæ™‚器 issues.tracking_already_started=`您已在å¦ä¸€å€‹å•題上開始時間追蹤ï¼` -issues.stop_tracking=åœæ­¢è¨ˆæ™‚器 +issues.stop_tracking=åœæ­¢è¨ˆæ™‚ issues.stop_tracking_history=`çµæŸå·¥ä½œ %s` issues.cancel_tracking=æ¨æ£„ issues.add_time=手動新增時間 @@ -1670,22 +1639,22 @@ issues.add_time_minutes=åˆ†é˜ issues.add_time_sum_to_small=沒有輸入時間。 issues.time_spent_total=總花費時間 issues.time_spent_from_all_authors=`總花費時間:%s` -issues.due_date=到期日 +issues.due_date=截止日期 issues.invalid_due_date_format=截止日期的格å¼å¿…須為「yyyy-mm-ddã€ã€‚ issues.error_modifying_due_date=無法修改截止日期。 issues.error_removing_due_date=無法移除截止日期。 issues.push_commit_1=加入了 %d 個æäº¤ %s issues.push_commits_n=加入了 %d 個æäº¤ %s -issues.force_push_codes=`強制推é€äº† %[1]s 自 %[2]s 至 %[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=新增截止日期 issues.due_date_form_edit=編輯 issues.due_date_form_remove=移除 -issues.due_date_not_set=未設定到期日。 -issues.due_date_added=新增了到期日 %s %s +issues.due_date_not_set=未設定截止日期。 +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_remove=移除了截止日期 %s %s issues.due_date_overdue=逾期 issues.due_date_invalid=截止日期無效或超出範åœï¼Œè«‹ä½¿ç”¨ã€Œyyyy-mm-ddã€çš„æ ¼å¼ã€‚ issues.dependency.title=先決æ¢ä»¶ @@ -1756,9 +1725,9 @@ compare.compare_base=基底分支 compare.compare_head=比較 pulls.desc=啟用åˆä½µè«‹æ±‚和程å¼ç¢¼å¯©æ ¸ã€‚ -pulls.new=æ–°åˆä½µè«‹æ±‚ +pulls.new=建立åˆä½µè«‹æ±‚ pulls.view=檢視åˆä½µè«‹æ±‚ -pulls.compare_changes=æ–°åˆä½µè«‹æ±‚ +pulls.compare_changes=建立åˆä½µè«‹æ±‚ pulls.allow_edits_from_maintainers=å…許維護者編輯 pulls.allow_edits_from_maintainers_desc=å°åŸºåº•分支有寫入權é™çš„使用者也å¯ä»¥æŽ¨é€åˆ°æ­¤åˆ†æ”¯ pulls.allow_edits_from_maintainers_err=更新失敗 @@ -1778,7 +1747,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=å°è©±å…§å®¹ @@ -1809,10 +1778,10 @@ pulls.num_conflicting_files_1=%d 個è¡çªçš„æª”案 pulls.num_conflicting_files_n=%d 個è¡çªçš„æª”案 pulls.approve_count_1=%d å€‹æ ¸å¯ pulls.approve_count_n=%d å€‹æ ¸å¯ -pulls.reject_count_1=%d 個變更請求 -pulls.reject_count_n=%d 個變更請求 -pulls.waiting_count_1=%d 個正在等待審核 -pulls.waiting_count_n=%d 個正在等待審核 +pulls.reject_count_1=%d 變更請求 +pulls.reject_count_n=%d 變更請求 +pulls.waiting_count_1=%d 等待審核 +pulls.waiting_count_n=%d 等待審核 pulls.wrong_commit_id=æäº¤ id 必須存在於目標分支上 pulls.no_merge_desc=無法進行åˆä½µï¼Œå› ç‚ºæ‰€æœ‰å„²å­˜åº«çš„åˆä½µé¸é …已被åœç”¨ã€‚ @@ -1885,9 +1854,9 @@ milestones.completeness=%d%% å·²å®Œæˆ milestones.create=建立里程碑 milestones.title=標題 milestones.desc=æè¿° -milestones.due_date=到期日(é¸ç”¨ï¼‰ +milestones.due_date=截止日期 (é¸ç”¨) milestones.clear=清除 -milestones.invalid_due_date_format=到期日的格å¼å¿…須為「yyyy-mm-ddã€ã€‚ +milestones.invalid_due_date_format=截止日期的格å¼å¿…須為「yyyy-mm-ddã€ã€‚ milestones.create_success=已建立里程碑「%sã€ã€‚ milestones.edit=編輯里程碑 milestones.edit_subheader=里程碑å¯ç”¨ä¾†çµ„ç¹”å•題和追蹤進度。 @@ -1903,7 +1872,7 @@ milestones.filter_sort.most_issues=å•題由多到少 milestones.filter_sort.least_issues=å•題由少到多 -ext_wiki=外部 Wiki +ext_wiki=å­˜å–外部 Wiki ext_wiki.desc=連çµå¤–部 Wiki。 wiki=Wiki @@ -1944,10 +1913,10 @@ activity.period.yearly=1 å¹´ activity.overview=概覽 activity.active_prs_count_1=%d 個åˆä½µè«‹æ±‚ activity.active_prs_count_n=%d 個åˆä½µè«‹æ±‚ -activity.merged_prs_count_1=å·²åˆä½µåˆä½µè«‹æ±‚ -activity.merged_prs_count_n=å·²åˆä½µåˆä½µè«‹æ±‚ -activity.opened_prs_count_1=å·²æå‡ºåˆä½µè«‹æ±‚ -activity.opened_prs_count_n=å·²æå‡ºåˆä½µè«‹æ±‚ +activity.merged_prs_count_1=åˆä½µ +activity.merged_prs_count_n=åˆä½µ +activity.opened_prs_count_1=æå‡ºåˆä½µè«‹æ±‚ +activity.opened_prs_count_n=æå‡ºåˆä½µè«‹æ±‚ activity.title.user_1=%d ä½ä½¿ç”¨è€… activity.title.user_n=%d ä½ä½¿ç”¨è€… activity.title.prs_1=%d 個åˆä½µè«‹æ±‚ @@ -1972,8 +1941,8 @@ activity.title.unresolved_conv_1=%d 個未解決的å°è©± activity.title.unresolved_conv_n=%d 個未解決的å°è©± activity.unresolved_conv_desc=這些最近更改的å•題和åˆä½µè«‹æ±‚尚未解決。 activity.unresolved_conv_label=開放 -activity.title.releases_1=%d 個發行 -activity.title.releases_n=%d 個發行 +activity.title.releases_1=%d 個版本 +activity.title.releases_n=%d 個版本 activity.title.releases_published_by=%[2]s發布了 %[1]s activity.published_release_label=發行 activity.no_git_activity=在此期間內沒有任何æäº¤å‹•態。 @@ -2030,28 +1999,28 @@ settings.mirror_settings.direction.pull=æ‹‰å– settings.mirror_settings.direction.push=æŽ¨é€ settings.mirror_settings.last_update=最近更新時間 settings.mirror_settings.push_mirror.none=未設定推é€é¡åƒ -settings.mirror_settings.push_mirror.remote_url=Git é ç«¯å„²å­˜åº«ç¶²å€ +settings.mirror_settings.push_mirror.remote_url=Git é ç«¯å„²å­˜åº« URL settings.mirror_settings.push_mirror.add=新增推é€é¡åƒ settings.sync_mirror=ç«‹å³åŒæ­¥ settings.site=網站 settings.update_settings=儲存設定 settings.branches.update_default_branch=æ›´æ–°é è¨­åˆ†æ”¯ -settings.branches.add_new_rule=增加新è¦å‰‡ +settings.branches.add_new_rule=加入新è¦å‰‡ settings.advanced_settings=進階設定 settings.wiki_desc=啟用儲存庫 Wiki settings.use_internal_wiki=使用內建 Wiki settings.use_external_wiki=使用外部 Wiki -settings.external_wiki_url=外部 Wiki ç¶²å€ +settings.external_wiki_url=外部 Wiki é€£çµ settings.external_wiki_url_error=外部 Wiki ç¶²å€ä¸æ˜¯æœ‰æ•ˆçš„ç¶²å€ã€‚ settings.external_wiki_url_desc=é»žæ“Šç™¾ç§‘åˆ†é æ™‚,使用者會被轉å€è‡³å¤–部百科的 URL。 settings.issues_desc=啟用儲存庫å•題追蹤器 settings.use_internal_issue_tracker=使用內建å•題追蹤器 settings.use_external_issue_tracker=使用外部å•題追蹤器 -settings.external_tracker_url=外部å•é¡Œè¿½è¹¤å™¨ç¶²å€ +settings.external_tracker_url=外部å•題追蹤器 URL settings.external_tracker_url_error=該外部å•題追蹤器 URL 無效。 settings.external_tracker_url_desc=點擊å•題é ç±¤æ™‚,使用者會被轉å€è‡³å¤–部å•題追蹤器 URL。 -settings.tracker_url_format=外部å•é¡Œè¿½è¹¤å™¨çš„ç¶²å€æ ¼å¼ +settings.tracker_url_format=外部å•題追蹤器的 URL æ ¼å¼ settings.tracker_url_format_error=該外部å•題追蹤器 URL æ ¼å¼ç„¡æ•ˆã€‚ settings.tracker_issue_style=外部å•é¡Œè¿½è¹¤å™¨çš„ç·¨è™Ÿæ ¼å¼ settings.tracker_issue_style.numeric=數字 @@ -2069,14 +2038,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.packages_desc=啟用儲存庫軟體註冊中心 settings.projects_desc=啟用儲存庫專案 settings.actions_desc=啟用儲存庫 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=最後索引的æäº¤ +settings.admin_indexer_commit_sha=最後索引的 SHA settings.admin_indexer_unindexed=未索引 settings.reindex_button=åŠ å…¥åˆ°é‡æ–°ç´¢å¼•佇列 settings.reindex_requested=å·²è«‹æ±‚é‡æ–°ç´¢å¼• @@ -2109,8 +2078,8 @@ settings.transfer_perform=進行轉移 settings.transfer_started=此儲存庫已被標記為待轉移且正在等待「%sã€çš„ç¢ºèª settings.transfer_succeed=已轉移儲存庫。 settings.signing_settings=簽署驗證設定 -settings.trust_model=簽署信任模型 -settings.trust_model.default=é è¨­ä¿¡ä»»æ¨¡åž‹ +settings.trust_model=ç°½ç½²ä¿¡ä»»æ¨¡å¼ +settings.trust_model.default=é è¨­ä¿¡ä»»æ¨¡å¼ settings.trust_model.default.desc=使用此 Forgejo çš„é è¨­å„²å­˜åº«ä¿¡ä»»æ¨¡å¼ã€‚ settings.trust_model.collaborator=å”作者 settings.trust_model.collaborator.long=å”作者:信任å”作者的簽署 @@ -2126,7 +2095,7 @@ settings.wiki_delete_desc=刪除儲存庫 Wiki 資料是永久的且ä¸å¯é‚„原 settings.wiki_delete_notices_1=- 這將會永久刪除與åœç”¨ %s 的儲存庫 Wiki。 settings.confirm_wiki_delete=刪除 Wiki 資料 settings.wiki_deletion_success=已刪除儲存庫的 Wiki 資料。 -settings.delete=刪除此儲存庫 +settings.delete=刪除本儲存庫 settings.delete_desc=刪除儲存庫是永久的且ä¸å¯é‚„原。 settings.delete_notices_1=- 此動作ä¸å¯é‚„原。 settings.delete_notices_2=- æ­¤æ“作將永久刪除 %s 儲存庫,包括程å¼ç¢¼ã€å•題ã€ç•™è¨€ã€Wiki 資料和å”作者設定。 @@ -2161,7 +2130,7 @@ settings.hooks_desc=當觸發æŸäº› Forgejo 事件時,Webhook 會自動發出 settings.webhook_deletion=移除 Webhook settings.webhook_deletion_desc=移除 Webhook 將刪除它的設定åŠå‚³é€è¨˜éŒ„,是å¦ç¹¼çºŒï¼Ÿ settings.webhook_deletion_success=Webhook 已移除。 -settings.webhook.test_delivery=測試交付 +settings.webhook.test_delivery=傳逿¸¬è©¦è³‡æ–™ settings.webhook.test_delivery_desc=使用å‡äº‹ä»¶æ¸¬è©¦æ­¤ Webhook。 settings.webhook.request=請求 settings.webhook.response=回應 @@ -2178,7 +2147,7 @@ settings.update_githook=æ›´æ–° Hook settings.add_webhook_desc=Forgejo 會發é€å«æœ‰æŒ‡å®š Content Type çš„ POST 請求到目標 URL。 在 Webhook 指å—閱讀更多內容。 settings.payload_url=目標 URL settings.http_method=HTTP 請求方法 -settings.content_type=POST 內容類型 +settings.content_type=POST Content Type settings.secret=Secret settings.slack_username=æœå‹™å稱 settings.slack_icon_url=圖示 URL @@ -2205,30 +2174,30 @@ 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_label_desc=更新或清除å•題標籤。 settings.event_issue_milestone=里程碑 -settings.event_issue_milestone_desc=里程碑已新增ã€å·²ç§»é™¤æˆ–已修改。 -settings.event_issue_comment=評註 +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=åˆä½µè«‹æ±‚標籤 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_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=åˆä½µè«‹æ±‚åŒæ­¥ settings.event_pull_request_sync_desc=åˆä½µè«‹æ±‚åŒæ­¥ã€‚ settings.event_package=軟體包 settings.event_package_desc=已在儲存庫中建立或刪除軟體包。 @@ -2242,7 +2211,7 @@ settings.add_hook_success=Webhook 新增æˆåŠŸã€‚ settings.update_webhook=æ›´æ–° Webhook settings.update_hook_success=å·²æˆåŠŸæ›´æ–° Webhook 。 settings.delete_webhook=移除 Webhook -settings.recent_deliveries=最近交付 +settings.recent_deliveries=最近傳é€è¨˜éŒ„ settings.hook_type=Hook 類型 settings.slack_token=符記 settings.slack_domain=域å @@ -2276,7 +2245,7 @@ settings.deploy_key_content=內容 settings.key_been_used=具有相åŒå…§å®¹çš„部署金鑰已在使用中。 settings.key_name_used=已有相åŒå稱的部署金鑰。 settings.add_key_success=已新增部署金鑰「%sã€ã€‚ -settings.deploy_key_deletion=移除部署金鑰 +settings.deploy_key_deletion=刪除部署金鑰 settings.deploy_key_deletion_desc=ç§»é™¤éƒ¨ç½²é‡‘é‘°å°‡æ‹’çµ•å®ƒå­˜å–æ­¤å„²å­˜åº«ã€‚是å¦ç¹¼çºŒï¼Ÿ settings.deploy_key_deletion_success=部署金鑰已移除。 settings.branches=分支 @@ -2286,7 +2255,7 @@ settings.protected_branch.delete_rule=刪除è¦å‰‡ settings.protected_branch_can_push=å…許推é€ï¼Ÿ settings.protected_branch_can_push_yes=ä½ å¯ä»¥æŽ¨é€ settings.protected_branch_can_push_no=ä½ ä¸èƒ½æŽ¨é€ -settings.branch_protection=分支「%sã€çš„ä¿è­·è¦å‰‡ +settings.branch_protection=%s 的分支ä¿è­· settings.protect_this_branch=啟用分支ä¿è­· settings.protect_this_branch_desc=防止刪除分支,並é™åˆ¶ Git 推é€èˆ‡åˆä½µåˆ°åˆ†æ”¯ã€‚ settings.protect_disable_push=åœç”¨æŽ¨é€ @@ -2298,35 +2267,35 @@ settings.protect_enable_merge_desc=任何有寫入權é™çš„人都å¯å°‡åˆä½µè«‹ settings.protect_whitelist_committers=使用白åå–®æŽ§ç®¡æŽ¨é€ settings.protect_whitelist_committers_desc=僅å…許白å單內的使用者或團隊推é€è‡³è©²åˆ†æ”¯(但ä¸å¯ä½¿ç”¨force push)。 settings.protect_whitelist_deploy_keys=å°‡æ“æœ‰å¯«å…¥æ¬Šé™çš„部署金鑰加入白å單。 -settings.protect_whitelist_users=å…許推é€çš„使用者 +settings.protect_whitelist_users=å…許推é€çš„使用者: settings.protect_whitelist_search_users=æœå°‹ä½¿ç”¨è€…... -settings.protect_whitelist_teams=å…許推é€çš„團隊 +settings.protect_whitelist_teams=å…許推é€çš„團隊: settings.protect_whitelist_search_teams=æœå°‹åœ˜éšŠ... settings.protect_merge_whitelist_committers=啟用åˆä½µç™½åå–® settings.protect_merge_whitelist_committers_desc=僅å…許白å單內的使用者或團隊將åˆä½µè«‹æ±‚åˆä½µè‡³è©²åˆ†æ”¯ã€‚ -settings.protect_merge_whitelist_users=å…許åˆä½µçš„使用者 -settings.protect_merge_whitelist_teams=å…許åˆä½µçš„團隊 +settings.protect_merge_whitelist_users=å…許åˆä½µçš„使用者: +settings.protect_merge_whitelist_teams=å…許åˆä½µçš„團隊: settings.protect_check_status_contexts=啟用狀態檢查 settings.protect_check_status_contexts_desc=åˆä½µå‰å¿…須先通éŽç‹€æ…‹æª¢æŸ¥ã€‚鏿“‡åˆä½µå‰å¿…須通éŽçš„æª¢æŸ¥ã€‚啟用時,必須先將æäº¤æŽ¨é€åˆ°å¦ä¸€å€‹åˆ†æ”¯ï¼Œé€šéŽç‹€æ…‹æª¢æŸ¥å¾Œå†åˆä½µæˆ–直接推é€åˆ°ç¬¦åˆè¦å‰‡çš„åˆ†æ”¯ã€‚å¦‚æžœæœªé¸æ“‡ä»»ä½•項目,最一個æäº¤å¿…å°‡æˆåŠŸé€šéŽç‹€æ…‹æª¢æŸ¥ã€‚ settings.protect_check_status_contexts_list=此儲存庫一週內曾進行éŽç‹€æ…‹æª¢æŸ¥ -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=僅接å—經簽署的æäº¤ settings.require_signed_commits_desc=拒絕未經簽署或未經驗證的æäº¤æŽ¨é€åˆ°æ­¤åˆ†æ”¯ã€‚ settings.protect_branch_name_pattern=å—ä¿è­·çš„分支åç¨±å¼æ¨£ -settings.protect_protected_file_patterns=å—ä¿è­·æª”æ¡ˆçš„å¼æ¨£ï¼ˆä»¥åŠå½¢åˆ†è™Ÿå€éš”「;ã€ï¼‰ -settings.protect_protected_file_patterns_desc=å³ä¾¿ä½¿ç”¨è€…æœ‰æ¬Šé™æ–°å¢žã€ä¿®æ”¹ã€åˆªé™¤æ­¤åˆ†æ”¯çš„æª”案,ä»ä¸å…許直接修改å—ä¿è­·çš„æª”案。å¯ä»¥ç”¨åŠå½¢åˆ†è™Ÿã€Œ;ã€åˆ†éš”å¤šå€‹å¼æ¨£ã€‚è«‹æ–¼ %[2]s æ–‡ä»¶æŸ¥çœ‹æ¨¡å¼æ ¼å¼ã€‚範例: .drone.yml, /docs/**/*.txt。 -settings.protect_unprotected_file_patterns=未å—ä¿è­·æª”æ¡ˆçš„å¼æ¨£ï¼ˆä»¥åŠå½¢åˆ†è™Ÿå€éš”「;ã€ï¼‰ -settings.protect_unprotected_file_patterns_desc=ç•¶ä½¿ç”¨è€…æœ‰å¯«å…¥æ¬Šé™æ™‚,å¯ç¹žé޿ލé€é™åˆ¶ï¼Œç›´æŽ¥ä¿®æ”¹æœªå—ä¿è­·çš„æª”案。å¯ä»¥ç”¨åŠå½¢åˆ†è™Ÿã€Œ;ã€åˆ†éš”多個模å¼ã€‚è«‹æ–¼ %[2]s æ–‡ä»¶æŸ¥çœ‹æ¨¡å¼æ ¼å¼ã€‚範例: .drone.yml, /docs/**/*.txt。 +settings.protect_protected_file_patterns=å—ä¿è­·çš„æª”æ¡ˆå¼æ¨£ (以分號å€éš”「;ã€): +settings.protect_protected_file_patterns_desc=å³ä¾¿ä½¿ç”¨è€…æœ‰æ¬Šé™æ–°å¢žã€ä¿®æ”¹ã€åˆªé™¤æ­¤åˆ†æ”¯çš„æª”案,ä»ä¸å…許直接修改å—ä¿è­·çš„æª”案。å¯ä»¥ç”¨åŠå½¢åˆ†è™Ÿã€Œ;ã€åˆ†éš”å¤šå€‹å¼æ¨£ã€‚è«‹æ–¼ %s æ–‡ä»¶æŸ¥çœ‹æ¨¡å¼æ ¼å¼ã€‚範例: .drone.yml, /docs/**/*.txt。 +settings.protect_unprotected_file_patterns=未å—ä¿è­·çš„æª”æ¡ˆæ¨¡å¼ (以分號å€éš”「;ã€): +settings.protect_unprotected_file_patterns_desc=ç•¶ä½¿ç”¨è€…æœ‰å¯«å…¥æ¬Šé™æ™‚,å¯ç¹žé޿ލé€é™åˆ¶ï¼Œç›´æŽ¥ä¿®æ”¹æœªå—ä¿è­·çš„æª”案。å¯ä»¥ç”¨åŠå½¢åˆ†è™Ÿã€Œ;ã€åˆ†éš”多個模å¼ã€‚è«‹æ–¼ %[2]s æ–‡ä»¶æŸ¥çœ‹æ¨¡å¼æ ¼å¼ã€‚範例: .drone.yml, /docs/**/*.txt。 settings.add_protected_branch=啟用ä¿è­· settings.delete_protected_branch=åœç”¨ä¿è­· -settings.protected_branch_deletion=刪除分支ä¿è­· +settings.protected_branch_deletion=åœç”¨åˆ†æ”¯ä¿è­· settings.protected_branch_deletion_desc=åœç”¨åˆ†æ”¯ä¿è­·å°‡å…許有寫入權é™çš„使用者推é€è‡³è©²åˆ†æ”¯ï¼Œæ˜¯å¦ç¹¼çºŒï¼Ÿ settings.block_rejected_reviews=有退回的審核時阻擋åˆä½µ settings.block_rejected_reviews_desc=如果官方審核人員æå‡ºè®Šæ›´è«‹æ±‚,å³ä½¿æœ‰è¶³å¤ çš„æ ¸å¯ä¹Ÿä¸å…許進行åˆä½µã€‚ @@ -2345,12 +2314,12 @@ settings.protected_branch_duplicate_rule_name=è¦å‰‡å稱已存在 settings.protected_branch_required_approvals_min=需è¦çš„æ ¸å¯æ•¸é‡ä¸èƒ½ç‚ºè² æ•¸ã€‚ settings.tags=標籤 settings.tags.protection=標籤ä¿è­· -settings.tags.protection.pattern=æ¨™ç±¤å¼æ¨£ +settings.tags.protection.pattern=æ¨™ç±¤æ ¼å¼ settings.tags.protection.allowed=å…許的 settings.tags.protection.allowed.users=å…許的使用者 settings.tags.protection.allowed.teams=å…許的團隊 -settings.tags.protection.allowed.noone=沒有人 -settings.tags.protection.create=新增è¦å‰‡ +settings.tags.protection.allowed.noone=ç„¡ +settings.tags.protection.create=ä¿è­·æ¨™ç±¤ settings.tags.protection.none=沒有å—ä¿è­·çš„æ¨™ç±¤ã€‚ settings.bot_token=Bot 符記 settings.chat_id=Chat ID @@ -2358,7 +2327,7 @@ settings.matrix.homeserver_url=Homeserver ç¶²å€ settings.matrix.room_id=èŠå¤©å®¤ ID settings.matrix.message_type=訊æ¯é¡žåž‹ settings.archive.button=å°å­˜å„²å­˜åº« -settings.archive.header=å°å­˜æ­¤å„²å­˜åº« +settings.archive.header=å°å­˜æœ¬å„²å­˜åº« settings.archive.success=此儲存庫已被å°å­˜ã€‚ settings.archive.error=嘗試å°å­˜å„²å­˜åº«æ™‚發生錯誤。查看日誌檔以ç²å¾—更多資訊。 settings.archive.error_ismirror=無法å°å­˜é¡åƒå„²å­˜åº«ã€‚ @@ -2372,19 +2341,19 @@ settings.lfs_findcommits=尋找æäº¤ settings.lfs_lfs_file_no_commits=找ä¸åˆ°å’Œæ­¤ LFS 檔案關è¯çš„æäº¤ settings.lfs_noattribute=此路徑在é è¨­åˆ†æ”¯ä¸­æ²’有å¯éŽ–å®šçš„å±¬æ€§ settings.lfs_delete=刪除 OID 為 %s çš„ LFS 檔案 -settings.lfs_delete_warning=刪除 LFS 檔案å¯èƒ½æœƒå°Žè‡´ç°½å‡ºæ™‚發生「物件ä¸å­˜åœ¨ã€çš„錯誤。你確定嗎? +settings.lfs_delete_warning=刪除 LFS 檔案å¯èƒ½æœƒé€ æˆ Checkout 時發生「物件ä¸å­˜åœ¨ã€çš„錯誤,您確定嗎? settings.lfs_findpointerfiles=尋找指標檔案 settings.lfs_locks=鎖定 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=強制解鎖 settings.lfs_pointers.found=找到 %d 個 blob 指標 - %d 個已關è¯, %d å€‹æœªé—œè¯ (%d 個從存放å€éºå¤±) -settings.lfs_pointers.sha=Blob 雜湊值 +settings.lfs_pointers.sha=Blob SHA settings.lfs_pointers.oid=OID settings.lfs_pointers.inRepo=在儲存庫中 settings.lfs_pointers.exists=å­˜åœ¨æ–¼å­˜æ”¾å€ @@ -2417,7 +2386,7 @@ diff.stats_desc=共有 %d 個檔案被更改,包括 diff.stats_desc_file=變更 %d 行:新增 %d 行,删除 %d 行 diff.bin=二進制 diff.bin_not_shown=æœªé¡¯ç¤ºäºŒé€²ä½æª”案。 -diff.view_file=檢視檔案 +diff.view_file=查看文件 diff.file_before=ä¹‹å‰ diff.file_after=之後 diff.file_image_width=寬度 @@ -2431,12 +2400,12 @@ diff.load=載入差異 diff.generated=自動產生的 diff.vendored=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=開始審核 diff.comment.reply=回覆 -diff.review=完æˆå¯©æ ¸ +diff.review=審核 diff.review.header=é€å‡ºå¯©æ ¸ diff.review.placeholder=審核æ„見 diff.review.comment=留言 @@ -2446,7 +2415,7 @@ diff.review.reject=請求變更 diff.review.self_approve=åˆä½µè«‹æ±‚的作者ä¸èƒ½æ ¸å¯è‡ªå·±çš„åˆä½µè«‹æ±‚ diff.committed_by=æäº¤è€… diff.protected=å—ä¿è­· -diff.image.side_by_side=並排 +diff.image.side_by_side=並列 diff.image.swipe=滑動 diff.image.overlay=é‡ç–Š diff.has_escaped=這一行有隱è—çš„ Unicode å­—å…ƒ @@ -2457,7 +2426,7 @@ releases.desc=追蹤專案版本和檔案下載。 release.releases=版本發布 release.detail=版本詳情 release.tags=標籤 -release.new_release=新發行 +release.new_release=發布新版本 release.draft=è‰ç¨¿ release.prerelease=é ç™¼è¡Œ release.stable=穩定 @@ -2478,12 +2447,12 @@ release.title_empty=標題ä¸å¯ç‚ºç©ºã€‚ release.prerelease_desc=標記為 Pre-Release release.prerelease_helper=標記此版本ä¸é©åˆç”Ÿç”¢ä½¿ç”¨ã€‚ release.cancel=å–æ¶ˆ -release.publish=發佈發行 +release.publish=發布版本 release.save_draft=儲存è‰ç¨¿ -release.edit_release=更新發行 -release.delete_release=刪除發行 +release.edit_release=更新發布 +release.delete_release=刪除發布 release.delete_tag=刪除標籤 -release.deletion=刪除發行 +release.deletion=刪除發布 release.deletion_success=已刪除此版本發布。 release.deletion_tag_desc=å³å°‡å¾žå„²å­˜åº«ç§»é™¤æ­¤æ¨™ç±¤ã€‚儲存庫內容和歷å²å°‡ä¿æŒä¸è®Šï¼Œæ˜¯å¦ç¹¼çºŒï¼Ÿ release.deletion_tag_success=已刪除此標籤。 @@ -2494,7 +2463,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 的標籤 @@ -2539,7 +2508,7 @@ topic.manage_topics=管ç†ä¸»é¡Œ topic.done=å®Œæˆ topic.count_prompt=æ‚¨æœ€å¤šèƒ½é¸æ“‡ 25 個主題 -find_file.go_to_file=尋找檔案 +find_file.go_to_file=移至檔案 find_file.no_matching=找ä¸åˆ°ç¬¦åˆçš„æª”案 error.csv.too_large=無法渲染此檔案,因為它太大了。 @@ -2659,7 +2628,7 @@ signing.wont_sign.approved = 因為åˆä½µè«‹æ±‚沒有被核å¯ï¼Œé€™å€‹åˆä½µä¸ activity.navbar.recent_commits = 最近的æäº¤ issues.comment.blocked_by_user = 因為您被該儲存庫的所有者或å•題的æå‡ºè€…å°éŽ–ï¼Œæ‚¨ä¸èƒ½åœ¨é€™å‰‡å•題上留言。 pulls.closed = åˆä½µè«‹æ±‚已關閉 -pulls.title_desc_one = 想從 %[2]s åˆä½µ %[1]d 個æäº¤è‡³ %[3]s +pulls.title_desc_one = 想從 %[2]s åˆä½µ %[1]d 個æäº¤è‡³ %[3]s pulls.merged_title_desc_one = æ–¼ %[4]s 自 %[2]s åˆä½µäº† %[1]d 個æäº¤è‡³ %[3]s issues.archived_label_description = (已å°å­˜ï¼‰%s signing.wont_sign.always = æ°¸é ç°½ç½²æäº¤ã€‚ @@ -2671,7 +2640,7 @@ pulls.commit_ref_at = `在æäº¤ %[2]s 引用了 pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。 pulls.cmd_instruction_merge_title = åˆä½µ pulls.ready_for_review = å¯ä»¥é–‹å§‹å¯©é–±äº†å—Žï¼Ÿ -pulls.cmd_instruction_hint = `檢視命令列指示` +pulls.cmd_instruction_hint = `檢視 命令列指示` file_follow = 跟隨象徵å¼é€£çµ milestones.filter_sort.earliest_due_data = 最早到期日 size_format = %[1]s:%[2]s,%[3]s:%[4]s @@ -2694,7 +2663,7 @@ pulls.blocked_by_changed_protected_files_n = 這個åˆä½µè«‹æ±‚被暫止,因 pulls.status_checks_hide_all = éš±è—æ‰€æœ‰æª¢æŸ¥ pulls.status_checks_show_all = 顯示所有檢查 pulls.reopen_failed.head_branch = 因為這個åˆä½µè«‹æ±‚çš„ head 分支ä¸å­˜åœ¨ï¼Œå®ƒç„¡æ³•被開啟。 -activity.navbar.pulse = å‹•æ…‹ +activity.navbar.pulse = 脈æ signing.will_sign = 將以金鑰「%sã€ç°½ç½²é€™å€‹æäº¤ã€‚ signing.wont_sign.headsigned = 因為 head æäº¤æ²’有被簽署,這個åˆä½µä¸æœƒè¢«ç°½ç½²ã€‚ signing.wont_sign.commitssigned = 因為所有相關的æäº¤éƒ½æ²’有被簽署,這個åˆä½µä¸æœƒè¢«ç°½ç½²ã€‚ @@ -2721,7 +2690,7 @@ milestones.filter_sort.name = å稱 settings.units.overview = 概覽 settings.federation_settings = è¯é‚¦è¨­å®š issues.author.tooltip.issue = 這個使用者是這個å•題的作者。 -settings.units.add_more = 啟用更多 +settings.units.add_more = 新增更多... release.download_count_one = %s 次下載 release.download_count_few = %s 次下載 pulls.cmd_instruction_checkout_title = 簽出 @@ -2754,122 +2723,12 @@ no_eol.tooltip = 此檔案ä¸åŒ…å«è¡Œå°¾å­—元。 n_release_one = %s 發行 n_release_few = %s 發行 no_eol.text = 無檔案çµå°¾ç¬¦ -issues.all_title = 全部 -mirror_public_key = 公共 SSH 金鑰 -mirror_use_ssh.text = 使用 SSH é©—è­‰ -issues.filter_sort.relevance = é—œè¯æ€§ -settings.mirror_settings.push_mirror.none_ssh = ç„¡ -mirror_use_ssh.not_available = SSH é©—è­‰ä¸å¯ç”¨ã€‚ -new_from_template = 使用範本 -new_advanced = 進階設定 -new_advanced_expand = 點擊以展開 -editor.commit_email = æäº¤é›»å­ä¿¡ç®± -archive.pull.noreview = 此儲存庫已å°å­˜ã€‚ä½ ä¸èƒ½å¯©é–±åˆä½µè«‹æ±‚。 -settings.matrix.access_token_helper = 建議為此設定一個專用的 Matrix 帳號。存å–符記å¯ä»¥å¾ž Element 網路使用者端(於ç§äººï¼éš±èº«åˆ†é ï¼‰> 使用者é¸å–®ï¼ˆå·¦ä¸Šè§’)> 所有設定 > 幫助和關於 > 進階 > å­˜å–ç¬¦è¨˜ï¼ˆä½æ–¼ Homeserver ç¶²å€æ­£ä¸‹æ–¹ï¼‰æª¢ç´¢ã€‚關閉ç§äººï¼éš±èº«åˆ†é ï¼ˆç™»å‡ºå°‡ä½¿å­˜å–符記失效)。 -release.title = 發行標題 -settings.protect_patterns = 弿¨£ -mirror_use_ssh.helper = ç•¶ä½ é¸æ“‡æ­¤é¸é …時,Forgejo å°‡é€éŽ Git SSH é¡åƒå„²å­˜åº«ä¸¦ç‚ºä½ å»ºç«‹é‡‘é‘°å°ã€‚你必須確ä¿å·²ç”¢ç”Ÿçš„公鑰已有授權æ‰èƒ½æŽ¨é€è‡³ç›®æ¨™å„²å­˜åº«ã€‚鏿“‡æ­¤é¸é …時,你ä¸èƒ½ä½¿ç”¨åŸºæ–¼å¯†ç¢¼çš„æŽˆæ¬Šã€‚ -settings.event_pull_request_review_request = 審核請求 -settings.protect_new_rule = 建立新的分支ä¿è­·è¦å‰‡ -settings.remove_protected_branch_success = 分支ä¿è­·è¦å‰‡ã€Œ%sã€å·²è¢«ç§»é™¤ã€‚ -release.hide_archive_links_helper = éš±è—æ­¤ç™¼è¡Œè‡ªå‹•產生的原始碼å°å­˜ã€‚例如,如果你正在自行上載。 -settings.enforce_on_admins_desc = 儲存庫管ç†å“¡ä¸èƒ½ç¹žéŽæ­¤è¦å‰‡ã€‚ -release.message = æè¿°æ­¤ç™¼è¡Œ -release.deletion_desc = åˆªé™¤ç™¼è¡Œåªæœƒå°‡å…¶å¾ž Forgejo ä¸­ç§»é™¤ã€‚å®ƒä¸æœƒå½±éŸ¿ Git 標籤ã€å„²å­˜åº«çš„內容或其歷å²è¨˜éŒ„。繼續? -settings.unarchive.error = å˜—è©¦å–æ¶ˆå°å­˜å„²å­˜åº«æ™‚發生錯誤。請åƒé–±æ—¥èªŒä»¥äº†è§£æ›´å¤šè©³ç´°è³‡è¨Šã€‚ -release.invalid_external_url = 無效的外部網å€ï¼š%s -release.add_external_asset = 新增外部資產 -release.asset_name = 資產å稱 -release.type_external_asset = 外部資產 -branch.tag_collision = 無法建立分支「%sã€ï¼Œå› ç‚ºå„²å­˜åº«ä¸­å·²å­˜åœ¨åŒå標籤。 -settings.protect_status_check_patterns = ç‹€æ…‹æª¢æŸ¥å¼æ¨£ -branch.delete_desc = 刪除分支是永久性的。雖然被刪除的分支在實際被移除之å‰å¯èƒ½æœƒç¹¼çºŒå­˜åœ¨ä¸€å°æ®µæ™‚間,但是大多數情æ³ä¸‹å®ƒæ˜¯ç„¡æ³•撤銷的。繼續? -release.system_generated = 此附件是自動產生的。 -topic.format_prompt = ä¸»é¡Œå¿…é ˆä»¥å­—æ¯æˆ–數字開頭,å¯ä»¥åŒ…å«åŠå½¢ç ´æŠ˜è™Ÿï¼ˆ-)和點(.),最長 35 個字元。字æ¯å¿…須是å°å¯«ã€‚ -settings.remove_protected_branch_failed = 移除分支ä¿è­·è¦å‰‡ã€Œ%sã€å¤±æ•—。 -branch.warning_rename_default_branch = ä½ æ­£åœ¨é‡æ–°å‘½åé è¨­åˆ†æ”¯ã€‚ -settings.rename_branch_failed_protected = ç„¡æ³•é‡æ–°å‘½å分支 %s,因為它是å—ä¿è­·çš„分支。 -settings.unarchive.success = 此儲存庫已æˆåŠŸå–æ¶ˆå°å­˜ã€‚ -settings.unarchive.text = å–æ¶ˆå°å­˜å„²å­˜åº«å°‡æ¢å¾©å…¶æŽ¥æ”¶æäº¤å’ŒæŽ¨é€ï¼Œä»¥åŠæ–°å•題和åˆä½µè«‹æ±‚的能力。 -release.hide_archive_links = éš±è—自動產生的å°å­˜ -settings.protect_no_valid_status_check_patterns = æ²’æœ‰æœ‰æ•ˆçš„ç‹€æ…‹æª¢æŸ¥å¼æ¨£ã€‚ -settings.enforce_on_admins = 為儲存庫管ç†å“¡å¼·åˆ¶åŸ·è¡Œæ­¤è¦å‰‡ -settings.wiki_rename_branch_main_notices_2 = é€™å°‡æ°¸ä¹…é‡æ–°å‘½å儲存庫 %s çš„ Wiki çš„å…§éƒ¨åˆ†æ”¯ã€‚ç¾æœ‰çš„ç°½å‡ºå°‡éœ€è¦æ›´æ–°ã€‚ -settings.discord_icon_url.exceeds_max_length = 圖示網å€é•·åº¦å¿…é ˆå°æ–¼æˆ–等於 2048 個字符 -settings.wiki_branch_rename_success = 儲存庫 Wiki 的分支å稱已æˆåŠŸè¦ç¯„化。 -commits.view_single_diff = 查看此æäº¤ä¸­å°æ­¤æäº¤çš„變更 -issues.new.assign_to_me = 指派給我 -mirror_denied_combination = ä¸èƒ½çµ„åˆä½¿ç”¨å…¬é‘°å’ŒåŸºæ–¼å¯†ç¢¼çš„驗證。 -settings.update_settings_no_unit = 儲存庫至少應該å…許æŸç¨®å½¢å¼çš„交互。 -pulls.edit.already_changed = 無法儲存å°åˆä½µè«‹æ±‚的變更。看起來內容已被å¦ä¸€å€‹ä½¿ç”¨è€…è®Šæ›´ã€‚è«‹é‡æ–°æ•´ç†é é¢ä¸¦å˜—è©¦å†æ¬¡ç·¨è¼¯ä»¥é¿å…覆蓋其變更 -settings.add_collaborator_blocked_our = 無法新增å”ä½œè€…ï¼Œå› ç‚ºå„²å­˜åº«æ“æœ‰è€…å·²å°éŽ–ä»–å€‘ã€‚ -issues.edit.already_changed = 無法儲存å°å•題的變更。看起來內容已被å¦ä¸€å€‹ä½¿ç”¨è€…è®Šæ›´ã€‚è«‹é‡æ–°æ•´ç†é é¢ä¸¦å˜—è©¦å†æ¬¡ç·¨è¼¯ä»¥é¿å…覆蓋其變更 -settings.federation_following_repos = 關注儲存庫的網å€ã€‚以åŠå½¢åˆ†è™Ÿã€Œ;ã€åˆ†éš”,沒有空格。 -settings.federation_not_enabled = 你的站點上未啟用è¯é‚¦ã€‚ -settings.federation_apapiurl = 此儲存庫的è¯é‚¦ç¶²å€ã€‚將其複製並貼上至å¦ä¸€å€‹å„²å­˜åº«çš„è¯é‚¦è¨­å®šä¸­ä½œç‚ºé—œæ³¨å„²å­˜åº«çš„ç¶²å€ã€‚ -settings.enter_repo_name = æº–ç¢ºè¼¸å…¥æ“æœ‰è€…和儲存庫å稱,如下所示: -settings.wiki_rename_branch_main = è¦ç¯„化 Wiki 分支å稱 -settings.wiki_branch_rename_failure = 無法è¦ç¯„化儲存庫 Wiki 的分支å稱。 -settings.confirm_wiki_branch_rename = 釿–°å‘½å Wiki 分支 -settings.transfer_quota_exceeded = æ–°æ“æœ‰è€…(%s)已超出é…é¡ã€‚儲存庫尚未轉移。 -settings.wiki_rename_branch_main_notices_1 = æ­¤æ“作無法撤銷。 -settings.push_mirror_sync_in_progress = ç›®å‰æ­£åœ¨å°‡è®Šæ›´æŽ¨é€è‡³é ç«¯ %s。 -settings.confirmation_string = 確èªå­—串 -issues.review.pending.tooltip = 其他使用者目å‰çœ‹ä¸åˆ°æ­¤ç•™è¨€ã€‚è¦æäº¤ä½ çš„å¾…è™•ç†ç•™è¨€ï¼Œè«‹é¸æ“‡é é¢é ‚部的「%sã€->「%s/%s/%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 = 你沒有權é™åˆªé™¤é ­åˆ†æ”¯ã€‚ -settings.pull_mirror_sync_in_progress = ç›®å‰æ­£åœ¨å¾žé ç«¯ %s 拉å–變更。 -settings.pull_mirror_sync_quota_exceeded = é…é¡å·²è¶…å‡ºï¼Œä¸æ‹‰å–變更。 -settings.wiki_globally_editable = å…許任何人編輯 Wiki -settings.transfer_abort_success = 轉移儲存庫至 %s å·²æˆåŠŸå–æ¶ˆã€‚ -settings.add_collaborator_blocked_them = 無法新增å”作者,因為他們已å°éŽ–å„²å­˜åº«æ“æœ‰è€…。 -settings.add_webhook.invalid_path = 路徑ä¸èƒ½åŒ…å«ã€Œ.ã€ã€ã€Œ..ã€æˆ–空字串。它ä¸èƒ½ä»¥æ–œç·šé–‹é ­æˆ–çµå°¾ã€‚ -settings.webhook.test_delivery_desc_disabled = è¦ä½¿ç”¨è™›å‡äº‹ä»¶æ¸¬è©¦æ­¤ Webhook,請啟動它。 -settings.webhook.replay.description_disabled = è¦é‡æ’­æ­¤ Webhook,請啟動它。 -settings.wiki_rename_branch_main_desc = å°‡ Wiki å…§éƒ¨ä½¿ç”¨çš„åˆ†æ”¯é‡æ–°å‘½å為「%sã€ã€‚此變更是永久性的,無法撤消。 -settings.mirror_settings.push_mirror.copy_public_key = 複製公鑰 -settings.default_update_style_desc = 用於更新è½å¾Œæ–¼åŸºç¤Žåˆ†æ”¯çš„åˆä½µè«‹æ±‚çš„é è¨­æ›´æ–°æ¨¡å¼ã€‚ -summary_card_alt = 儲存庫 %s 的摘è¦å¡ -pulls.recently_pushed_new_branches = 你已於 %[2]s 推é€åˆ†æ”¯ %[1]s -pulls.sign_in_require = 登入以建立新的åˆä½µè«‹æ±‚。 -issues.num_reviews_one = %d 則審閱 -issues.num_reviews_few = %d 則審閱 -new_from_template_description = ä½ å¯ä»¥é¸æ“‡æ­¤ç«™é»žä¸Šç¾æœ‰çš„儲存庫範本並套用其設定。 -auto_init_description = 使用 README é–‹å§‹ Git æ­·å²è¨˜éŒ„並å¯é¸æ“‡æ–°å¢ž License å’Œ .gitignore 檔案。 -issues.reaction.add = æ–°å¢žåæ‡‰ -issues.reaction.alt_few = %[1]s å° %[2]s åšå‡ºäº†å應。 -issues.reaction.alt_many = %[1]s å’Œå¦å¤– %[2]d äººå° %[3]s åšå‡ºäº†å應。 -issues.context.menu = 留言é¸å–® -issues.summary_card_alt = 儲存庫 %[2]s 中標題為「%[1]sã€çš„å•題摘è¦å¡ -release.summary_card_alt = 儲存庫 %[2]s 中å為「%[1]sã€çš„發行摘è¦å¡ -error.broken_git_hook = 此儲存庫的 Git 鉤å­ä¼¼ä¹Žå·²æå£žã€‚請按照文件修復它們,然後推é€ä¸€äº›æäº¤ä»¥é‡æ–°æ•´ç†ç‹€æ…‹ã€‚ -issues.reaction.alt_remove = 從留言中移除 %[1]s çš„åæ‡‰ã€‚ - -vendored = 已供應 -settings.mirror_settings.docs.doc_link_pull_section = 文件中的「從é ç«¯å„²å­˜åº«æ‹‰å–ã€éƒ¨åˆ†ã€‚ -settings.event_pull_request_review_request_desc = åˆä½µè«‹æ±‚審核請求或審核請求已移除。 -settings.protect_status_check_patterns_desc = 輸入模å¼ä»¥æŒ‡å®šå…¶ä»–分支在åˆä½µåˆ°å—æ­¤è¦å‰‡ä¿è­·çš„分支å‰å¿…須通éŽçš„狀態檢查。æ¯è¡ŒæŒ‡å®šä¸€å€‹æ¨¡å¼ï¼Œæ¨¡å¼ä¸å¾—為空白。 -settings.protect_invalid_status_check_pattern = 狀態檢查模å¼ç„¡æ•ˆ: 「%sã€ã€‚ -settings.ignore_stale_approvals_desc = ä¸è¨ˆç®—在較舊æäº¤ä¸Šé€²è¡Œçš„æ ¸å¯ï¼ˆéŽæ™‚的審核)作為åˆä½µè«‹æ±‚çš„æ ¸å¯æ•¸é‡ã€‚å¦‚æžœéŽæ™‚çš„å¯©æ ¸å·²ç¶“è¢«æ¨æ£„,則無關緊è¦ã€‚ -settings.tags.protection.pattern.description = 您å¯ä»¥ä½¿ç”¨å–®ä¸€å稱或 glob æ¨¡å¼æˆ–正則表é”å¼ä¾†åŒ¹é…多個標籤。詳情請åƒé–± å—ä¿è­·æ¨™ç±¤æŒ‡å—。 -settings.thread_id = 線程 ID -settings.archive.text = å°å­˜å„²å­˜åº«å°‡ä½¿å…¶å®Œå…¨è®Šç‚ºå”¯è®€ã€‚它將從儀表æ¿ä¸­éš±è—。沒有人(甚至包括您ï¼ï¼‰å°‡èƒ½å¤ é€²è¡Œæ–°çš„æäº¤ï¼Œæˆ–打開任何å•題或åˆä½µè«‹æ±‚。 -diff.comment.add_line_comment = 新增行評論 -pulls.editable = å¯ä»¥ç·¨è¼¯ -settings.units.units = 功能 -diff.git-notes.add = 增加註釋 -diff.git-notes.remove-header = 移除註釋 -settings.event_pull_request_enforcement = 執行 [graphs] -component_loading = %s載入中… +component_loading = 載入中 %s… code_frequency.what = 寫程å¼é »çއ recent_commits.what = 最近的æäº¤ contributors.what = è²¢ç» -component_loading_info = 這å¯èƒ½éœ€è¦ä¸€é»žæ™‚間… -component_loading_failed = 無法載入 %s -component_failed_to_load = 發生了æ„外錯誤。 [org] org_name_holder=組織å稱 @@ -2882,8 +2741,8 @@ teams=團隊 code=程å¼ç¢¼ lower_members=åæˆå“¡ lower_repositories=個儲存庫 -create_new_team=新團隊 -create_team=建立團隊 +create_new_team=建立團隊 +create_team=建立新的團隊 org_desc=æè¿° team_name=團隊å稱 team_desc=æè¿° @@ -2899,7 +2758,7 @@ form.create_org_not_allowed=æ­¤å¸³è™Ÿç¦æ­¢å»ºç«‹çµ„織。 settings=設定 settings.options=組織 -settings.full_name=å…¨å +settings.full_name=組織全å settings.website=官方網站 settings.location=æ‰€åœ¨åœ°å€ settings.permission=æ¬Šé™ @@ -2916,7 +2775,7 @@ settings.update_setting_success=組織設定已更新。 settings.change_orgname_redirect_prompt=舊的å稱被領用å‰å°‡æœƒè½‰å€è‡³æ–°å稱。 settings.update_avatar_success=已更新組織的大頭貼。 settings.delete=刪除組織 -settings.delete_account=刪除此組織 +settings.delete_account=刪除這個組織 settings.delete_prompt=該組織將被永久刪除。此動作ä¸å¯é‚„åŽŸï¼ settings.confirm_delete_account=確èªåˆªé™¤ settings.delete_org_title=刪除組織 @@ -2927,27 +2786,27 @@ settings.labels_desc=在此處新增的標籤å¯ç”¨æ–¼æ­¤çµ„織下的所 members.membership_visibility=æˆå“¡ç€è¦½æ¬Šé™ï¼š members.public=å¯è¦‹ -members.public_helper=è¨­ç‚ºéš±è— +members.public_helper=éš±è— members.private=éš±è— -members.private_helper=設為顯示 +members.private_helper=顯示 members.member_role=æˆå“¡è§’色: members.owner=所有者 members.member=普通æˆå“¡ members.remove=移除 members.remove.detail=確定è¦å¾ž %[2]s 中刪除 %[1]s 嗎? members.leave=離開 -members.leave.detail=你確定你è¦é›¢é–‹çµ„織「%sã€å—Žï¼Ÿ +members.leave.detail=確定è¦é›¢é–‹ %s 嗎? members.invite_desc=邀請新的用戶加入 %s: 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=æ²’æœ‰æ¬Šé™ +teams.none_access_helper=æˆå“¡ç„¡æ³•檢視此單元或å°å…¶åŸ·è¡Œå…¶ä»–動作,這å°å…¬é–‹å„²å­˜åº«æ²’有影響。 +teams.general_access=ä¸€èˆ¬æ¬Šé™ teams.general_access_helper=æˆå“¡æ¬Šé™å°‡ç”±ä¸‹åˆ—權é™è¡¨æ±ºå®šã€‚ teams.read_access=è®€å– teams.read_access_helper=æˆå“¡å¯ä»¥æŸ¥çœ‹å’Œ Clone 團隊儲存庫。 @@ -2994,10 +2853,6 @@ open_dashboard = é–‹å•Ÿå„€éŒ¶æ¿ settings.email = è¯çµ¡é›»å­éƒµä»¶ form.name_pattern_not_allowed = 組織å稱中ä¸å…è¨±ä½¿ç”¨å¼æ¨£ã€Œ%sã€ã€‚ follow_blocked_user = 你無法關注此組織,因為此組織已å°éŽ–ä½ ã€‚ -teams.invite.title = 你已被邀請加入組織 %[2]s 中的團隊 %[1]s。 -settings.change_orgname_prompt = 注æ„:變更組織å稱也會變更你組織的網å€ä¸¦é‡‹æ”¾èˆŠå稱。 -settings.change_orgname_redirect_prompt.with_cooldown.few = 舊的組織å稱將在 %[1]d å¤©çš„å†·å»æœŸå¾Œå°æ‰€æœ‰äººå¯ç”¨ï¼Œä½ ä»ç„¶å¯ä»¥åœ¨å†·å»æœŸå…§é‡æ–°ä½¿ç”¨èˆŠå稱。 -settings.change_orgname_redirect_prompt.with_cooldown.one = 舊的組織å稱將在 %[1]d å¤©çš„å†·å»æœŸå¾Œå°æ‰€æœ‰äººå¯ç”¨ï¼Œæ‚¨ä»ç„¶å¯ä»¥åœ¨å†·å»æœŸå…§é‡æ–°ä½¿ç”¨èˆŠå稱。 [admin] dashboard=è³‡è¨Šä¸»é  @@ -3087,9 +2942,9 @@ dashboard.delete_old_actions.started=從資料庫刪除所有舊行為的任務 dashboard.update_checker=更新檢查器 dashboard.delete_old_system_notices=從資料庫刪除所有舊系統æç¤º dashboard.gc_lfs=å° LFS meta objects 進行垃圾回收 -dashboard.stop_zombie_tasks=åœæ­¢æ®­å± Actions 任務 -dashboard.stop_endless_tasks=åœæ­¢æ°¸ä¸åœæ­¢çš„ Actions 任務 -dashboard.cancel_abandoned_jobs=å–æ¶ˆå·²æ”¾æ£„çš„ Actions 作業 +dashboard.stop_zombie_tasks=åœæ­¢æ®­å±ä»»å‹™ +dashboard.stop_endless_tasks=åœæ­¢æ°¸ä¸åœæ­¢çš„任務 +dashboard.cancel_abandoned_jobs=å–æ¶ˆå·²æ”¾æ£„的作業 users.user_manage_panel=ä½¿ç”¨è€…å¸³è™Ÿç®¡ç† users.new_account=建立使用者帳號 @@ -3114,10 +2969,10 @@ 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_admin=管ç†å“¡å¸³è™Ÿ -users.is_restricted=å—é™åˆ¶çš„帳號 +users.is_activated=使用者帳號已啟用 +users.prohibit_login=ç¦æ­¢ç™»å…¥ +users.is_admin=是管ç†å“¡ +users.is_restricted=å—é™åˆ¶çš„ users.allow_git_hook=å¯ä»¥å»ºç«‹ Git Hook users.allow_git_hook_tooltip=Git Hook 將以和 Forgejo 相åŒçš„ä½œæ¥­ç³»çµ±ä½¿ç”¨è€…åŸ·è¡Œï¼Œä¸¦æ“æœ‰åŒç­‰çš„ä¸»æ©Ÿå­˜å–æ¬Šé™ã€‚å› æ­¤æ“æœ‰æ­¤ç‰¹æ®Š Git Hook 權é™çš„使用者å¯å­˜å–和修改所有的 Forgejo 儲存庫和 Forgejo 的資料庫。他們甚至能å–å¾— Forgejo 的管ç†å“¡æ¬Šé™ã€‚ users.allow_import_local=å¯ä»¥åŒ¯å…¥æœ¬åœ°å„²å­˜åº« @@ -3165,7 +3020,7 @@ orgs.new_orga=新增組織 repos.repo_manage_panel=å„²å­˜åº«ç®¡ç† repos.unadopted=未接管的儲存庫 -repos.unadopted.no_more=找ä¸åˆ°æœªæŽ¥ç®¡çš„儲存庫。 +repos.unadopted.no_more=找ä¸åˆ°å…¶ä»–未接管的儲存庫 repos.owner=所有者 repos.name=å稱 repos.private=ç§æœ‰ @@ -3176,8 +3031,8 @@ repos.issues=å•題數 repos.size=å¤§å° packages.package_manage_panel=è»Ÿé«”åŒ…ç®¡ç† -packages.total_size=總大å°ï¼š%s -packages.unreferenced_size=未åƒè€ƒå¤§å°ï¼š%s +packages.total_size=總大å°: %s +packages.unreferenced_size=未åƒè€ƒå¤§å°: %s packages.owner=所有者 packages.creator=建立者 packages.name=å稱 @@ -3210,7 +3065,7 @@ auths.host=ä¸»æ©Ÿåœ°å€ auths.port=連接埠 auths.bind_dn=Bind DN auths.bind_password=Bind 密碼 -auths.user_base=使用者æœå°‹åŸºæº– +auths.user_base=用戶æœå°‹åŸºæº– auths.user_dn=用戶 DN auths.attribute_username=帳號屬性 auths.attribute_username_placeholder=留空將使用於 Forgejo 輸入的帳號。 @@ -3221,12 +3076,12 @@ auths.attribute_ssh_public_key=SSH 公鑰屬性 auths.attribute_avatar=大頭貼屬性 auths.attributes_in_bind=從 Bind DN 中å–得屬性資訊 auths.allow_deactivate_all=å…許在æœå°‹çµæžœç‚ºç©ºç™½æ™‚åœç”¨æ‰€æœ‰ä½¿ç”¨è€…帳號 -auths.use_paged_search=ä½¿ç”¨åˆ†é æœå°‹ +auths.use_paged_search=ä½¿ç”¨åˆ†é æŸ¥è©¢ auths.search_page_size=é é¢å¤§å° auths.filter=使用者篩é¸å™¨ auths.admin_filter=管ç†è€…篩é¸å™¨ auths.restricted_filter=å—é™åˆ¶çš„篩é¸å™¨ -auths.restricted_filter_helper=留白以ä¸é™åˆ¶ä»»ä½•使用者。使用åŠå½¢æ˜Ÿè™Ÿã€Œ*ã€ä»¥å°‡æ‰€æœ‰ä¸ç¬¦åˆç®¡ç†å“¡ç¯©é¸æ¢ä»¶çš„使用者設定為å—é™ã€‚ +auths.restricted_filter_helper=留白則ä¸é™åˆ¶ä»»ä½•使用者。使用米字「*ã€å°‡æ‰€æœ‰ä¸ç¬¦åˆç®¡ç†å“¡ç¯©é¸æ¢ä»¶çš„使用者設定為å—é™ã€‚ auths.verify_group_membership=é©—è­‰ LDAP 群組æˆå“¡è³‡æ ¼ (篩é¸å™¨ç•™ç©ºä»¥è·³éŽ) auths.group_search_base=群組æœå°‹çš„ Base DN auths.group_attribute_list_users=包å«ä½¿ç”¨è€…清單的群組屬性 @@ -3238,16 +3093,16 @@ auths.ms_ad_sa=MS AD æœå°‹å±¬æ€§ auths.smtp_auth=SMTP 驗證類型 auths.smtphost=SMTP ä¸»æ©Ÿåœ°å€ auths.smtpport=SMTP 連接埠 -auths.allowed_domains=å…許的域å -auths.allowed_domains_helper=留白以å…許所有域å。以åŠå½¢é€—號(,)分隔多個域å。 -auths.skip_tls_verify=ç•¥éŽ TLS é©—è­‰ +auths.allowed_domains=域å白åå–® +auths.allowed_domains_helper=留白以å…許所有域å。以åŠå½¢é€—號「,ã€åˆ†éš”多個域å。 +auths.skip_tls_verify=忽略 TLS é©—è­‰ auths.force_smtps=強制 SMTPS auths.force_smtps_helper=SMTPS 總是使用 465 埠。設定此é¸é …以強制 SMTPS 使用其他埠。(除此之外若主機支æ´çš„話 STARTTLS 也會使用該埠。) auths.helo_hostname=HELO 主機å稱 auths.helo_hostname_helper=用 HELO 傳é€çš„主機å稱。留空以傳é€ç›®å‰çš„主機å稱。 auths.disable_helo=åœç”¨ HELO auths.pam_service_name=PAM æœå‹™å稱 -auths.pam_email_domain=PAM é›»å­ä¿¡ç®±åŸŸå(é¸ç”¨ï¼‰ +auths.pam_email_domain=PAM é›»å­ä¿¡ç®±åŸŸå (é¸ç”¨) auths.oauth2_provider=OAuth2 æä¾›è€… auths.oauth2_icon_url=圖示 URL auths.oauth2_clientID=客戶端 ID (金鑰) @@ -3261,7 +3116,7 @@ auths.oauth2_emailURL=é›»å­éƒµä»¶ URL auths.skip_local_two_fa=è·³éŽæœ¬åœ°å…©æ­¥é©Ÿé©—è­‰ auths.skip_local_two_fa_helper=ä¿æŒæœªè¨­å®šä»£è¡¨ä½¿ç”¨å…©æ­¥é©Ÿé©—證的本地使用者ä»ç„¶éœ€è¦é€šéŽå…©æ­¥é©Ÿé©—è­‰æ‰èƒ½ç™»å…¥ auths.oauth2_tenant=租戶 -auths.oauth2_scopes=é¡å¤–çš„ç¯„åœ +auths.oauth2_scopes=é¡å¤–çš„æŽˆæ¬Šç¯„åœ (Scope) auths.oauth2_required_claim_name=必須填寫 Claim å稱 auths.oauth2_required_claim_name_helper=填寫此å稱以é™åˆ¶ Claim 中有此å稱的使用者æ‰èƒ½å¾žæ­¤ä¾†æºç™»å…¥ auths.oauth2_required_claim_value=必須填寫 Claim 值 @@ -3285,19 +3140,19 @@ auths.sspi_default_language_helper=SSPI èªè­‰æ–¹æ³•自動建立之使用者的 auths.tips=幫助æç¤º auths.tips.oauth2.general=OAuth2 èªè­‰ auths.tip.oauth2_provider=OAuth2 æä¾›è€… -auths.tip.bitbucket=註冊新的 OAuth 使用者端並加入權é™ã€ŒAccount - Readã€ã€‚ç¶²å€ï¼š%s +auths.tip.bitbucket=註冊新的 OAuth 用戶端並加入權é™ã€ŒAccount - Readã€ã€‚ç¶²å€ï¼š%s auths.tip.nextcloud=在您的站點上,於é¸å–®ã€Œè¨­å®š -> 安全性 -> OAuth 2.0 客戶端ã€è¨»å†Šæ–°çš„ OAuth 客戶端 auths.tip.dropbox=建立新的 App。網å€ï¼š%s auths.tip.facebook=註冊新的應用程å¼ä¸¦æ–°å¢žç”¢å“「Facebook 登入ã€ã€‚ç¶²å€ï¼š%s auths.tip.github=註冊新的 OAuth 應用程å¼ã€‚ç¶²å€ï¼š%s auths.tip.gitlab=註冊新的應用程å¼ã€‚ç¶²å€ï¼šhttps://gitlab.com/profile/applications -auths.tip.google_plus=從 Google API 控制å°å–å¾— OAuth2 使用者端憑證。網å€ï¼š%s +auths.tip.google_plus=從 Google API 控制å°å–å¾— OAuth2 用戶端憑證。網å€ï¼š%s auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 -auths.tip.twitter=å‰å¾€ %s,建立應用程å¼ä¸¦ç¢ºä¿å•Ÿç”¨äº†ã€Œå…許此應用程å¼ç”¨æ–¼ä½¿ç”¨ Twitter 登入ã€é¸é … -auths.tip.discord=在 %s ä¸Šè¨»å†Šæ–°æ‡‰ç”¨ç¨‹å¼ +auths.tip.twitter=建立應用程å¼ä¸¦ç¢ºä¿æœ‰å•Ÿç”¨ã€ŒAllow this application to be used to Sign in with Twitterã€ã€‚ç¶²å€ï¼š%s +auths.tip.discord=註冊新的應用程å¼ã€‚ç¶²å€ï¼š%s auths.tip.yandex=在 %s 建立新的應用程å¼ã€‚請在「Yandex.Passport APIã€å€å¡Šé¸æ“‡é¸æ“‡ä¸‹åˆ—權é™ï¼šã€ŒAccess to email addressã€ã€ã€ŒAccess to user avatarã€å’Œã€ŒAccess to username, first name and surname, gender〠auths.tip.mastodon=輸入您想用來èªè­‰çš„ Mastodon 站點的自訂網å€ï¼ˆæˆ–使用é è¨­å€¼ï¼‰ -auths.edit=編輯èªè­‰ä¾†æº +auths.edit=修改èªè­‰ä¾†æº auths.activated=該èªè­‰ä¾†æºå·²å•Ÿç”¨ auths.new_success=已新增èªè­‰ã€Œ%sã€ã€‚ auths.update_success=已更新èªè­‰ä¾†æºã€‚ @@ -3317,28 +3172,28 @@ config.app_name=站點標題 config.app_ver=Forgejo 版本 config.app_url=Forgejo 基底 URL config.custom_conf=設定檔路徑 -config.custom_file_root_path=自訂檔案根路徑 +config.custom_file_root_path=自訂檔案根目錄 config.domain=伺æœå™¨åŸŸå config.offline_mode=æœ¬åœ°æ¨¡å¼ -config.disable_router_log=åœç”¨è·¯ç”±æ—¥èªŒ +config.disable_router_log=關閉路由日誌 config.run_user=以使用者å稱執行 config.run_mode=åŸ·è¡Œæ¨¡å¼ config.git_version=Git 版本 -config.repo_root_path=儲存庫根路徑 -config.lfs_root_path=LFS 根路徑 +config.repo_root_path=儲存庫目錄 +config.lfs_root_path=LFS 根目錄 config.log_file_root_path=日誌路徑 config.script_type=腳本類型 -config.reverse_auth_user=åå‘代ç†èªè­‰ä½¿ç”¨è€… +config.reverse_auth_user=åå‘代ç†èªè­‰ config.ssh_config=SSH 設定 config.ssh_enabled=已啟用 -config.ssh_start_builtin_server=使用內建伺æœå™¨ +config.ssh_start_builtin_server=使用內建的伺æœå™¨ config.ssh_domain=SSH 伺æœå™¨åŸŸå config.ssh_port=連接埠 config.ssh_listen_port=監è½åŸ  config.ssh_root_path=根路徑 config.ssh_key_test_path=金鑰測試路徑 -config.ssh_keygen_path=金鑰產生(ssh-keygen)路徑 +config.ssh_keygen_path=金鑰產生 (' ssh-keygen ') 路徑 config.ssh_minimum_key_size_check=金鑰最å°å¤§å°æª¢æŸ¥ config.ssh_minimum_key_sizes=金鑰最å°å¤§å° @@ -3358,19 +3213,19 @@ config.db_path=資料庫路徑 config.service_config=æœå‹™è¨­å®š config.register_email_confirm=è¦æ±‚註冊時確èªé›»å­éƒµä»¶ -config.disable_register=åœç”¨è‡ªåŠ©è¨»å†Š +config.disable_register=關閉註冊功能 config.allow_only_internal_registration=åªå…許從 Forgejo 註冊 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=需è¦ç™»å…¥æ‰èƒ½ç€è¦½å…§å®¹ -config.mail_notify=啟用電å­éƒµä»¶é€šçŸ¥ +config.require_sign_in_view=需è¦ç™»å…¥æ‰èƒ½ç€è¦½é é¢ +config.mail_notify=啟用郵件通知 config.enable_captcha=啟用驗證碼 -config.active_code_lives=å•Ÿå‹•ç¢¼éŽæœŸæ™‚é–“ +config.active_code_lives=å•Ÿç”¨ç”¨æˆ¶é€£çµæœ‰æ•ˆæœŸ config.reset_password_code_lives=帳號復原碼有效時間 config.default_keep_email_private=é è¨­éš±è—é›»å­ä¿¡ç®± -config.default_allow_create_organization=é è¨­å…許建立組織 +config.default_allow_create_organization=é è¨­å…許新增組織 config.enable_timetracking=啟用時間追蹤 config.default_enable_timetracking=é è¨­å•Ÿç”¨æ™‚間追蹤 config.default_allow_only_contributors_to_track_time=åªè®“è²¢ç»è€…追蹤時間 @@ -3407,7 +3262,7 @@ config.oauth_enabled=啟用æœå‹™ config.cache_config=å¿«å–設定 config.cache_adapter=å¿«å–轉接器(adapter) config.cache_interval=å¿«å–週期 -config.cache_conn=å¿«å–連接 +config.cache_conn=Cache 連接字符串 config.cache_item_ttl=å¿«å–é …ç›® TTL config.session_config=Session 設定 @@ -3444,7 +3299,7 @@ config.xorm_log_sql=記錄 SQL config.set_setting_failed=寫入設定值 %s 失敗 -monitor.cron=定時任務 +monitor.cron=Cron 任務 monitor.name=å稱 monitor.schedule=任務安排 monitor.next=下次執行時間 @@ -3477,7 +3332,7 @@ monitor.queue.settings.submit=更新設定 monitor.queue.settings.changed=已更新設定 notices.system_notice_list=系統æç¤º -notices.view_detail_header=æç¤ºè©³æƒ… +notices.view_detail_header=查看æç¤ºç´°ç¯€ notices.operations=æ“作 notices.select_all=全部é¸å– notices.deselect_all=å–æ¶ˆæ‰€æœ‰é¸å– @@ -3504,15 +3359,15 @@ monitor.stats = 統計資料 self_check.no_problem_found = 未發ç¾ä»»ä½•å•題。 config.send_test_mail_submit = å¯„é€ users.details = 使用者詳細資訊 -assets = 程å¼ç¢¼è³‡ç”¢ -dashboard.sync_branch.started = åˆ†æ”¯åŒæ­¥å·²é–‹å§‹ +assets = 程å¼ç¢¼è³‡æ–™ +dashboard.sync_branch.started = å·²é–‹å§‹åŒæ­¥åˆ†æ”¯ dashboard.rebuild_issue_indexer = é‡å»ºå•題索引 repos.lfs_size = LFS å¤§å° packages.cleanup = æ¸…é™¤éŽæœŸçš„資料 packages.cleanup.success = å·²æˆåŠŸæ¸…é™¤éŽæœŸè³‡æ–™ monitor.processes_count = %d å€‹ç¨‹åº monitor.queue.settings.remove_all_items = 全部移除 -identity_access = èº«åˆ†å’Œå­˜å– +identity_access = èº«åˆ†å’Œå­˜å–æ¬Šé™ config.cache_test = æ¸¬è©¦å¿«å– config_settings = 設定 config_summary = æ¦‚è¦ @@ -3529,36 +3384,8 @@ dashboard.start_schedule_tasks = 開始計劃 Actions 任務 auths.default_domain_name = 用於電å­éƒµä»¶åœ°å€çš„é è¨­åŸŸå users.organization_creation.description = å…許建立新組織。 config.app_slogan = 站點å£è™Ÿ -self_check = 自助檢查 -config.logger_name_fmt = 日誌:%s -monitor.queue.review_add = 審閱ï¼å¢žåŠ  Worker -self_check.database_fix_mysql = å°æ–¼ MySQLï¼MariaDB 的使用者,你å¯ä»¥ä½¿ç”¨å‘½ä»¤ã€Œforgejo doctor convertã€ä¾†ä¿®å¾©æŽ’åºè¦å‰‡å•題,或者你也å¯ä»¥æ‰‹å‹•é€éŽã€ŒALTER ... COLLATE ...ã€SQL 修復å•題。 -monitor.duration = æŒçºŒæ™‚間(秒) -systemhooks.desc = ç•¶æŸäº› Forgejo 事件觸發時,Webhook 會自動å‘伺æœå™¨ç™¼å‡º HTTP POST 請求。此處定義的 Webhook 將作用於系統上的所有儲存庫,因此請考慮這å¯èƒ½ç”¢ç”Ÿçš„任何效能影響。更多資訊請åƒè€ƒWebhook 指å—。 -self_check.database_inconsistent_collation_columns = 資料庫正在使用排åºè¦å‰‡ %s,但是這些欄使用的排åºè¦å‰‡ä¸ç›¸ç¬¦ã€‚這å¯èƒ½æœƒå¼•èµ·ä¸€äº›æ„æƒ³ä¸åˆ°çš„å•題。 -users.block.description = 阻止此使用者é€éŽå…¶å¸³è™Ÿèˆ‡æ­¤æœå‹™äº’å‹•ä¸¦ç¦æ­¢ç™»å…¥ã€‚ -auths.tip.gitlab_new = 在 %s ä¸Šè¨»å†Šæ–°æ‡‰ç”¨ç¨‹å¼ -config.cache_test_succeeded = å¿«å–æ¸¬è©¦æˆåŠŸï¼Œåœ¨ %s 內收到回應。 -config.cache_test_failed = 無法探測快å–:%v。 -self_check.database_collation_case_insensitive = 資料庫正在使用排åºè¦å‰‡ %sï¼Œé€™æ˜¯ä¸€ç¨®ä¸æ•感的排åºè¦å‰‡ã€‚é›–ç„¶ Forgejo å¯ä»¥èˆ‡å…¶é…åˆä½¿ç”¨ï¼Œä½†æ˜¯åœ¨ä¸€äº›ç½•見情æ³ä¸‹å¯èƒ½æœƒå‡ºç¾ç„¡æ³•如頿œŸé‹ä½œçš„æƒ…æ³ã€‚ -config.open_with_editor_app_help = 拓製é¸å–®ä¸­çš„「開啟方å¼ã€ç·¨è¼¯å™¨ã€‚如果留空則將使用é è¨­å€¼ã€‚展開以查看é è¨­å€¼ã€‚ -dashboard.sync_repo_tags = 將標籤從 Git è³‡æ–™åŒæ­¥è‡³è³‡æ–™åº« -self_check.database_collation_mismatch = 期望資料庫使用的排åºè¦å‰‡ï¼š%s -config.allow_dots_in_usernames = å…許使用者在使用者åç¨±ä¸­ä½¿ç”¨é»žã€‚ä¸æœƒå½±éŸ¿ç¾æœ‰å¸³è™Ÿã€‚ -dashboard.sync_repo_branches = 將缺少的分支從 Git è³‡æ–™åŒæ­¥è‡³è³‡æ–™åº« -defaulthooks.desc = ç•¶æŸäº› Forgejo 事件觸發時,Webhook 會自動å‘伺æœå™¨ç™¼å‡º HTTP POST 請求。此處定義的 Webhook 是é è¨­çš„,將複製至所有新的儲存庫中。更多資訊請åƒè€ƒWebhook 指å—。 -users.local_import.description = å…許從伺æœå™¨çš„æœ¬æ©Ÿæª”案系統匯入儲存庫。這å¯èƒ½æ˜¯å€‹å®‰å…¨å•題。 -config.cache_test_slow = å¿«å–æ¸¬è©¦æˆåŠŸï¼Œä½†æ˜¯å›žæ‡‰å¾ˆæ…¢ï¼š%s。 -users.activated.description = 完æˆé›»å­éƒµä»¶é©—è­‰ã€‚æœªå•Ÿå‹•å¸³è™Ÿçš„æ“æœ‰è€…將無法登入,直至電å­éƒµä»¶é©—證完æˆã€‚ -auths.tips.oauth2.general.tip = 當註冊新的 OAuth2 驗證時,回呼ï¼é‡æ–°å°Žå‘ç¶²å€æ‡‰è©²æ˜¯ï¼š -users.restricted.description = 僅å…許與將此使用者新增為åˆä½œè€…çš„å„²å­˜åº«å’Œçµ„ç¹”é€²è¡Œäº’å‹•ã€‚é€™æœƒé˜»æ­¢å­˜å–æ­¤ç«™é»žä¸Šçš„公共儲存庫。 -users.admin.description = 授予此使用者é€éŽç¶²é ä»‹é¢å’Œ API æä¾›çš„æ‰€æœ‰ç®¡ç†åŠŸèƒ½çš„å®Œå…¨å­˜å–æ¬Šã€‚ -auths.tip.gitea = 註冊一個新的 OAuth2 應用程å¼ã€‚指å—å¯åœ¨ %s 找到 -monitor.queue.activeworkers = æ´»èºå·¥ä½œè€… -monitor.queue.settings.desc = 集倿œƒæ ¹æ“šå·¥ä½œè€…佇列的阻塞情æ³å‹•態增長。 - [action] create_repo=建立了儲存庫 %s rename_repo=釿–°å‘½å儲存庫 %[1]s 為 %[3]s @@ -3582,7 +3409,7 @@ compare_commits=比較 %d 個æäº¤ compare_commits_general=比較æäº¤ mirror_sync_push=從é¡åƒåŒæ­¥äº†æäº¤åˆ° %[4]s çš„ %[3]s mirror_sync_create=從é¡åƒåŒæ­¥äº†æ–°åƒè€ƒ %[3]s 到 %[4]s -mirror_sync_delete=已從é¡åƒåŒæ­¥ä¸¦å¾ž %[3]s 刪除了åƒè€ƒ %[2]s +mirror_sync_delete=從é¡åƒåŒæ­¥ä¸¦å¾ž %[3]s 刪除了åƒè€ƒ %[2]s approve_pull_request=`æ ¸å¯äº† %[3]s#%[2]s` reject_pull_request=`æå‡ºäº†ä¿®æ”¹å»ºè­° %[3]s#%[2]s` publish_release=`發布了 %[3]s çš„ "%[4]s" ` @@ -3652,7 +3479,7 @@ error.unit_not_allowed=您未被å…è¨±å­˜å–æ­¤å„²å­˜åº«å€åŸŸã€‚ title=軟體包 desc=管ç†å„²å­˜åº«è»Ÿé«”包。 empty=ç›®å‰é‚„沒有軟體包。 -empty.documentation=關於軟體包註冊中心的詳情請åƒé–±æ–‡ä»¶ã€‚ +empty.documentation=關於軟體包註冊中心的詳情請åƒé–±èªªæ˜Žæ–‡ä»¶ã€‚ empty.repo=已經上傳了一個軟體包,但是它ä¸åœ¨é€™è£¡å—Žï¼Ÿé€ è¨ªè»Ÿé«”包設定並將其連çµåˆ°é€™å€‹å„²å­˜åº«ã€‚ filter.type=類型 filter.type.all=所有 @@ -3701,9 +3528,9 @@ conda.install=執行下列命令以使用 Conda å®‰è£æ­¤è»Ÿé«”包: container.details.type=æ˜ åƒæª”類型 container.details.platform=å¹³å° container.pull=é€éŽä¸‹åˆ—å‘½ä»¤æ‹‰å–æ˜ åƒæª”: -container.digest=æ‘˜è¦ +container.digest=摘è¦: container.multi_arch=作業系統 / æž¶æ§‹ -container.layers=æ˜ åƒæª”分層 +container.layers=æ˜ åƒæª” Layers container.labels=標籤 container.labels.key=éµ container.labels.value=值 @@ -3727,7 +3554,7 @@ npm.install=執行下列命令以使用 npm å®‰è£æ­¤è»Ÿé«”包: npm.install2=或將它加到 package.json 檔: npm.dependencies=ç›¸ä¾æ€§ npm.dependencies.development=é–‹ç™¼ç›¸ä¾æ€§ -npm.dependencies.peer=åŒè¡Œç›¸ä¾æ€§ +npm.dependencies.peer=Peer ç›¸ä¾æ€§ npm.dependencies.optional=é¸ç”¨ç›¸ä¾æ€§ npm.details.tag=標籤 pub.install=執行下列命令以使用 Dart å®‰è£æ­¤è»Ÿé«”包: @@ -3765,7 +3592,7 @@ owner.settings.cargo.initialize.success=æˆåŠŸå»ºç«‹äº† Cargo 索引。 owner.settings.cargo.rebuild=é‡å»ºç´¢å¼• owner.settings.cargo.rebuild.error=é‡å»º Cargo 索引失敗: %v owner.settings.cargo.rebuild.success=æˆåŠŸé‡å»ºäº† Cargo 索引。 -owner.settings.cleanuprules.title=清ç†è¦å‰‡ +owner.settings.cleanuprules.title=ç®¡ç†æ¸…ç†è¦å‰‡ owner.settings.cleanuprules.add=加入清ç†è¦å‰‡ owner.settings.cleanuprules.edit=編輯清ç†è¦å‰‡ owner.settings.cleanuprules.preview=é è¦½æ¸…ç†è¦å‰‡ @@ -3793,7 +3620,7 @@ arch.version.description = æè¿° arch.version.properties = 版本屬性 arch.version.backup = 備份 arch.version.conflicts = è¡çª -npm.dependencies.bundle = å·²æ†ç¶ç›¸ä¾æ€§ +npm.dependencies.bundle = å·²æ†ç¶çš„ä¾è³´é … arch.version.provides = æä¾› arch.pacman.repo.multi.item = %s 的組態 arch.version.replaces = å–代 @@ -3809,22 +3636,6 @@ rpm.repository.multiple_groups = 此套件å¯ä»¥åœ¨å¤šå€‹ç¾¤çµ„中使用。 rpm.distros.suse = 在基於 SUSE 的發行版上 rpm.distros.redhat = 在基於 RedHat 的發行版上 owner.settings.cargo.rebuild.description = 如果索引與儲存的 Cargo 套件ä¸åŒæ­¥ï¼Œé‡å»ºå¯èƒ½æœƒå¾ˆæœ‰ç”¨ã€‚ -arch.version.groups = 群組 -alt.repository.architectures = æž¶æ§‹ -alt.repository = 儲存庫資訊 -arch.pacman.helper.gpg = 為 pacman 新增信任憑證: -search_in_external_registry = 在 %s 中æœå°‹ -debian.registry.info = 從下é¢çš„æ¸…單䏭鏿“‡ $distribution å’Œ $component。 -arch.pacman.conf = 將相關發行版和架構的伺æœå™¨æ–°å¢žè‡³ /etc/pacman.conf: -arch.pacman.sync = 使用 pacman åŒæ­¥è»Ÿé«”包: -arch.pacman.repo.multi = %s 在ä¸åŒçš„發行版中具有相åŒçš„版本。 -container.images.title = æ˜ åƒæª” -alt.registry = 從命令列設定此註冊表: -alt.install = 安è£è»Ÿé«”包 -registry.documentation = 有關 %s 註冊表的更多資訊,請åƒé–±æ–‡ä»¶ã€‚ -alt.registry.install = è‹¥è¦å®‰è£è»Ÿé«”包,執行以下命令: -alt.repository.multiple_groups = 此軟體包在多個群組中å¯ç”¨ã€‚ -alt.setup = æ–°å¢žå„²å­˜åº«è‡³å·²é€£æŽ¥çš„å„²å­˜åº«æ¸…å–®ï¼ˆé¸æ“‡å¿…è¦çš„æž¶æ§‹çµæ§‹è€Œéžã€Œ_arch_ã€ï¼‰ï¼š [secrets] secrets=Secret @@ -3844,7 +3655,7 @@ management = 管ç†ç§˜å¯† [actions] actions=Actions -unit.desc=使用 Forgejo Actions ç®¡ç†æ•´åˆçš„ CI/CD 管é“。 +unit.desc=ç®¡ç† Actions status.unknown=未知的 status.waiting=等待中 @@ -3852,10 +3663,10 @@ status.running=執行中 status.success=æˆåŠŸ status.failure=失敗 status.skipped=å·²ç•¥éŽ -status.blocked=已阻止 +status.blocked=已阻塞 runners=Runner -runners.runner_manage_panel=ç®¡ç† Runner +runners.runner_manage_panel=Runner ç®¡ç† runners.new=建立 Runner runners.new_notice=如何啟動 Runner runners.status=狀態 @@ -3914,7 +3725,7 @@ variables.creation = 新增變數 variables.none = ç›®å‰æ²’有變數。 variables.deletion = 刪除變數 variables.deletion.description = 刪除變數是永久且ä¸å¯å–消的。è¦ç¹¼çºŒå—Žï¼Ÿ -variables.creation.success = 已新增變數 「%sã€ã€‚ +variables.creation.success = 變數 「%sã€å·²æˆåŠŸè¢«æ–°å¢žã€‚ variables.update.failed = 編輯變數失敗。 runs.no_results = æ²’æœ‰ç›¸ç¬¦çš„çµæžœã€‚ runs.no_workflows = ç›®å‰æ²’有任何工作æµç¨‹ã€‚ @@ -3936,14 +3747,10 @@ workflow.dispatch.warn_input_limit = åƒ…é¡¯ç¤ºå‰ %d 個輸入。 runs.no_job = 工作æµç¨‹å¿…須包å«è‡³å°‘一項作業 runs.expire_log_message = 日誌已被清除,因為它們太舊了。 runs.no_job_without_needs = 工作æµç¨‹å¿…須包å«è‡³å°‘一項沒有ä¾è³´æ€§çš„作業。 -runs.no_matching_online_runner_helper = æ²’æœ‰åœ¨ç·šçš„åŸ·è¡Œå™¨ä¸”åŒ¹é…æ¨™ç±¤ï¼š%s +runs.no_matching_online_runner_helper = æ²’æœ‰åœ¨ç·šåŸ·è¡Œå™¨åŒ¹é…æ¨™ç±¤ï¼š%s workflow.dispatch.success = å·²æˆåŠŸè«‹æ±‚å·¥ä½œæµç¨‹é‹è¡Œã€‚ runs.no_workflows.documentation = 有關 Forgejo Actions 的更多資訊,請åƒé–±æ–‡ä»¶ã€‚ runners.reset_registration_token = é‡ç½®è¨»å†Šç¬¦è¨˜ -workflow.dispatch.use_from = 使用工作æµç¨‹è‡ª -runs.no_workflows.help_no_write_access = è¦äº†è§£ Forgejo Actions,請åƒé–±æ–‡ä»¶ã€‚ -runs.no_workflows.help_write_access = ä¸çŸ¥é“如何開始使用 Forgejo Actions?查看使用者文件中的快速入門來編寫你的第一個工作æµç¨‹ï¼Œç„¶å¾Œè¨­å®š Forgejo Runner來執行你的工作。 -variables.not_found = 找ä¸åˆ°è®Šæ•¸ã€‚ [projects] @@ -3953,6 +3760,7 @@ type-3.display_name = 組織專案 deleted.display_name = 已刪除的專案 [git.filemode] +; Ordered by git filemode value, ascending. E.g. directory has "040000", normal file has "100644", … symbolic_link=ç¬¦è™Ÿé€£çµ changed_filemode = %[1]s → %[2]s submodule = å­æ¨¡çµ„ @@ -3985,13 +3793,9 @@ commit_kind = æœå°‹æäº¤â€¦ code_search_by_git_grep = ç›®å‰æœå°‹çµæžœç”±ã€Œgit grepã€æä¾›ã€‚å¦‚æžœç¶²ç«™ç®¡ç†å“¡å•Ÿç”¨ç¨‹å¼ç¢¼ç´¢å¼•,å¯èƒ½æœƒæœ‰æ›´å¥½çš„çµæžœã€‚ exact = 精確 milestone_kind = æœå°‹é‡Œç¨‹ç¢‘... -issue_kind = æœå°‹å•題… +issue_kind = æœå°‹å•題... exact_tooltip = åªåŒ…å«èˆ‡æœå°‹è©žå®Œå…¨ç›¸ç¬¦çš„çµåˆ pull_kind = æœå°‹æ‹‰å–… -regexp = æ­£è¦è¡¨ç¤ºå¼ -regexp_tooltip = å°‡æœå°‹è©žè§£é‡‹ç‚ºæ­£è¦è¡¨ç¤ºå¼ -union = é—œéµå­— -union_tooltip = 包å«èˆ‡ä»»ä½•空格分隔的關éµå­—ç›¸ç¬¦çš„çµæžœ [munits.data] eib = EiB @@ -4008,9 +3812,4 @@ filepreview.lines = %[3]s 中的第 %[1]d 至 %[2]d 行 filepreview.line = %[2]s 中的第 %[1]d 行 [translation_meta] -test = 好的 - - -[repo.permissions] -ext_issues = å­˜å–外部å•題追蹤器的連çµã€‚權é™ç”±å¤–部管ç†ã€‚ -ext_wiki = å­˜å–外部 Wiki 的連çµã€‚權é™ç”±å¤–部管ç†ã€‚ \ No newline at end of file +test = 好的 \ No newline at end of file diff --git a/options/locale/readme.md b/options/locale/readme.md deleted file mode 100644 index f6f198a936..0000000000 --- a/options/locale/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -# Forgejo translations - -This directory contains all .INI translations. - -## Working on base language - -When you work on Forgejo features, you should only modify `locale_en-US.ini`. - -* consult https://forgejo.org/docs/next/contributor/localization-english/ -* add strings when your change requires doing so -* remove strings when your change renders them unused - -## Working on other languages - -Translations are done on Codeberg Translate and not via individual pull requests. - -* consult https://forgejo.org/docs/next/contributor/localization/ -* see the project: https://translate.codeberg.org/projects/forgejo/forgejo/ - -## Attribution - -Forgejo translators are attributed in commit messages and in monthly updates on the website. - -Gitea translators are mostly not attributed in this repository because Gitea translation commits are lacking attribution, but it may be preserved on Crowdin. - -This directory contains a legacy `TRANSLATORS` file from the Gogs era. It is opt-in and is not actively maintained. diff --git a/options/locale_next/locale_ar.json b/options/locale_next/locale_ar.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_ar.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_be.json b/options/locale_next/locale_be.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_be.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json deleted file mode 100644 index 02144c8b38..0000000000 --- a/options/locale_next/locale_bg.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "ÑÐ»Ñ %[1]d подаване от %[2]s в %[3]s %[4]s", - "other": "ÑÐ»Ñ %[1]d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ %[2]s в %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "иÑка да Ñлее %[1]d подаване от %[2]s в %[3]s", - "other": "иÑка да Ñлее %[1]d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ %[2]s в %[3]s" - } -} diff --git a/options/locale_next/locale_bn.json b/options/locale_next/locale_bn.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_bn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_bs.json b/options/locale_next/locale_bs.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_bs.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_ca.json b/options/locale_next/locale_ca.json deleted file mode 100644 index 8eefc65a1a..0000000000 --- a/options/locale_next/locale_ca.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "search.milestone_kind": "Cerca fites..." -} diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json deleted file mode 100644 index 6e1f48b82f..0000000000 --- a/options/locale_next/locale_cs-CZ.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "slouÄil/a %[1]d revizi z vÄ›tve %[2]s do vÄ›tve %[3]s %[4]s", - "few": "slouÄil/a %[1]d revize z vÄ›tve %[2]s do vÄ›tve %[3]s pÅ™ed %[4]s", - "other": "slouÄil/a %[1]d revizí z vÄ›tve %[2]s do vÄ›tve %[3]s pÅ™ed %[4]s" - }, - "repo.pulls.title_desc": { - "one": "žádá o slouÄení %[1]d revize z vÄ›tve %[2]s do vÄ›tve %[3]s", - "few": "žádá o slouÄení %[1]d revizí z vÄ›tve %[2]s do vÄ›tve %[3]s", - "other": "žádá o slouÄení %[1]d revizí z vÄ›tve %[2]s do vÄ›tve %[3]s" - }, - "search.milestone_kind": "Hledat milníky…", - "home.welcome.no_activity": "Žádná aktivita", - "home.welcome.activity_hint": "Váš feed je zatím prázdný. Zde se budou zobrazovat vaÅ¡e akce a aktivity z repozitářů, které sledujete.", - "home.explore_repos": "Procházet repozitáře", - "home.explore_users": "Procházet uživatele", - "home.explore_orgs": "Procházet organizace", - "incorrect_root_url": "Tato instance Forgejo je nastavena tak, aby běžela na adrese „%s“. Vy si momentálnÄ› prohlížíte Forgejo na jiné adrese, což může způsobit rozbití nÄ›kterých Äástí aplikace. Správná adresa je ovládána správci Forgejo pomocí nastavení ROOT_URL v souboru app.ini.", - "themes.names.forgejo-auto": "Forgejo (podle motivu systému)", - "themes.names.forgejo-light": "Forgejo – svÄ›tlé", - "themes.names.forgejo-dark": "Forgejo – tmavé", - "install.invalid_lfs_path": "NepodaÅ™ilo se vytvoÅ™it koÅ™en LFS na zvolené cestÄ›: %[1]s" -} diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json deleted file mode 100644 index 2a9381e290..0000000000 --- a/options/locale_next/locale_da.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "search.milestone_kind": "Søg milepæle…", - "repo.pulls.title_desc": { - "one": "ønsker at flette %[1]d commit fra %[2]s til %[3]s", - "other": "ønsker at flette %[1]d commits fra %[2]s til %[3]s" - }, - "repo.pulls.merged_title_desc": { - "one": "flettet %[1]d commit fra %[2]s til %[3]s %[4]s", - "other": "flettet %[1]d commits fra %[2]s til %[3]s %[4]s" - }, - "incorrect_root_url": "Denne Forgejo-instans er konfigureret til at blive serveret pÃ¥ \"%s\". Du ser i øjeblikket Forgejo gennem en anden URL, hvilket kan fÃ¥ dele af applikationen til at gÃ¥ i stykker. Den kanoniske URL styres af Forgejo-administratorer via indstillingen ROOT_URL i app.ini.", - "home.welcome.no_activity": "Ingen aktivitet", - "home.welcome.activity_hint": "Der er intet i dit feed endnu. Dine handlinger og aktivitet fra depoterne, som du ser, vises her.", - "home.explore_repos": "Udforsk depoter", - "home.explore_users": "Udforsk brugere", - "home.explore_orgs": "Udforsk organisationer", - "themes.names.forgejo-light": "Forgejo lys", - "themes.names.forgejo-dark": "Forgejo mørk", - "themes.names.forgejo-auto": "Forgejo (følg systemtema)", - "settings.adopt": "Adoptere", - "install.invalid_lfs_path": "Kan ikke oprette LFS-roden pÃ¥ den angivne sti: %[1]s", - "install.lfs_jwt_secret_failed": "Kan ikke generere en LFS JWT-hemmelighed: %[1]s" -} diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json deleted file mode 100644 index 82e0b309e2..0000000000 --- a/options/locale_next/locale_de-DE.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "hat %[1]d Commit von %[2]s nach %[3]s %[4]s zusammengeführt", - "other": "hat %[1]d Commits von %[2]s nach %[3]s %[4]s zusammengeführt" - }, - "repo.pulls.title_desc": { - "one": "möchte %[1]d Commit von %[2]s nach %[3]s zusammenführen", - "other": "möchte %[1]d Commits von %[2]s nach %[3]s zusammenführen" - }, - "search.milestone_kind": "Meilensteine suchen …", - "home.welcome.no_activity": "Keine Aktivität", - "home.explore_repos": "Repositorys erkunden", - "home.explore_users": "Benutzer erkunden", - "home.explore_orgs": "Organisationen erkunden", - "home.welcome.activity_hint": "Es gibt noch nichts in deinem Feed. Deine Aktionen und Aktivitäten aus Repositorys, die du beobachtest, werden hier auftauchen.", - "incorrect_root_url": "Diese Forgejo-Instanz ist konfiguriert, auf „%s“ bereitgestellt zu werden. Du rufst Forgejo über einen anderen URL auf, was dazu führen könnte, dass einige Bereiche nicht funktionieren. Der anerkannte URL wird durch die Forgejo-Admins mittels der Einstellung ROOT_URL in der app.ini kontrolliert.", - "themes.names.forgejo-auto": "Forgejo (folge Systemthema)", - "themes.names.forgejo-light": "Forgejo hell", - "themes.names.forgejo-dark": "Forgejo dunkel", - "install.invalid_lfs_path": "Der LFS-Root konnte nicht am angegebenen Pfad erstellt werden: %[1]s" -} diff --git a/options/locale_next/locale_el-GR.json b/options/locale_next/locale_el-GR.json deleted file mode 100644 index 3cc62b4a43..0000000000 --- a/options/locale_next/locale_el-GR.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "συγχώνευσε %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s %[4]s", - "other": "συγχώνευσε %[1]d υποβολές από %[2]s σε %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": ": θα ήθελε να συγχωνεÏσει %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s", - "other": "θέλει να συγχωνεÏσει %[1]d υποβολές από %[2]s σε %[3]s" - }, - "search.milestone_kind": "Αναζήτηση οÏόσημων..." -} diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json deleted file mode 100644 index 4f3c65a68f..0000000000 --- a/options/locale_next/locale_en-US.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "home.welcome.no_activity": "No activity", - "home.welcome.activity_hint": "There is nothing in your feed yet. Your actions and activity from repositories that you watch will show up here.", - "home.explore_repos": "Explore repositories", - "home.explore_users": "Explore users", - "home.explore_orgs": "Explore organizations", - "repo.pulls.merged_title_desc": { - "one": "merged %[1]d commit from %[2]s into %[3]s %[4]s", - "other": "merged %[1]d commits from %[2]s into %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "wants to merge %[1]d commit from %[2]s into %[3]s", - "other": "wants to merge %[1]d commits from %[2]s into %[3]s" - }, - "search.milestone_kind": "Search milestones…", - "incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.", - "themes.names.forgejo-auto": "Forgejo (follow system theme)", - "themes.names.forgejo-light": "Forgejo light", - "themes.names.forgejo-dark": "Forgejo dark", - "settings.adopt": "Adopt", - "install.invalid_lfs_path": "Unable to create the LFS root at the specified path: %[1]s", - "install.lfs_jwt_secret_failed": "Unable to generate a LFS JWT secret: %[1]s" -} diff --git a/options/locale_next/locale_eo.json b/options/locale_next/locale_eo.json deleted file mode 100644 index 1f4124b2ea..0000000000 --- a/options/locale_next/locale_eo.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "search.milestone_kind": "Serĉi celojn..." -} diff --git a/options/locale_next/locale_es-ES.json b/options/locale_next/locale_es-ES.json deleted file mode 100644 index 57753089ca..0000000000 --- a/options/locale_next/locale_es-ES.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "fusionó %[1]d commit de %[2]s en %[3]s %[4]s", - "many": "fusionó %[1]d commits de %[2]s en %[3]s %[4]s", - "other": "" - }, - "repo.pulls.title_desc": { - "one": "quiere fusionar %[1]d commit de %[2]s en %[3]s", - "many": "quiere fusionar %[1]d commits de %[2]s en %[3]s", - "other": "" - }, - "search.milestone_kind": "Buscar hitos…", - "home.welcome.no_activity": "Sin actividad", - "themes.names.forgejo-auto": "Forgejo (seguir el tema del sistema)", - "themes.names.forgejo-light": "Forgejo claro", - "themes.names.forgejo-dark": "Forgejo oscuro" -} diff --git a/options/locale_next/locale_et.json b/options/locale_next/locale_et.json deleted file mode 100644 index a10447fa98..0000000000 --- a/options/locale_next/locale_et.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "search.milestone_kind": "Otsi verstapostid..." -} diff --git a/options/locale_next/locale_fa-IR.json b/options/locale_next/locale_fa-IR.json deleted file mode 100644 index 78d6944203..0000000000 --- a/options/locale_next/locale_fa-IR.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "واکشی %[1]d سپرده از %[2]s به %[3]s %[4]s", - "other": "واکشی %[1]d سپرده‌ها از %[2]s به %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "خواست واکشی %[1]d سپرده را از %[2]s به %[3]s دارد", - "other": "خواست واکشی %[1]d سپرده‌ها را از %[2]s به %[3]s دارد" - }, - "home.welcome.activity_hint": "هنوز چیزی در آزوغه شما نیست. در اینجا کنش‌ها Ùˆ کوشش‌های شما در مخازنی Ú©Ù‡ نگاه‌بانی می‌کنید نمایش داده خواهد شد.", - "search.milestone_kind": "جستجو نقاط عطÙ...", - "home.welcome.no_activity": "بدون کوشش", - "home.explore_repos": "کاوش مخازن", - "home.explore_users": "کاوش کاربران", - "home.explore_orgs": "کاوش سازمان‌ها" -} diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json deleted file mode 100644 index 324ca5e6b3..0000000000 --- a/options/locale_next/locale_fi-FI.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s", - "repo.pulls.title_desc": "haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s", - "search.milestone_kind": "Etsi merkkipaaluja…", - "home.welcome.no_activity": "Ei toimintaa", - "incorrect_root_url": "Tämä Forgejo-instanssi on määritetty toimimaan osoitteessa \"%s\". Tarkastelet tällä hetkellä Forgejoa eri URL-osoitteen kautta, mikä saattaa aiheuttaa sovelluksen osien toimimattomuutta. Virallinen URL-osoite on Forgejo-ylläpitäjien hallinnoima ROOT_URL-asetus app.ini -tiedostossa.", - "themes.names.forgejo-auto": "Forgejo (käyttöjärjestelmän määrittelemä teema)", - "home.welcome.activity_hint": "Syötteelläsi ei ole vielä mitään. Toimintasi ja toiminta repositorioissa joita seuraat ilmaantuu tälle sivulle.", - "home.explore_repos": "Tutki repositorioita", - "home.explore_users": "Tutki käyttäjiä", - "home.explore_orgs": "Tutki organisaatioita", - "themes.names.forgejo-light": "Forgejo, vaalea", - "themes.names.forgejo-dark": "Forgejo, tumma", - "install.invalid_lfs_path": "LFS juurta ei voitu luoda polkuun: %[1]s" -} diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json deleted file mode 100644 index 578c0f480b..0000000000 --- a/options/locale_next/locale_fil.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "isinali ang %[1]d commit mula%[2]s patungong %[3]s %[4]s", - "other": "isinali ang %[1]d mga commit mula sa %[2]s patungong %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "hinihiling na isama ang %[1]d commit mula %[2]s patungong %[3]s", - "other": "hiniling na isama ang %[1]d mga commit mula sa %[2]s patungong %[3]s" - }, - "search.milestone_kind": "Maghanap ng mga milestone…", - "incorrect_root_url": "Ang Forgejo instance na ito ay naka-configure na ma-serve sa \"%s\". Kasalukuyan mong tinitignan ang Forgejo sa pamamagitan ng ibang URL, na maaaring magdulot na ang mga ibang bahagi ng application na masira. Ang canonical URL ay kino-control ng mga tagapangasiwa ng Forgejo sa pamamagitan ng ROOT_URL setting sa app.ini.", - "themes.names.forgejo-auto": "Forgejo (sundan ang tema ng sistema)", - "themes.names.forgejo-light": "Maliwanag na Forgejo", - "themes.names.forgejo-dark": "Madilim na Forgejo", - "home.welcome.no_activity": "Walang aktibidad", - "home.welcome.activity_hint": "Wala pang laman ang iyong feed. Makikita dito ang iyong mga aksyon at aktibidad mula sa mga repositoryo na pinapanood mo.", - "home.explore_repos": "Tuklasin ang mga repositoryo", - "home.explore_users": "Tuklasin ang mga user", - "home.explore_orgs": "Tuklasin ang mga organisasyon", - "install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s" -} diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json deleted file mode 100644 index 8575e6d55f..0000000000 --- a/options/locale_next/locale_fr-FR.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "fusionné %[1]d commit depuis %[2]s vers %[3]s %[4]s", - "many": "a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s", - "other": "" - }, - "repo.pulls.title_desc": { - "one": "veut fusionner %[1]d commit depuis %[2]s vers %[3]s", - "many": "souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s", - "other": "" - }, - "search.milestone_kind": "Recherche dans les jalons..." -} diff --git a/options/locale_next/locale_gl.json b/options/locale_next/locale_gl.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_gl.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_hi.json b/options/locale_next/locale_hi.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_hi.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_hu-HU.json b/options/locale_next/locale_hu-HU.json deleted file mode 100644 index 9d52509102..0000000000 --- a/options/locale_next/locale_hu-HU.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s", - "repo.pulls.title_desc": "egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba", - "search.milestone_kind": "Mérföldkövek keresése..." -} diff --git a/options/locale_next/locale_id-ID.json b/options/locale_next/locale_id-ID.json deleted file mode 100644 index f2dac8114f..0000000000 --- a/options/locale_next/locale_id-ID.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "other": "commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "other": "ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s" - } -} diff --git a/options/locale_next/locale_is-IS.json b/options/locale_next/locale_is-IS.json deleted file mode 100644 index a92d924232..0000000000 --- a/options/locale_next/locale_is-IS.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.title_desc": { - "other": "vill sameina %[1]d framlög frá %[2]s í %[3]s" - } -} diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json deleted file mode 100644 index 50cc736634..0000000000 --- a/options/locale_next/locale_it-IT.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "ha fuso %[1]d commit da %[2]s in %[3]s %[4]s", - "many": "ha unito %[1]d commit da %[2]s a %[3]s %[4]s", - "other": "" - }, - "repo.pulls.title_desc": { - "one": "vuole fondere %[1]d commit da %[2]s in %[3]s", - "many": "vuole unire %[1]d commit da %[2]s a %[3]s", - "other": "" - }, - "search.milestone_kind": "Ricerca traguardi…", - "home.welcome.no_activity": "Nessun'attività", - "home.explore_repos": "Esplora i repositori", - "home.explore_users": "Esplora l'utenza", - "home.explore_orgs": "Esplora le organizzazioni", - "themes.names.forgejo-light": "Forgejo chiaro", - "themes.names.forgejo-dark": "Forgejo scuro" -} diff --git a/options/locale_next/locale_ja-JP.json b/options/locale_next/locale_ja-JP.json deleted file mode 100644 index 40edf8cb90..0000000000 --- a/options/locale_next/locale_ja-JP.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "㌠%[1]d 個ã®ã‚³ãƒŸãƒƒãƒˆã‚’ %[2]s ã‹ã‚‰ %[3]s ã¸ãƒžãƒ¼ã‚¸ %[4]s", - "repo.pulls.title_desc": "㌠%[2]s ã‹ã‚‰ %[3]s ã¸ã® %[1]d コミットã®ãƒžãƒ¼ã‚¸ã‚’希望ã—ã¦ã„ã¾ã™", - "search.milestone_kind": "マイルストーンを検索..." -} diff --git a/options/locale_next/locale_ko-KR.json b/options/locale_next/locale_ko-KR.json deleted file mode 100644 index ac61066356..0000000000 --- a/options/locale_next/locale_ko-KR.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "other": "ë‹˜ì´ %[2]s ì—서 %[3]s 로 %[1]d ì»¤ë°‹ì„ %[4]s 병합함" - }, - "repo.pulls.title_desc": { - "other": "%[2]s ì—서 %[3]s 로 %[1]dê°œì˜ ì»¤ë°‹ë“¤ì„ ë³‘í•©í•˜ë ¤í•¨" - }, - "home.welcome.no_activity": "í™œë™ ì—†ìŒ" -} diff --git a/options/locale_next/locale_lt.json b/options/locale_next/locale_lt.json deleted file mode 100644 index 9f97587b09..0000000000 --- a/options/locale_next/locale_lt.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "search.milestone_kind": "IeÅ¡koti gairių..." -} diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json deleted file mode 100644 index 1287ddbf49..0000000000 --- a/options/locale_next/locale_lv-LV.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "zero": "iekļÄva %[1]d iesÅ«tÄ«jumu no %[2]s %[3]s %[4]s", - "one": "IekļÄva %[1]d iesÅ«tÄ«jumu no %[2]s zarÄ %[3]s %[4]s", - "other": "IekļÄva %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "zero": "vÄ“las iekļaut %[1]d iesÅ«tÄ«jumu no %[2]s %[3]s", - "one": "vÄ“las iekļaut %[1]d iesÅ«tÄ«jumu no %[2]s zarÄ %[3]s", - "other": "vÄ“las iekļaut %[1]d iesÅ«tÄ«jumus no %[2]s zarÄ %[3]s" - }, - "search.milestone_kind": "MeklÄ“t atskaites punktus…", - "home.welcome.no_activity": "Nav darbÄ«bu", - "home.welcome.activity_hint": "BarotnÄ“ pagaidÄm nekÄ nav. Å eit parÄdÄ«sies darbÄ«bas un vÄ“roto glabÄtavu notikumi.", - "home.explore_repos": "IzpÄ“tÄ«t glabÄtavas", - "home.explore_users": "IzpÄ“tÄ«t lietotÄjus", - "home.explore_orgs": "IzpÄ“tÄ«t apvienÄ«bas", - "incorrect_root_url": "Å is Forgejo serveris ir konfigurÄ“ts darboties \"%s\". PaÅ¡laik Forgejo tiek apmeklÄ“ta ar atšķirÄ«gu URL, kas var radÄ«t atsevišķu lietotnes daļu salūšanu. Kanonisko URL pÄrrauga Forgejo pÄrvaldÄ«tÄji ar app.ini iestatÄ«jumu ROOT_URL.", - "themes.names.forgejo-auto": "Forgejo (ievÄ“rot sistÄ“mas izskatu)", - "themes.names.forgejo-light": "Forgejo gaiÅ¡ais", - "themes.names.forgejo-dark": "Forgejo tumÅ¡ais", - "install.invalid_lfs_path": "Nav iespÄ“jams izveidot LFS pamatmapi norÄdÄ«tajÄ ceļÄ: %[1]s" -} diff --git a/options/locale_next/locale_ml-IN.json b/options/locale_next/locale_ml-IN.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_ml-IN.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_nb_NO.json b/options/locale_next/locale_nb_NO.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_nb_NO.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json deleted file mode 100644 index 7d3b5bcd82..0000000000 --- a/options/locale_next/locale_nds.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "hett %[4]s %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhrt", - "other": "hett %[4]s %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhrt" - }, - "repo.pulls.title_desc": { - "one": "will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren", - "other": "will %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhren" - }, - "search.milestone_kind": "In Markstenen söken …", - "home.explore_users": "Brukers utförsken", - "home.explore_orgs": "Vereenigungen utförsken", - "home.explore_repos": "Repositoriums utförsken", - "home.welcome.no_activity": "Keen Doon", - "home.welcome.activity_hint": "In dienem Schuuv is noch nix. Dien Doon un dat Doon vun Repositoriums, wat du beluurst, word hier wiest worden.", - "incorrect_root_url": "Deese Forgejo-Instanz is inricht, unner »%s« besöcht to worden. Du bekiekst Forgejo jüüst dör een anner URL, wat daarto föhren kann, dat ’t deelwies nich richtig warkt. De kanonisk URL word vun de Forgejo-Chefs över de ROOT_URL-Instellen in de app.ini kuntrolleert.", - "themes.names.forgejo-light": "Forgejo Hell", - "themes.names.forgejo-dark": "Forgejo Dunker", - "themes.names.forgejo-auto": "Forgejo (Systeem-Thema nagahn)", - "settings.adopt": "Övernehmen", - "install.invalid_lfs_path": "Kunn de LFS-Ruut an de angeven Padd nich maken: %[1]s", - "install.lfs_jwt_secret_failed": "Kunn dat LFS-JWT-Geheemst nich maken: %[1]s" -} diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json deleted file mode 100644 index 49de90b0eb..0000000000 --- a/options/locale_next/locale_nl-NL.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s", - "other": "heeft %[1]d commits samengevoegd van %[2]s naar %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "wil %[1]d commit van %[2]s samenvoegen in %[3]s", - "other": "wil %[1]d commits van %[2]s samenvoegen met %[3]s" - }, - "search.milestone_kind": "Zoek mijlpalen…", - "home.welcome.no_activity": "Geen activiteit", - "home.welcome.activity_hint": "Er staat nog niets in uw feed. Uw acties en activiteiten van repositories die u monitort zullen hier verschijnen.", - "home.explore_repos": "Verken repositories", - "home.explore_users": "Verken gebruikers", - "home.explore_orgs": "Verken organisaties", - "incorrect_root_url": "Deze Forgejo-instantie is geconfigureerd om geserveerd te worden op \"%s\". U bekijkt Forgejo momenteel via een andere URL, waardoor onderdelen van de applicatie kunnen breken. De canonieke URL kan worden gewijzigd door Forgejo admins via de ROOT_URL instelling in de app.ini.", - "themes.names.forgejo-auto": "Forgejo (volg het systeemthema)", - "themes.names.forgejo-light": "Forgejo licht", - "themes.names.forgejo-dark": "Forgejo donker", - "settings.adopt": "Adopteer", - "install.invalid_lfs_path": "Kan de LFS-root niet aanmaken op het opgegeven pad: %[1]s", - "install.lfs_jwt_secret_failed": "Kan geen LFS JWT-geheim genereren: %[1]s" -} diff --git a/options/locale_next/locale_pl-PL.json b/options/locale_next/locale_pl-PL.json deleted file mode 100644 index 8f9eea2302..0000000000 --- a/options/locale_next/locale_pl-PL.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "scala %[1]d commity/ów z %[2]s do %[3]s %[4]s", - "repo.pulls.title_desc": "chce scalić %[1]d commity/ów z %[2]s do %[3]s", - "search.milestone_kind": "Wyszukaj kamienie milowe...", - "incorrect_root_url": "Ta instancja Forgejo jest skonfigurowana do korzystania z \"%s\". Obecnie oglÄ…dasz Forgejo za pomocÄ… innego URL, co może powodować błędne dziaÅ‚anie tej aplikacji. URL kanoniczny jest kontrolowany przez administratorów Forgejo za pomocÄ… ROOT_URL w app.ini." -} diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json deleted file mode 100644 index 85282b101d..0000000000 --- a/options/locale_next/locale_pt-BR.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "mesclou %[1]d commit de %[2]s em %[3]s %[4]s", - "many": "mesclou %[1]d commits de %[2]s em %[3]s %[4]s", - "other": "" - }, - "repo.pulls.title_desc": { - "one": "quer mesclar %[1]d commit de %[2]s em %[3]s", - "many": "quer mesclar %[1]d commits de %[2]s em %[3]s", - "other": "" - }, - "search.milestone_kind": "Pesquisar marcos…", - "home.welcome.no_activity": "Sem atividade", - "home.welcome.activity_hint": "Ainda não tem nada no seu feed. Suas ações e atividade dos seus repositórios vigiados aparecerão aqui.", - "home.explore_repos": "Explorar repositórios", - "home.explore_users": "Explorar usuários", - "home.explore_orgs": "Explorar organizações", - "incorrect_root_url": "Esta instância do Forgejo está configurada para o endereço \"%s\". Você está atualmente vendo o Forgejo através de uma URL diferente, o que pode causar erros em algumas partes da aplicação. A URL oficial é controlada pela administração do Forgejo através da configuração ROOT_URL no arquivo app.ini.", - "themes.names.forgejo-auto": "Forgejo (usar o tema do sistema)", - "themes.names.forgejo-light": "Forgejo claro", - "themes.names.forgejo-dark": "Forgejo escuro", - "install.invalid_lfs_path": "Não foi possível criar um root LFS no caminho especificado: %[1]s" -} diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json deleted file mode 100644 index 4c24ed5ea6..0000000000 --- a/options/locale_next/locale_pt-PT.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "integrou %[1]d cometimento do ramo %[2]s no ramo %[3]s %[4]s", - "many": "integrou %[1]d cometimentos do ramo %[2]s no ramo %[3]s %[4]s", - "other": "" - }, - "repo.pulls.title_desc": { - "one": "quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s", - "many": "quer integrar %[1]d cometimentos do ramo %[2]s no ramo %[3]s", - "other": "" - }, - "search.milestone_kind": "Procurar etapas…", - "home.welcome.no_activity": "Sem atividade", - "home.welcome.activity_hint": "Ainda não há nada no seu feed. As suas operações e a atividade dos repositórios que vigia aparecerão aqui.", - "home.explore_repos": "Explorar repositórios", - "home.explore_users": "Explorar utilizadores", - "home.explore_orgs": "Explorar organizações", - "incorrect_root_url": "Esta instância do Forgejo está configurada para ser servida em “%sâ€. Atualmente, está a visualizar o Forgejo através de um URL diferente, o que pode causar a quebra de partes da aplicação. O URL official é controlado pelos administradores do Forgejo através da configuração ROOT_URL no ficheiro app.ini.", - "themes.names.forgejo-auto": "Forgejo (segue o tema do sistema)", - "themes.names.forgejo-light": "Forgejo claro", - "themes.names.forgejo-dark": "Forgejo escuro", - "install.invalid_lfs_path": "Não foi possível criar a raiz LFS no caminho especificado: %[1]s" -} diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json deleted file mode 100644 index 88bbe18b09..0000000000 --- a/options/locale_next/locale_ru-RU.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "Ñлит %[1]d коммит из %[2]s в %[3]s %[4]s", - "few": "Ñлито %[1]d коммита из %[2]s в %[3]s %[4]s", - "many": "Ñлито %[1]d коммитов из %[2]s в %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "хочет влить %[1]d коммит из %[2]s в %[3]s", - "few": "хочет влить %[1]d коммита из %[2]s в %[3]s", - "many": "хочет влить %[1]d коммитов из %[2]s в %[3]s" - }, - "search.milestone_kind": "Ðайти Ñтапы…", - "home.explore_repos": "Каталог репозиториев", - "home.explore_users": "Каталог пользователей", - "home.explore_orgs": "Каталог организаций", - "home.welcome.activity_hint": "Ð’ вашей ленте пока ничего нет. Ваши дейÑÑ‚Ð²Ð¸Ñ Ð¸ активноÑть из отÑлеживаемых вами репозиториев будут отображены здеÑÑŒ.", - "home.welcome.no_activity": "Ðет Ñобытий", - "incorrect_root_url": "Этот Ñервер Forgejo раÑположен по адреÑу «%s», но вы проÑматриваете Ñтраницу Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ адреÑа. Это может приводить к поломкам чаÑтей приложениÑ. КаноничеÑкий Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ÑÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором Ñервера в файле конфигурации app.ini - ROOT_URL.", - "themes.names.forgejo-light": "Forgejo – ÑветлаÑ", - "themes.names.forgejo-auto": "Forgejo – как в ÑиÑтеме", - "themes.names.forgejo-dark": "Forgejo – тёмнаÑ", - "install.invalid_lfs_path": "Ðе удалоÑÑŒ раÑположить корень LFS по указанному пути: %[1]s" -} diff --git a/options/locale_next/locale_si-LK.json b/options/locale_next/locale_si-LK.json deleted file mode 100644 index 0cdd44acd0..0000000000 --- a/options/locale_next/locale_si-LK.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "other": "මර්ජ්%[1]d සිට %[2]s දක්ව෠%[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "other": "%[1]d සිට %[2]s දක්ව෠%[3]s" - } -} diff --git a/options/locale_next/locale_sk-SK.json b/options/locale_next/locale_sk-SK.json deleted file mode 100644 index 953a7511db..0000000000 --- a/options/locale_next/locale_sk-SK.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "home.welcome.no_activity": "Žiadna aktivita", - "home.welcome.activity_hint": "Vo vaÅ¡om kanáli zatiaľ niÄ nie je. Tu sa budú zobrazovaÅ¥ vaÅ¡e akcie a aktivity z repozitárov, ktoré sledujete.", - "home.explore_repos": "Preskúmajte repozitáre", - "home.explore_users": "Preskúmajte používateľov", - "home.explore_orgs": "Preskúmajte organizácie", - "search.milestone_kind": "HľadaÅ¥ v míľnikoch…", - "incorrect_root_url": "Táto inÅ¡tancia Forgejo je nakonfigurovaná tak, aby bola obsluhovaná na „%s“. Momentálne zobrazujete Forgejo prostredníctvom inej adresy URL, Äo môže spôsobiÅ¥ poruchu niektorých Äastí aplikácie. Kanonickú adresu URL kontrolujú správcovia aplikácie Forgejo prostredníctvom nastavenia ROOT_URL v súbore app.ini.", - "themes.names.forgejo-auto": "Forgejo (sleduj systémovú tému)", - "themes.names.forgejo-light": "Forgejo svetlé", - "themes.names.forgejo-dark": "Forgejo tmavé", - "install.invalid_lfs_path": "Nie je možné vytvoriÅ¥ koreňový systém LFS na zadanej ceste: %[1]s" -} diff --git a/options/locale_next/locale_sl.json b/options/locale_next/locale_sl.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_sl.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_sr-SP.json b/options/locale_next/locale_sr-SP.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_sr-SP.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json deleted file mode 100644 index dc41e4d6e1..0000000000 --- a/options/locale_next/locale_sv-SE.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "sammanfogade %[1]d incheckningar frÃ¥n %[2]s in i %[3]s %[4]s", - "repo.pulls.title_desc": "vill sammanfoga %[1]d incheckningar frÃ¥n s[2]s in i %[3]s", - "search.milestone_kind": "Sök milstolpar..." -} diff --git a/options/locale_next/locale_tr-TR.json b/options/locale_next/locale_tr-TR.json deleted file mode 100644 index b0e34e677f..0000000000 --- a/options/locale_next/locale_tr-TR.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "%[4]s %[2]s içindeki %[1]d iÅŸlemeyi %[3]s ile birleÅŸtirdi", - "repo.pulls.title_desc": "%[2]s içindeki %[1]d iÅŸlemeyi %[3]s ile birleÅŸtirmek istiyor", - "search.milestone_kind": "Kilometre taÅŸlarını ara..." -} diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json deleted file mode 100644 index 8e45bfd5c7..0000000000 --- a/options/locale_next/locale_uk-UA.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "one": "об'єднує %[1]d коміт з %[2]s в %[3]s %[4]s", - "few": "об'єднує %[1]d коміти з %[2]s в %[3]s %[4]s", - "many": "об'єднує %[1]d комітів з %[2]s в %[3]s %[4]s" - }, - "repo.pulls.title_desc": { - "one": "хоче об'єднати %[1]d коміт з %[2]s в %[3]s", - "few": "хоче об'єднати %[1]d коміти з %[2]s в %[3]s", - "many": "хоче об'єднати %[1]d комітів з %[2]s в %[3]s" - }, - "search.milestone_kind": "Шукати етапи…", - "home.welcome.activity_hint": "У вашій Ñтрічці ще нічого немає. Тут з'ÑвлÑтимутьÑÑ Ð²Ð°ÑˆÑ– дії та активніÑть із відÑтежуваних репозиторіїв.", - "home.welcome.no_activity": "Ðемає подій", - "home.explore_repos": "ОглÑд репозиторіїв", - "home.explore_users": "ОглÑд кориÑтувачів", - "home.explore_orgs": "ОглÑд організацій", - "incorrect_root_url": "Цей екземплÑÑ€ Forgejo налаштовано на Ð²Ñ–Ð´Ð²Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð· «%s». Зараз ви переглÑдаєте Forgejo за іншою URL-адреÑою, що може призвеÑти до збоїв деÑких чаÑтин програми. Канонічна URL-адреÑа вÑтановлюєтьÑÑ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтраторами Forgejo за допомогою параметра ROOT_URL у файлі app.ini.", - "themes.names.forgejo-light": "Forgejo Ñвітла", - "themes.names.forgejo-dark": "Forgejo темна", - "themes.names.forgejo-auto": "Forgejo (Ñк у ÑиÑтемі)", - "settings.adopt": "ПрийнÑти", - "install.invalid_lfs_path": "Ðе вдалоÑÑ Ñтворити корінь LFS за вказаним шлÑхом: %[1]s", - "install.lfs_jwt_secret_failed": "Ðе вдалоÑÑ Ñтворити Ñекрет LFS JWT: %[1]s" -} diff --git a/options/locale_next/locale_vi.json b/options/locale_next/locale_vi.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_vi.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_yi.json b/options/locale_next/locale_yi.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/options/locale_next/locale_yi.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json deleted file mode 100644 index fd7a9b357e..0000000000 --- a/options/locale_next/locale_zh-CN.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "于 %[4]s å°† %[1]d æ¬¡ä»£ç æäº¤ä»Ž %[2]s åˆå¹¶è‡³ %[3]s", - "repo.pulls.title_desc": "请求将 %[1]d æ¬¡ä»£ç æäº¤ä»Ž %[2]s åˆå¹¶è‡³ %[3]s", - "search.milestone_kind": "æœç´¢é‡Œç¨‹ç¢‘…", - "home.welcome.no_activity": "无活动", - "home.welcome.activity_hint": "您的订阅中还没有任何内容。您关注的仓库中的æ“作和活动将显示在此处。", - "home.explore_repos": "探索仓库", - "home.explore_users": "探索用户", - "home.explore_orgs": "探索组织", - "incorrect_root_url": "æ­¤ Forgejo 实例é…置为在“%sâ€ä¸Šæä¾›æœåŠ¡ã€‚æ‚¨å½“å‰æ­£åœ¨é€šè¿‡ä¸åŒçš„ç½‘å€æŸ¥çœ‹ Forgejo,这å¯èƒ½ä¼šå¯¼è‡´åº”用程åºçš„æŸäº›éƒ¨åˆ†æŸå。Forgejo 管ç†å‘˜å¯ä»¥é€šè¿‡ app.ini 中的 ROOT_URL 设置控制规范网å€ã€‚", - "themes.names.forgejo-auto": "Forgejo(éµå¾ªç³»ç»Ÿä¸»é¢˜ï¼‰", - "themes.names.forgejo-light": "Forgejo 浅色", - "themes.names.forgejo-dark": "Forgejo 深色", - "install.invalid_lfs_path": "无法在指定路径创建 LFS 根目录:%[1]s", - "install.lfs_jwt_secret_failed": "æ— æ³•ç”Ÿæˆ LFS JWT 密钥:%[1]s" -} diff --git a/options/locale_next/locale_zh-HK.json b/options/locale_next/locale_zh-HK.json deleted file mode 100644 index 6baf89e022..0000000000 --- a/options/locale_next/locale_zh-HK.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": { - "other": "æ–¼ %[4]s å°‡ %[1]d 次代碼æäº¤å¾ž %[2]såˆä½µè‡³ %[3]s" - } -} diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json deleted file mode 100644 index 222e8bb332..0000000000 --- a/options/locale_next/locale_zh-TW.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "repo.pulls.merged_title_desc": "å°‡ %[1]d 次æäº¤å¾ž %[2]s åˆä½µè‡³ %[3]s %[4]s", - "repo.pulls.title_desc": "請求將 %[1]d 次程å¼ç¢¼æäº¤å¾ž %[2]s åˆä½µè‡³ %[3]s", - "search.milestone_kind": "æœå°‹é‡Œç¨‹ç¢‘…" -} diff --git a/package-lock.json b/package-lock.json index 6099e39ad6..d3d9c7160c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,47 +4,46 @@ "requires": true, "packages": { "": { - "name": "forgejo-aneksajo", "dependencies": { - "@citation-js/core": "0.7.14", - "@citation-js/plugin-bibtex": "0.7.16", + "@citation-js/core": "0.7.11", + "@citation-js/plugin-bibtex": "0.7.11", "@citation-js/plugin-software-formats": "0.6.1", "@github/markdown-toolbar-element": "2.2.3", - "@github/quote-selection": "2.1.0", - "@github/relative-time-element": "4.4.5", - "@github/text-expander-element": "2.8.0", + "@github/relative-time-element": "4.4.4", + "@github/text-expander-element": "2.7.1", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", - "@primer/octicons": "19.14.0", + "@primer/octicons": "19.9.0", "ansi_up": "6.0.2", - "asciinema-player": "3.8.2", - "chart.js": "4.4.5", + "asciinema-player": "3.8.0", + "chart.js": "4.4.4", "chartjs-adapter-dayjs-4": "1.0.4", - "chartjs-plugin-zoom": "2.2.0", + "chartjs-plugin-zoom": "2.0.1", "clippie": "4.1.1", "css-loader": "7.0.0", "dayjs": "1.11.12", "dropzone": "6.0.0-beta.2", "easymde": "2.18.0", - "esbuild-loader": "4.3.0", + "esbuild-loader": "4.2.2", "escape-goat": "4.0.0", - "fast-glob": "3.3.3", + "fast-glob": "3.3.2", "htmx.org": "1.9.12", "idiomorph": "0.3.0", "jquery": "3.7.1", - "katex": "0.16.21", - "mermaid": "11.5.0", - "mini-css-extract-plugin": "2.9.2", + "katex": "0.16.11", + "mermaid": "11.3.0", + "mini-css-extract-plugin": "2.9.1", "minimatch": "10.0.1", - "monaco-editor": "0.52.2", + "monaco-editor": "0.51.0", "monaco-editor-webpack-plugin": "7.1.0", "pdfobject": "2.3.0", - "postcss": "8.5.2", + "postcss": "8.4.47", "postcss-loader": "8.1.1", - "postcss-nesting": "13.0.1", + "postcss-nesting": "12.1.5", "pretty-ms": "9.0.0", - "sortablejs": "1.15.6", + "sortablejs": "1.15.3", "swagger-ui-dist": "5.17.14", - "tailwindcss": "3.4.17", + "tailwindcss": "3.4.13", + "temporal-polyfill": "0.2.4", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tippy.js": "6.3.7", @@ -52,57 +51,53 @@ "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", "vanilla-colorful": "0.7.2", - "vue": "3.5.13", + "vue": "3.5.10", "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.98.0", - "webpack-cli": "6.0.1", + "webpack": "5.95.0", + "webpack-cli": "5.1.4", "wrap-ansi": "9.0.0" }, "devDependencies": { - "@axe-core/playwright": "4.10.1", - "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@playwright/test": "1.51.0", - "@stoplight/spectral-cli": "6.14.3", - "@stylistic/eslint-plugin-js": "4.2.0", - "@stylistic/stylelint-plugin": "3.1.2", - "@vitejs/plugin-vue": "5.2.3", - "@vitest/coverage-v8": "3.0.8", - "@vitest/eslint-plugin": "1.1.25", + "@axe-core/playwright": "4.10.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.4.0", + "@playwright/test": "1.47.2", + "@stoplight/spectral-cli": "6.13.1", + "@stylistic/eslint-plugin-js": "2.8.0", + "@stylistic/stylelint-plugin": "3.0.1", + "@vitejs/plugin-vue": "5.1.4", + "@vitest/coverage-v8": "2.1.1", + "@vitest/eslint-plugin": "1.0.0", "@vue/test-utils": "2.4.6", - "eslint": "9.22.0", - "eslint-import-resolver-typescript": "4.1.1", - "eslint-plugin-array-func": "5.0.2", - "eslint-plugin-import-x": "4.7.0", - "eslint-plugin-no-jquery": "3.1.1", - "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.2.0", - "eslint-plugin-regexp": "2.7.0", - "eslint-plugin-sonarjs": "3.0.2", - "eslint-plugin-toml": "0.12.0", - "eslint-plugin-unicorn": "57.0.0", + "eslint": "8.57.1", + "eslint-plugin-array-func": "4.0.0", + "eslint-plugin-github": "5.0.2", + "eslint-plugin-i": "2.29.1", + "eslint-plugin-no-jquery": "3.0.2", + "eslint-plugin-no-use-extend-native": "0.5.0", + "eslint-plugin-playwright": "1.6.2", + "eslint-plugin-regexp": "2.6.0", + "eslint-plugin-sonarjs": "2.0.2", + "eslint-plugin-unicorn": "55.0.0", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.0.0", - "eslint-plugin-vue-scoped-css": "2.9.0", - "eslint-plugin-wc": "2.2.1", - "globals": "16.0.0", - "happy-dom": "17.4.4", + "eslint-plugin-vue": "9.28.0", + "eslint-plugin-vue-scoped-css": "2.8.1", + "eslint-plugin-wc": "2.1.1", + "happy-dom": "15.10.2", "license-checker-rseidelsohn": "4.4.2", - "markdownlint-cli": "0.44.0", - "postcss-html": "1.8.0", - "stylelint": "16.16.0", + "markdownlint-cli": "0.41.0", + "postcss-html": "1.7.0", + "stylelint": "16.9.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", - "stylelint-declaration-strict-value": "1.10.11", + "stylelint-declaration-strict-value": "1.10.6", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", - "typescript": "5.7.3", - "typescript-eslint": "8.26.1", "vite-string-plugin": "1.3.4", - "vitest": "3.0.8" + "vitest": "2.1.1" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 18.0.0" } }, "node_modules/@alloc/quick-lru": { @@ -132,31 +127,31 @@ } }, "node_modules/@antfu/install-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz", - "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", "license": "MIT", "dependencies": { - "package-manager-detector": "^0.2.8", - "tinyexec": "^0.3.2" + "package-manager-detector": "^0.2.0", + "tinyexec": "^0.3.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@asyncapi/specs": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.8.1.tgz", - "integrity": "sha512-czHoAk3PeXTLR+X8IUaD+IpT+g+zUvkcgMDJVothBsan+oHN3jfcFcFUNdOPAAFoUCQN1hXF1dWuphWy05THlA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-4.3.1.tgz", + "integrity": "sha512-EfexhJu/lwF8OdQDm28NKLJHFkx0Gb6O+rcezhZYLPIoNYKXJMh2J1vFGpwmfAcTTh+ffK44Oc2Hs1Q4sLBp+A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -164,25 +159,467 @@ } }, "node_modules/@axe-core/playwright": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.1.tgz", - "integrity": "sha512-EV5t39VV68kuAfMKqb/RL+YjYKhfuGim9rgIaQ6Vntb2HgaCaau0h98Y3WEUqW1+PbdzxDtDNjFAipbtZuBmEA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.0.tgz", + "integrity": "sha512-kEr3JPEVUSnKIYp/egV2jvFj+chIjCjPp3K3zlpJMza/CB3TFw8UZNbI9agEC2uMz4YbgAOyzlbUy0QS+OofFA==", "dev": true, "license": "MPL-2.0", "dependencies": { - "axe-core": "~4.10.2" + "axe-core": "~4.10.0" }, "peerDependencies": { "playwright-core": ">= 1.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, @@ -190,37 +627,84 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -229,10 +713,1472 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", + "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz", + "integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-flow-strip-types": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -241,33 +2187,75 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } + "license": "MIT" }, "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", + "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { @@ -310,9 +2298,9 @@ "license": "Apache-2.0" }, "node_modules/@citation-js/core": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.14.tgz", - "integrity": "sha512-dgeGqYDSQmn2MtnWZkwPGpJQPh43yr1lAAr9jl1NJ9pIY1RXUQxtlAUZVur0V9PHdbfQC+kkvB1KC3VpgVV3MA==", + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@citation-js/core/-/core-0.7.11.tgz", + "integrity": "sha512-evQtyzeW+Gbmq+xWciIq9sbcvXXDbm8q32orD/HDd5ay6RQFKoW/BKxBLp+Nmpxgspb9sxTJn3iFK7+jxOTNTw==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", @@ -343,9 +2331,9 @@ } }, "node_modules/@citation-js/plugin-bibtex": { - "version": "0.7.16", - "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibtex/-/plugin-bibtex-0.7.16.tgz", - "integrity": "sha512-Udeli19VAoFjOw0H1bB1KgmekRoW6XP5cdR3OQF5c2Mt1tZatXWcSQVdq+FeLKzodRocZXG5NFRvjyUZjVbV6A==", + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@citation-js/plugin-bibtex/-/plugin-bibtex-0.7.11.tgz", + "integrity": "sha512-G4vEmLjrQUxgBIp3ffWN5dDOlwjPsrRSi/uTyxDJuFgKBD8GR1eO7Y/ZcePNAOHMqUxG7lxhhBbZJwcJZNVHYw==", "license": "MIT", "dependencies": { "@citation-js/date": "^0.5.0", @@ -440,9 +2428,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", + "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", "dev": true, "funding": [ { @@ -459,13 +2447,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-tokenizer": "^3.0.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", + "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", "dev": true, "funding": [ { @@ -506,13 +2494,57 @@ "@csstools/css-tokenizer": "^3.0.1" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz", + "integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", + "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "license": "MIT", "engines": { - "node": ">=14.17.0" + "node": ">=10.0.0" } }, "node_modules/@dual-bundle/import-meta-resolve": { @@ -526,44 +2558,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@emnapi/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -573,13 +2571,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -589,13 +2587,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -605,13 +2603,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -621,13 +2619,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -637,13 +2635,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -653,13 +2651,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -669,13 +2667,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -685,13 +2683,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -701,13 +2699,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -717,13 +2715,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -733,13 +2731,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -749,13 +2747,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -765,13 +2763,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -781,13 +2779,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -797,13 +2795,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -813,13 +2811,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -829,29 +2827,13 @@ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -861,29 +2843,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -893,13 +2859,13 @@ "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -909,13 +2875,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -925,13 +2891,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -941,13 +2907,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -957,13 +2923,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.1.tgz", - "integrity": "sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.0.tgz", + "integrity": "sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==", "dev": true, "license": "MIT", "dependencies": { @@ -981,20 +2947,17 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" - }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -1013,88 +2976,26 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/config-array": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", - "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", - "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1102,7 +3003,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1136,17 +3037,35 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { @@ -1170,38 +3089,21 @@ } }, "node_modules/@eslint/js": { - "version": "9.22.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", - "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "node_modules/@github/browserslist-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", + "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", - "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.12.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "license": "MIT" }, "node_modules/@github/combobox-nav": { "version": "2.3.1", @@ -1215,64 +3117,60 @@ "integrity": "sha512-AlquKGee+IWiAMYVB0xyHFZRMnu4n3X4HTvJHu79GiVJ1ojTukCWyxMlF5NMsecoLcBKsuBhx3QPv2vkE/zQ0A==", "license": "MIT" }, - "node_modules/@github/quote-selection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@github/quote-selection/-/quote-selection-2.1.0.tgz", - "integrity": "sha512-zyTvG6GpfWuVrRnxa/JpWPlTyj8ItTCMHXNrdXrvNPrSFCsDAiqEaxTW+644lwxXNfzTPQeN11paR9SRRvE2zg==", - "license": "MIT" - }, "node_modules/@github/relative-time-element": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.4.5.tgz", - "integrity": "sha512-9ejPtayBDIJfEU8x1fg/w2o5mahHkkp1SC6uObDtoKs4Gn+2a1vNK8XIiNDD8rMeEfpvDjydgSZZ+uk+7N0VsQ==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.4.4.tgz", + "integrity": "sha512-Oi8uOL8O+ZWLD7dHRWCkm2cudcTYtB3VyOYf9BtzCgDGm+OKomyOREtItNMtWl1dxvec62BTKErq36uy+RYxQg==", "license": "MIT" }, "node_modules/@github/text-expander-element": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.8.0.tgz", - "integrity": "sha512-kkS2rZ/CG8HGKblpLDQ8vcK/K7l/Jsvzi/N4ovwPAsFSOImcIbJh2MgCv9tzqE3wAm/qXlscvh3Ms4Hh1vtZvw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@github/text-expander-element/-/text-expander-element-2.7.1.tgz", + "integrity": "sha512-CWxfYxJRkeWVCUhJveproLs6pHsPrWtK8TsjL8ByYVcSCs8CJmNzF8b7ZawrUgfai0F2jb4aIdw2FoBTykj9XA==", "license": "MIT", "dependencies": { "@github/combobox-nav": "^2.0.2", - "dom-input-range": "^1.2.0" + "dom-input-range": "^1.1.6" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=18.18.0" + "node": ">=10.10.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": "*" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1289,19 +3187,13 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "license": "BSD-3-Clause" }, "node_modules/@iconify/types": { "version": "2.0.0", @@ -1310,31 +3202,18 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", + "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", + "@antfu/install-pkg": "^0.4.0", + "@antfu/utils": "^0.7.10", "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", + "debug": "^4.3.6", "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@iconify/utils/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "local-pkg": "^0.5.0", + "mlly": "^1.7.1" } }, "node_modules/@isaacs/cliui": { @@ -1378,12 +3257,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1444,9 +3317,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1501,23 +3374,10 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.3.tgz", + "integrity": "sha512-XfZgry4DwEZvSFtS/6Y+R48D7qJYJK6R9/yJFyUFHCIUMEEHuJ4X95TDgJp5QkmzfLYvapMPzskV5HpIDrREug==", "dev": true, "license": "MIT", "engines": { @@ -1528,9 +3388,9 @@ } }, "node_modules/@jsep-plugin/ternary": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.4.tgz", - "integrity": "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@jsep-plugin/ternary/-/ternary-1.1.3.tgz", + "integrity": "sha512-qtLGzCNzPVJ3kdH6/zoLWDPjauHIKiLSBAR71Wa0+PWvGA8wODUQvRgxtpUA5YqAYL3CQ8S4qXhd/9WuWTZirg==", "dev": true, "license": "MIT", "engines": { @@ -1540,45 +3400,10 @@ "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/@keyv/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3" - } - }, - "node_modules/@keyv/serialize/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", "license": "MIT" }, "node_modules/@mcaptcha/core-glue": { @@ -1641,17 +3466,38 @@ "langium": "3.0.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.7.tgz", - "integrity": "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==", + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.3.1", - "@emnapi/runtime": "^1.3.1", - "@tybys/wasm-util": "^0.9.0" + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1709,163 +3555,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-5.0.1.tgz", - "integrity": "sha512-lY5mi+6ztYGM9tiyMhHbzZteE7LFaexu9PjDL2N0stCNuGkSHO1eeeabi2ckxGWBbu9EW01XovbQqir12NbA6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-5.0.1.tgz", - "integrity": "sha512-wHKdPB2Q0dMVQy6b5depG8IGI0Y37CIUTZYrZDYEGMT3X481DAJjp6AIVVHQeolEZzy+lWrpUQdGPy0dQnt7IA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-5.0.1.tgz", - "integrity": "sha512-TchNkHMASh2vZ2/FH71zqgAUNYuAlP8Bm1ocSnt7UVV43jZ9kG8HtQFc3AsYeVGzw06LZoeE3mVdSQVXUZhgzA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-5.0.1.tgz", - "integrity": "sha512-JhqYi6uTSYflXSDNG/ZPTvBUcvcPR+vr/09XLdWJpZfEYzpPEEr7YQ2ogiOfZVUmCZOJWVOP8jJdv735j46a5w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-5.0.1.tgz", - "integrity": "sha512-W2OXq25tYiFVhi0Eioc9b+KWnaK2Hj7x/eW2u6r6u4afd1cQ09U+o5u98jrj1rxowSOTfFyiKqMqQOrS4PAlFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-5.0.1.tgz", - "integrity": "sha512-dYaXmy90L5fTpH0mWmWvsf5PC9me5Lyjcj5vOQYNVedSQUavGMbQ+sKOWOTAFIpS8xzzIhYRdLI7oj4WV9S2bQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-5.0.1.tgz", - "integrity": "sha512-lOgcxgtV7nM4TjolWgW9qk05iDQE2GGZTx2Zr+Jj+4GqdIhkkGpbqyGPJx2FRsY6kXhyaA9eOad4Bldfo8vAaw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-5.0.1.tgz", - "integrity": "sha512-3Pg8eSolVs3hy3xoqkjCgoIC1uHKPAUY0rs4QX+KtsPMOZ7iO5b3JBbJHl+ZDIeuzE8dkSRG7aIuCNVonp5G1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-5.0.1.tgz", - "integrity": "sha512-rBEgV5AW5obb6ATeNUSUouW0FzpoADOweTYblprko+Cv6rW1NSQGzGxD6o6jhIk4yV7/CZBwBWAkz9xpL5JSUQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-5.0.1.tgz", - "integrity": "sha512-okHg9C+z+2tCGKPszYVJDTZKhPHta7xKvhw0WMWPLTz9wbBMmHTuY9vVpgvFGhTU3N5iQ56LPollnSPtjvObCw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-5.0.1.tgz", - "integrity": "sha512-ODlCn4Pbd0HEWMixonax1uJtNCG4lEne6Jq98iUsmwSibQYcBzutxPed1qhLKur6KtCsYYa4LtRxys7e/5lZwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1876,14 +3565,27 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@playwright/test": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.0.tgz", - "integrity": "sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.2.tgz", + "integrity": "sha512-jTXRsoSPONAs8Za9QEQdyjFn+0ZQFjCiIztAIF6bi1HqhBzG9Ma7g1WotyiGqFSBRZjIEqMdT8RUlbk1QVhzCQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.51.0" + "playwright": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -1903,9 +3605,9 @@ } }, "node_modules/@primer/octicons": { - "version": "19.14.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.14.0.tgz", - "integrity": "sha512-9Ovw/xcUFHC/zbsNhr/Hkp1+m9XnNeQvnGHDHrI5vhlf6PRZVzSsdMnesV2xCzQh7jXP3EVRcaeXsUGlsZrfcA==", + "version": "19.9.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.9.0.tgz", + "integrity": "sha512-uAZa9cMgWkzbEsZnYWB7tg0vt7QprubD7ljtprz2fBJ8CjyqoxFRRsFvH4UiJdjK/3o87ODgDkhiflyJXDh+Lg==", "license": "MIT", "dependencies": { "object-assign": "^4.1.1" @@ -1959,9 +3661,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", - "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz", + "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==", "cpu": [ "arm" ], @@ -1973,9 +3675,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", - "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz", + "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==", "cpu": [ "arm64" ], @@ -1987,9 +3689,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", - "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz", + "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==", "cpu": [ "arm64" ], @@ -2001,9 +3703,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", - "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz", + "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==", "cpu": [ "x64" ], @@ -2014,38 +3716,10 @@ "darwin" ] }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", - "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", - "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", - "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz", + "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==", "cpu": [ "arm" ], @@ -2057,9 +3731,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", - "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz", + "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==", "cpu": [ "arm" ], @@ -2071,9 +3745,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", - "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz", + "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==", "cpu": [ "arm64" ], @@ -2085,9 +3759,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", - "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz", + "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==", "cpu": [ "arm64" ], @@ -2098,24 +3772,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", - "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", - "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz", + "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==", "cpu": [ "ppc64" ], @@ -2127,23 +3787,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", - "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", - "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz", + "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==", "cpu": [ "riscv64" ], @@ -2155,9 +3801,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", - "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz", + "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==", "cpu": [ "s390x" ], @@ -2169,9 +3815,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", - "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz", + "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==", "cpu": [ "x64" ], @@ -2183,9 +3829,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", - "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz", + "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==", "cpu": [ "x64" ], @@ -2197,9 +3843,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", - "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz", + "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==", "cpu": [ "arm64" ], @@ -2211,9 +3857,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", - "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz", + "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==", "cpu": [ "ia32" ], @@ -2225,9 +3871,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", - "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz", + "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==", "cpu": [ "x64" ], @@ -2238,6 +3884,13 @@ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@stoplight/better-ajv-errors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz", @@ -2337,20 +3990,20 @@ } }, "node_modules/@stoplight/spectral-cli": { - "version": "6.14.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.14.3.tgz", - "integrity": "sha512-vKy7d2yqBfOf94uB6KXzujDl6/qjXa8mCQ6cfsQ8xYsoArZN9iBHpS3271hR5IyTm3R1GwMgaSZ1h0sfZjZrZw==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-cli/-/spectral-cli-6.13.1.tgz", + "integrity": "sha512-v6ipX4w6wRhtbOotwdPL7RrEkP0m1OwHTIyqzVrAPi932F/zkee24jmf1CHNrTynonmfGoU6/XpeqUHtQdKDFw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", - "@stoplight/spectral-core": "^1.19.5", - "@stoplight/spectral-formatters": "^1.4.1", - "@stoplight/spectral-parsers": "^1.0.4", + "@stoplight/spectral-core": "^1.18.3", + "@stoplight/spectral-formatters": "^1.3.0", + "@stoplight/spectral-parsers": "^1.0.3", "@stoplight/spectral-ref-resolver": "^1.0.4", - "@stoplight/spectral-ruleset-bundler": "^1.6.0", - "@stoplight/spectral-ruleset-migrator": "^1.11.0", + "@stoplight/spectral-ruleset-bundler": "^1.5.4", + "@stoplight/spectral-ruleset-migrator": "^1.9.6", "@stoplight/spectral-rulesets": ">=1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", @@ -2358,16 +4011,16 @@ "fast-glob": "~3.2.12", "hpagent": "~1.2.0", "lodash": "~4.17.21", - "pony-cause": "^1.1.1", - "stacktracey": "^2.1.8", - "tslib": "^2.8.1", + "pony-cause": "^1.0.0", + "stacktracey": "^2.1.7", + "tslib": "^2.3.0", "yargs": "~17.7.2" }, "bin": { "spectral": "dist/index.js" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": "^12.20 || >= 14.13" } }, "node_modules/@stoplight/spectral-cli/node_modules/fast-glob": { @@ -2401,9 +4054,9 @@ } }, "node_modules/@stoplight/spectral-core": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.19.5.tgz", - "integrity": "sha512-i+njdliW7bAHGsHEgDvH0To/9IxiYiBELltkZ7ASVy4i+WXtZ40lQXpeRQRwePrBcSgQl0gcZFuKX10nmSHtbw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.19.1.tgz", + "integrity": "sha512-YiWhXdjyjn4vCl3102ywzwCEJzncxapFcj4dxcj1YP/bZ62DFeGJ8cEaMP164vSw2kI3rX7EMMzI/c8XOUnTfQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2412,25 +4065,25 @@ "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.4", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-runtime": "^1.0.0", "@stoplight/types": "~13.6.0", "@types/es-aggregate-error": "^1.0.2", "@types/json-schema": "^7.0.11", "ajv": "^8.17.1", "ajv-errors": "~3.0.0", - "ajv-formats": "~2.1.1", + "ajv-formats": "~2.1.0", "es-aggregate-error": "^1.0.7", - "jsonpath-plus": "^10.3.0", + "jsonpath-plus": "7.1.0", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", "minimatch": "3.1.2", - "nimma": "0.2.3", - "pony-cause": "^1.1.1", - "simple-eval": "1.0.1", - "tslib": "^2.8.1" + "nimma": "0.2.2", + "pony-cause": "^1.0.0", + "simple-eval": "1.0.0", + "tslib": "^2.3.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": "^12.20 || >= 14.13" } }, "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { @@ -2472,31 +4125,31 @@ } }, "node_modules/@stoplight/spectral-formats": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz", - "integrity": "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.7.0.tgz", + "integrity": "sha512-vJ1vIkA2s96fdJp0d3AJBGuPAW3sj8yMamyzR+dquEFO6ZAoYBo/BVsKKQskYzZi/nwljlRqUmGVmcf2PncIaA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/json": "^3.17.0", - "@stoplight/spectral-core": "^1.19.2", + "@stoplight/spectral-core": "^1.8.0", "@types/json-schema": "^7.0.7", - "tslib": "^2.8.1" + "tslib": "^2.3.1" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" } }, "node_modules/@stoplight/spectral-formatters": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formatters/-/spectral-formatters-1.4.3.tgz", - "integrity": "sha512-03Nc6nhjMO9aHhJPgBH4zDwMPklKLWEMtvx+PMmzfStCndMjJkf8ki7O/55u3myZ1TwxBzln9z9tXPLSL3KKhw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formatters/-/spectral-formatters-1.4.0.tgz", + "integrity": "sha512-nxYQldDzVg32pxQ4cMX27eMtB1A39ea+GSf0wIJ20mqkSBfIgLnRZ+GKkBxhgF9JzSolc4YtweydsubGQGd7ag==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/path": "^1.3.2", - "@stoplight/spectral-core": "^1.19.4", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-core": "^1.15.1", + "@stoplight/spectral-runtime": "^1.1.0", "@stoplight/types": "^13.15.0", "@types/markdown-escape": "^1.1.3", "chalk": "4.1.2", @@ -2506,49 +4159,49 @@ "node-sarif-builder": "^2.0.3", "strip-ansi": "6.0", "text-table": "^0.2.0", - "tslib": "^2.8.1" + "tslib": "^2.5.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": "^12.20 || >=14.13" } }, "node_modules/@stoplight/spectral-functions": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.9.4.tgz", - "integrity": "sha512-+dgu7QQ1JIZFsNLhNbQLPA9tniIT3KjOc9ORv0LYSCLvZjkWT2bN7vgmathbXsbmhnmhvl15H9sRqUIqzi+qoQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.9.0.tgz", + "integrity": "sha512-T+xl93ji8bpus4wUsTq8Qr2DSu2X9PO727rbxW61tTCG0s17CbsXOLYI+Ezjg5P6aaQlgXszGX8khtc57xk8Yw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.1", - "@stoplight/spectral-core": "^1.19.4", - "@stoplight/spectral-formats": "^1.8.1", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-core": "^1.7.0", + "@stoplight/spectral-formats": "^1.7.0", + "@stoplight/spectral-runtime": "^1.1.0", "ajv": "^8.17.1", "ajv-draft-04": "~1.0.0", "ajv-errors": "~3.0.0", - "ajv-formats": "~2.1.1", + "ajv-formats": "~2.1.0", "lodash": "~4.17.21", - "tslib": "^2.8.1" + "tslib": "^2.3.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" } }, "node_modules/@stoplight/spectral-parsers": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz", - "integrity": "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-parsers/-/spectral-parsers-1.0.4.tgz", + "integrity": "sha512-nCTVvtX6q71M8o5Uvv9kxU31Gk1TRmgD6/k8HBhdCmKG6FWcwgjiZouA/R3xHLn/VwTI/9k8SdG5Mkdy0RBqbQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/types": "^14.1.1", "@stoplight/yaml": "~4.3.0", - "tslib": "^2.8.1" + "tslib": "^2.3.1" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": "^12.20 || >=14.13" } }, "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { @@ -2566,9 +4219,9 @@ } }, "node_modules/@stoplight/spectral-ref-resolver": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz", - "integrity": "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.4.tgz", + "integrity": "sha512-5baQIYL0NJTSVy8v6RxOR4U51xOUYM8wJri1YvlAT6bPN8m0EIxMwfVYi0xUZEMVeHcWx869nIkoqyWmOutF2A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2576,64 +4229,64 @@ "@stoplight/json-ref-resolver": "~3.1.6", "@stoplight/spectral-runtime": "^1.1.2", "dependency-graph": "0.11.0", - "tslib": "^2.8.1" + "tslib": "^2.3.1" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" } }, "node_modules/@stoplight/spectral-ruleset-bundler": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.6.2.tgz", - "integrity": "sha512-Tg7y/0e/6yY4hiebh9YLUGa/fHcgI6RyjfBcRGipYU7QDcJUn2UZYSzeC9hggMwT0UiRzdQlch0aEl7L4VL1GQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-bundler/-/spectral-ruleset-bundler-1.6.0.tgz", + "integrity": "sha512-8CU7e4aEGdfU9ncVDtlnJSawg/6epzAHrQTjuNu1QfKAOoiwyG7oUk2XUTHWcvq6Q67iUctb0vjOokR+MPVg0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@rollup/plugin-commonjs": "~22.0.2", "@stoplight/path": "1.3.2", "@stoplight/spectral-core": ">=1", - "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-formats": "^1.7.0", "@stoplight/spectral-functions": ">=1", "@stoplight/spectral-parsers": ">=1", "@stoplight/spectral-ref-resolver": "^1.0.4", "@stoplight/spectral-ruleset-migrator": "^1.9.6", "@stoplight/spectral-rulesets": ">=1", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-runtime": "^1.1.0", "@stoplight/types": "^13.6.0", "@types/node": "*", "pony-cause": "1.1.1", - "rollup": "~2.79.2", - "tslib": "^2.8.1", + "rollup": "~2.79.0", + "tslib": "^2.3.1", "validate-npm-package-name": "3.0.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": "^12.20 || >= 14.13" } }, "node_modules/@stoplight/spectral-ruleset-migrator": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.11.2.tgz", - "integrity": "sha512-6r5i4hrDmppspSSxdUKKNHc07NGSSIkvwKNk3M5ukCwvSslImvDEimeWAhPBryhmSJ82YAsKr8erZZpKullxWw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-ruleset-migrator/-/spectral-ruleset-migrator-1.10.0.tgz", + "integrity": "sha512-nDfkVfYeWWv0UvILC4TWZSnRqQ4rHgeOJO1/lHQ7XHeG5iONanQ639B1aK6ZS6vuUc8gwuyQsrPF67b4sHIyYw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/ordered-object-literal": "~1.0.4", "@stoplight/path": "1.3.2", - "@stoplight/spectral-functions": "^1.9.1", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-functions": "^1.0.0", + "@stoplight/spectral-runtime": "^1.1.0", "@stoplight/types": "^13.6.0", "@stoplight/yaml": "~4.2.3", "@types/node": "*", "ajv": "^8.17.1", "ast-types": "0.14.2", - "astring": "^1.9.0", + "astring": "^1.7.5", "reserved": "0.1.2", - "tslib": "^2.8.1", + "tslib": "^2.3.1", "validate-npm-package-name": "3.0.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" } }, "node_modules/@stoplight/spectral-ruleset-migrator/node_modules/@stoplight/yaml": { @@ -2660,49 +4313,63 @@ "license": "Apache-2.0" }, "node_modules/@stoplight/spectral-rulesets": { - "version": "1.21.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.21.4.tgz", - "integrity": "sha512-F03Uf+Rb9FnxfjNeIeB0B/dGDJ+NozRkQZtZ/jryoOu+7Qp7rI1e/BkFWEM3y4Fr0zcNEkpS7bjkXnW4frHPcA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.20.2.tgz", + "integrity": "sha512-7Y8orZuNyGyeHr9n50rMfysgUJ+/zzIEHMptt66jiy82GUWl+0nr865DkMuXdC5GryfDYhtjoRTUCVsXu80Nkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@asyncapi/specs": "^6.8.0", + "@asyncapi/specs": "^4.1.0", "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.0", - "@stoplight/spectral-core": "^1.19.4", - "@stoplight/spectral-formats": "^1.8.1", - "@stoplight/spectral-functions": "^1.9.1", - "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/spectral-core": "^1.8.1", + "@stoplight/spectral-formats": "^1.7.0", + "@stoplight/spectral-functions": "^1.5.1", + "@stoplight/spectral-runtime": "^1.1.1", "@stoplight/types": "^13.6.0", "@types/json-schema": "^7.0.7", "ajv": "^8.17.1", - "ajv-formats": "~2.1.1", + "ajv-formats": "~2.1.0", "json-schema-traverse": "^1.0.0", "leven": "3.1.0", "lodash": "~4.17.21", - "tslib": "^2.8.1" + "tslib": "^2.3.0" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" } }, "node_modules/@stoplight/spectral-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz", - "integrity": "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.2.tgz", + "integrity": "sha512-fr5zRceXI+hrl82yAVoME+4GvJie8v3wmOe9tU+ZLRRNonizthy8qDi0Z/z4olE+vGreSDcuDOZ7JjRxFW5kTw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@stoplight/json": "^3.20.1", + "@stoplight/json": "^3.17.0", "@stoplight/path": "^1.3.2", - "@stoplight/types": "^13.6.0", + "@stoplight/types": "^12.3.0", "abort-controller": "^3.0.0", "lodash": "^4.17.21", - "node-fetch": "^2.7.0", - "tslib": "^2.8.1" + "node-fetch": "^2.6.7", + "tslib": "^2.3.1" }, "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" + "node": ">=12" + } + }, + "node_modules/@stoplight/spectral-runtime/node_modules/@stoplight/types": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.5.0.tgz", + "integrity": "sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@stoplight/types": { @@ -2757,32 +4424,32 @@ } }, "node_modules/@stylistic/eslint-plugin-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.2.0.tgz", - "integrity": "sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.8.0.tgz", + "integrity": "sha512-/e7pSzVMrwBd6yzSDsKHwax3TS96+pd/xSKzELaTkOuYqUhYfj/becWdfDbFSBGQD7BBBCiiE4L8L2cUfu5h+A==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0" + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": ">=8.40.0" } }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz", - "integrity": "sha512-tylFJGMQo62alGazK74MNxFjMagYOHmBZiePZFOJK2n13JZta0uVkB3Bh5qodUmOLtRH+uxH297EibK14UKm8g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.0.1.tgz", + "integrity": "sha512-j3mH8HSw2Rob/KJFWZ627w3CQ8gQqVHtzCdPeEffUg5vOgpz4rgrR+Xw2kU0OQCDcdW8Y1nKfdXKKjM5Rn8X0g==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/css-parser-algorithms": "^3.0.0", + "@csstools/css-tokenizer": "^3.0.0", + "@csstools/media-query-list-parser": "^3.0.0", "is-plain-object": "^5.0.0", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", @@ -2812,17 +4479,6 @@ "node": ">=10.13.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/codemirror": { "version": "5.60.15", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", @@ -2832,276 +4488,6 @@ "@types/tern": "*" } }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/doctrine": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/es-aggregate-error": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz", @@ -3112,54 +4498,22 @@ "@types/node": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "license": "MIT" }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, @@ -3176,20 +4530,13 @@ "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", "license": "MIT" }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/normalize-package-data": { @@ -3215,20 +4562,6 @@ "@types/estree": "*" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/urijs": { "version": "1.19.25", "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz", @@ -3237,21 +4570,21 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", - "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", + "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/type-utils": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/type-utils": "8.7.0", + "@typescript-eslint/utils": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3262,21 +4595,25 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/parser": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", - "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", + "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4" }, "engines": { @@ -3287,19 +4624,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", + "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3310,16 +4651,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", - "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", + "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/utils": "8.26.1", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/utils": "8.7.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3328,15 +4669,16 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", + "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", "dev": true, "license": "MIT", "engines": { @@ -3348,20 +4690,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", + "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3370,8 +4712,10 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -3391,16 +4735,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", + "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3410,19 +4754,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", + "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.7.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3432,203 +4775,66 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@unrs/rspack-resolver-binding-darwin-arm64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-darwin-arm64/-/rspack-resolver-binding-darwin-arm64-1.2.2.tgz", - "integrity": "sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw==", - "cpu": [ - "arm64" - ], + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-darwin-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-darwin-x64/-/rspack-resolver-binding-darwin-x64-1.2.2.tgz", - "integrity": "sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-freebsd-x64": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-freebsd-x64/-/rspack-resolver-binding-freebsd-x64-1.2.2.tgz", - "integrity": "sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-linux-arm-gnueabihf": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm-gnueabihf/-/rspack-resolver-binding-linux-arm-gnueabihf-1.2.2.tgz", - "integrity": "sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-linux-arm64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm64-gnu/-/rspack-resolver-binding-linux-arm64-gnu-1.2.2.tgz", - "integrity": "sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-linux-arm64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-arm64-musl/-/rspack-resolver-binding-linux-arm64-musl-1.2.2.tgz", - "integrity": "sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-linux-x64-gnu": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-x64-gnu/-/rspack-resolver-binding-linux-x64-gnu-1.2.2.tgz", - "integrity": "sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-linux-x64-musl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-linux-x64-musl/-/rspack-resolver-binding-linux-x64-musl-1.2.2.tgz", - "integrity": "sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-wasm32-wasi": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-wasm32-wasi/-/rspack-resolver-binding-wasm32-wasi-1.2.2.tgz", - "integrity": "sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@unrs/rspack-resolver-binding-win32-arm64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-win32-arm64-msvc/-/rspack-resolver-binding-win32-arm64-msvc-1.2.2.tgz", - "integrity": "sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg==", - "cpu": [ - "arm64" - ], + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/rspack-resolver-binding-win32-x64-msvc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@unrs/rspack-resolver-binding-win32-x64-msvc/-/rspack-resolver-binding-win32-x64-msvc-1.2.2.tgz", - "integrity": "sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "ISC" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz", - "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", "dev": true, "license": "MIT", "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", + "vite": "^5.0.0", "vue": "^3.2.25" } }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.8.tgz", - "integrity": "sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.1.tgz", + "integrity": "sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.6", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.8.0", + "magic-string": "^0.30.11", + "magicast": "^0.3.4", + "std-env": "^3.7.0", "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.8", - "vitest": "3.0.8" + "@vitest/browser": "2.1.1", + "vitest": "2.1.1" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -3637,9 +4843,9 @@ } }, "node_modules/@vitest/coverage-v8/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -3647,18 +4853,21 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.1.25", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.25.tgz", - "integrity": "sha512-u8DpDnMbPcqBmJOB4PeEtn6q7vKmLVTLFMpzoxSAo0hjYdl4iYSHRleqwPQo0ywc7UV0S6RKIahYRQ3BnZdMVw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.0.0.tgz", + "integrity": "sha512-YQSFGYrD+eAa2QqdL8v4WAG3yYhcfW3LGlPdNRcjbF1etX0xUfI4isE+U+tYjQuVVzHG4KccRg1F8UuveFVdfg==", "dev": true, "license": "MIT", "peerDependencies": { - "@typescript-eslint/utils": ">= 8.0", + "@typescript-eslint/utils": ">= 7.8 || 8.0.0", "eslint": ">= 8.57.0", "typescript": ">= 5.0.0", "vitest": "*" }, "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, "typescript": { "optional": true }, @@ -3668,38 +4877,39 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.8.tgz", - "integrity": "sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.8", - "@vitest/utils": "3.0.8", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.8.tgz", - "integrity": "sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.8", + "@vitest/spy": "^2.1.0-beta.1", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.11" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "@vitest/spy": "2.1.1", + "msw": "^2.3.5", + "vite": "^5.0.0" }, "peerDependenciesMeta": { "msw": { @@ -3728,9 +4938,9 @@ } }, "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -3738,51 +4948,51 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.8.tgz", - "integrity": "sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.8.tgz", - "integrity": "sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.8", - "pathe": "^2.0.3" + "@vitest/utils": "2.1.1", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.8.tgz", - "integrity": "sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.8", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "@vitest/pretty-format": "2.1.1", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -3790,140 +5000,140 @@ } }, "node_modules/@vitest/spy": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.8.tgz", - "integrity": "sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.2" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.8.tgz", - "integrity": "sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.8", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "2.1.1", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz", + "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", + "@vue/shared": "3.5.10", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz", + "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz", + "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", + "@vue/compiler-core": "3.5.10", + "@vue/compiler-dom": "3.5.10", + "@vue/compiler-ssr": "3.5.10", + "@vue/shared": "3.5.10", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", - "postcss": "^8.4.48", + "postcss": "^8.4.47", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz", + "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz", + "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/shared": "3.5.10" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz", + "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.10", + "@vue/shared": "3.5.10" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz", + "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", + "@vue/reactivity": "3.5.10", + "@vue/runtime-core": "3.5.10", + "@vue/shared": "3.5.10", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz", + "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.10", + "@vue/shared": "3.5.10" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.10" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz", + "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -3938,188 +5148,188 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "license": "MIT", "engines": { - "node": ">=18.12.0" + "node": ">=14.15.0" }, "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "license": "MIT", "engines": { - "node": ">=18.12.0" + "node": ">=14.15.0" }, "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "license": "MIT", "engines": { - "node": ">=18.12.0" + "node": ">=14.15.0" }, "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -4163,9 +5373,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4174,6 +5384,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4318,15 +5537,25 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -4376,16 +5605,18 @@ "node": ">=8" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -4395,20 +5626,97 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4428,9 +5736,9 @@ } }, "node_modules/asciinema-player": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/asciinema-player/-/asciinema-player-3.8.2.tgz", - "integrity": "sha512-Lgcnj9u/H6sRpGRX1my7Azcay6llLmB/GVkCGcDbPwdTVTisS1ir8SQ9jRWRvjlLUjpSJkN0euruvy3sLRM8tw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/asciinema-player/-/asciinema-player-3.8.0.tgz", + "integrity": "sha512-yFoAcjFK9WJ0D+aagkT0YXOWRbyXoOe/TQHq07oQP6prItXQkWn46fdvUb6zqJu2AywmY8VjBEwZ6ciL8IbezQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.21.0", @@ -4460,6 +5768,13 @@ "node": ">=4" } }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4480,16 +5795,6 @@ "astring": "bin/astring" } }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -4520,15 +5825,77 @@ } }, "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", + "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", "dev": true, "license": "MPL-2.0", "engines": { "node": ">=4" } }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4605,9 +5972,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -4624,10 +5991,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4706,69 +6073,18 @@ "node": ">=8" } }, - "node_modules/cacheable": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.9.tgz", - "integrity": "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookified": "^1.7.1", - "keyv": "^5.3.1" - } - }, - "node_modules/cacheable/node_modules/keyv": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz", - "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.0.3" - } - }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4796,9 +6112,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001707", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", - "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", + "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", "funding": [ { "type": "opencollective", @@ -4816,9 +6132,9 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "license": "MIT", "dependencies": { @@ -4848,43 +6164,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chart.js": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.5.tgz", - "integrity": "sha512-CVVjg1RYTJV9OCC8WeJPMx8gsV8K6WIyIEQUE3ui4AR9Hfgls9URri6Ja3hyMVBbTF8Q2KFa19PE815gWcWhng==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", + "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" @@ -4907,12 +6190,11 @@ } }, "node_modules/chartjs-plugin-zoom": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.2.0.tgz", - "integrity": "sha512-in6kcdiTlP6npIVLMd4zXZ08PDUXC52gZ4FAy5oyjk1zX3gKarXMAof7B9eFiisf9WOC3bh2saHg+J5WtLXZeA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chartjs-plugin-zoom/-/chartjs-plugin-zoom-2.0.1.tgz", + "integrity": "sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==", "license": "MIT", "dependencies": { - "@types/hammerjs": "^2.0.45", "hammerjs": "^2.0.8" }, "peerDependencies": { @@ -5001,9 +6283,9 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "dev": true, "funding": [ { @@ -5102,9 +6384,9 @@ } }, "node_modules/codemirror": { - "version": "5.65.19", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.19.tgz", - "integrity": "sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==", + "version": "5.65.18", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.18.tgz", + "integrity": "sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==", "license": "MIT" }, "node_modules/codemirror-spell-checker": { @@ -5151,7 +6433,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -5182,9 +6463,9 @@ "license": "MIT" }, "node_modules/confbox": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.1.tgz", - "integrity": "sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "license": "MIT" }, "node_modules/config-chain": { @@ -5198,14 +6479,21 @@ "proto-list": "~1.2.1" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "browserslist": "^4.23.3" }, "funding": { "type": "opencollective", @@ -5248,9 +6536,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5274,9 +6562,9 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", "dev": true, "license": "MIT", "engines": { @@ -5336,13 +6624,13 @@ } }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", + "mdn-data": "2.0.30", "source-map-js": "^1.0.1" }, "engines": { @@ -5417,9 +6705,9 @@ "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.31.1.tgz", - "integrity": "sha512-Hx5Mtb1+hnmAKaZZ/7zL1Y5HTFYOjdDswZy/jD+1WINRU8KVi1B7+vlHdsTwY+VCFucTreoyu1RDzQJ9u0d2Hw==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", + "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", "license": "MIT", "engines": { "node": ">=0.10" @@ -5909,15 +7197,22 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", - "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", "license": "MIT", "dependencies": { - "d3": "^7.9.0", + "d3": "^7.8.2", "lodash-es": "^4.17.21" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-uri-to-buffer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", @@ -5926,15 +7221,15 @@ "license": "MIT" }, "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5944,31 +7239,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/inspect-js" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -5986,9 +7281,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -6002,20 +7297,6 @@ } } }, - "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -6036,6 +7317,39 @@ "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -6108,30 +7422,6 @@ "node": ">= 0.6.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -6224,18 +7514,15 @@ } }, "node_modules/dompurify": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", - "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", + "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6257,21 +7544,6 @@ "just-extend": "^5.0.0" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6327,15 +7599,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.123", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", - "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", + "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", "license": "ISC" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, "node_modules/emojis-list": { @@ -6348,9 +7620,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -6403,63 +7675,58 @@ } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -6492,11 +7759,14 @@ } }, "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { "node": ">= 0.4" } @@ -6511,16 +7781,63 @@ "node": ">= 0.4" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "license": "MIT", "dependencies": { @@ -6531,44 +7848,40 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6578,52 +7891,50 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/esbuild-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.3.0.tgz", - "integrity": "sha512-D7HeJNdkDKKMarPQO/3dlJT6RwN2YJO7ENU6RPlpOz5YxSHnUNi2yvW41Bckvi1EVwctIaLzlb0ni5ag2GINYA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.2.2.tgz", + "integrity": "sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==", "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.21.0", "get-tsconfig": "^4.7.0", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" @@ -6670,70 +7981,65 @@ } }, "node_modules/eslint": { - "version": "9.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", - "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.1.0", - "@eslint/core": "^0.12.0", - "@eslint/eslintrc": "^3.3.0", - "@eslint/js": "9.22.0", - "@eslint/plugin-kit": "^0.2.7", - "@humanfs/node": "^0.16.6", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.2", "debug": "^4.3.2", + "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-compat-utils": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.4.tgz", - "integrity": "sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6746,6 +8052,19 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -6768,113 +8087,393 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.1.1.tgz", - "integrity": "sha512-91As8PwH6xjPwndAbvhTuZ3DUfdl4HttocWRyaLOd5T4uUo6km8EDO7Sve4jzH50V1wbgql2nOFbE3GGfARJag==", + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^1.3.0", - "rspack-resolver": "^1.1.2", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.12" + "debug": "^3.2.7" }, "engines": { - "node": "^16.17.0 || >=18.6.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" + "node": ">=4" }, "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { + "eslint": { "optional": true } } }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-array-func": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-array-func/-/eslint-plugin-array-func-5.0.2.tgz", - "integrity": "sha512-iyLex2+pTcxHZ6OLL80oMy+CtffpJ9j6A/57VQi1VN5bK1IS/0o+mWvezDHeAlwXjn6ksRO9L5SGU329BBuY8A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-array-func/-/eslint-plugin-array-func-4.0.0.tgz", + "integrity": "sha512-p3NY2idNIvgmQLF2/62ZskYt8gOuUgQ51smRc3Lh7FtSozpNc2sg+lniz9VaCagLZHEZTl8qGJKqE7xy8O/D/g==", "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=8.51.0" + "eslint": ">=8.40.0" } }, - "node_modules/eslint-plugin-import-x": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.7.0.tgz", - "integrity": "sha512-LHxq8V6SJ99hSFYAexxUKk3gVsjb8fuNRGsbMinwlJGvcuREP9SVzCCNKJ3POdDowEHdExy/bPN6YfjraueIXA==", + "node_modules/eslint-plugin-escompat": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.11.3.tgz", + "integrity": "sha512-Gz/eTJzl7fK9SPBkvB3t+xc1iribxRc5Fgu6Z7206b5q1d7kG0t8Drtin8MRY4UgGBg8Zu1HG6RGzR35LCUpLA==", "dev": true, "license": "MIT", "dependencies": { - "@types/doctrine": "^0.0.9", - "@typescript-eslint/utils": "^8.26.1", - "debug": "^4.4.0", - "doctrine": "^3.0.0", - "eslint-import-resolver-node": "^0.3.9", - "get-tsconfig": "^4.10.0", - "is-glob": "^4.0.3", - "minimatch": "^10.0.1", - "oxc-resolver": "^5.0.0", - "semver": "^7.7.1", - "stable-hash": "^0.0.5", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "browserslist": "^4.23.1" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": ">=5.14.1" + } + }, + "node_modules/eslint-plugin-eslint-comments": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", + "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "ignore": "^5.0.5" + }, + "engines": { + "node": ">=6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-plugin-filenames": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", + "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.camelcase": "4.3.0", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "lodash.upperfirst": "4.3.1" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-github": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-5.0.2.tgz", + "integrity": "sha512-nMdzWJQ5CimjQDY6SFeJ0KIXuNFf0dgDWEd4eP3UWfuTuP/dXcZJDg7MQRvAFt743T1zUi4+/HdOihfu8xJkLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@github/browserslist-config": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.0", + "@typescript-eslint/parser": "^8.0.0", + "aria-query": "^5.3.0", + "eslint-config-prettier": ">=8.0.0", + "eslint-plugin-escompat": "^3.3.3", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-filenames": "^1.3.2", + "eslint-plugin-i18n-text": "^1.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-no-only-tests": "^3.0.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-rule-documentation": ">=1.0.0", + "jsx-ast-utils": "^3.3.2", + "prettier": "^3.0.0", + "svg-element-attributes": "^1.3.1" + }, + "bin": { + "eslint-ignore-errors": "bin/eslint-ignore-errors.js" + }, + "peerDependencies": { + "eslint": "^8.0.1" + } + }, + "node_modules/eslint-plugin-i": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-i/-/eslint-plugin-i-2.29.1.tgz", + "integrity": "sha512-ORizX37MelIWLbMyqI7hi8VJMf7A0CskMmYkB+lkCX3aF4pkGV7kwx5bSEb4qx7Yce2rAf9s34HqDRPjGRZPNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "get-tsconfig": "^4.7.2", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://opencollective.com/unts" + }, + "peerDependencies": { + "eslint": "^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-i/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-i/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-i18n-text": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", + "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", + "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/eslint-plugin-no-jquery": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", - "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz", + "integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==", "dev": true, "license": "MIT", "peerDependencies": { "eslint": ">=8.0.0" } }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.0.0" + } + }, "node_modules/eslint-plugin-no-use-extend-native": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.7.2.tgz", - "integrity": "sha512-hUBlwaTXIO1GzTwPT6pAjvYwmSHe4XduDhAiQvur4RUujmBUFjd8Nb2+e7WQdsQ+nGHWGRlogcUWXJRGqizTWw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz", + "integrity": "sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==", "dev": true, "license": "MIT", "dependencies": { - "is-get-set-prop": "^2.0.0", - "is-js-type": "^3.0.0", - "is-obj-prop": "^2.0.0", - "is-proto-prop": "^3.0.1" + "is-get-set-prop": "^1.0.0", + "is-js-type": "^2.0.0", + "is-obj-prop": "^1.0.0", + "is-proto-prop": "^2.0.0" }, "engines": { - "node": ">=18.18.0" - }, - "peerDependencies": { - "eslint": "^9.3.0" + "node": ">=6.0.0" } }, "node_modules/eslint-plugin-playwright": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.2.0.tgz", - "integrity": "sha512-qSQpAw7RcSzE3zPp8FMGkthaCWovHZ/BsXtpmnGax9vQLIovlh1bsZHEa2+j2lv9DWhnyeLM/qZmp7ffQZfQvg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.6.2.tgz", + "integrity": "sha512-mraN4Em3b5jLt01q7qWPyLg0Q5v3KAWfJSlEWwldyUXoa7DSPrBR4k6B6LROLqipsG8ndkwWMdjl1Ffdh15tag==", "dev": true, "license": "MIT", "workspaces": [ @@ -6887,47 +8486,166 @@ "node": ">=16.6.0" }, "peerDependencies": { - "eslint": ">=8.40.0" + "eslint": ">=8.40.0", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } } }, - "node_modules/eslint-plugin-playwright/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/eslint-plugin-playwright/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint-plugin-react": { + "version": "7.37.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz", + "integrity": "sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-regexp": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.7.0.tgz", - "integrity": "sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.6.0.tgz", + "integrity": "sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", + "@eslint-community/regexpp": "^4.9.1", "comment-parser": "^1.4.0", "jsdoc-type-pratt-parser": "^4.0.0", "refa": "^0.12.1", @@ -6942,26 +8660,450 @@ } }, "node_modules/eslint-plugin-sonarjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.2.tgz", - "integrity": "sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-2.0.2.tgz", + "integrity": "sha512-0JUYTlUDk/up3mS0rFP9vHCRvhIYNTy06m99IPFeyMDUWL8u0ebz+nFPYn6OWDBTIEfbvQ/Xe0PdjWO8w0WD0Q==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { - "@eslint-community/regexpp": "4.12.1", + "@babel/core": "7.24.3", + "@babel/eslint-parser": "7.24.1", + "@babel/plugin-proposal-decorators": "7.24.1", + "@babel/preset-env": "7.24.3", + "@babel/preset-flow": "7.24.1", + "@babel/preset-react": "7.24.1", + "@eslint-community/regexpp": "4.10.0", + "@typescript-eslint/eslint-plugin": "7.16.1", + "@typescript-eslint/utils": "^7.16.1", "builtin-modules": "3.3.0", "bytes": "3.1.2", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "4.6.0", + "eslint-scope": "8.0.1", "functional-red-black-tree": "1.0.1", - "jsx-ast-utils": "3.3.5", - "minimatch": "9.0.5", + "jsx-ast-utils": "^3.3.5", + "minimatch": "^9.0.3", "scslre": "0.3.0", - "semver": "7.7.1", - "typescript": "^5" + "semver": "7.6.0", + "typescript": "*", + "vue-eslint-parser": "9.4.3" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", + "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/type-utils": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/scope-manager": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", + "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", + "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/eslint-scope": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-sonarjs/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6978,51 +9120,52 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-toml": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz", - "integrity": "sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==", + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^4.1.1", - "eslint-compat-utils": "^0.6.0", - "lodash": "^4.17.19", - "toml-eslint-parser": "^0.10.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=6.0.0" + "node": ">=10" } }, + "node_modules/eslint-plugin-sonarjs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/eslint-plugin-unicorn": { - "version": "57.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-57.0.0.tgz", - "integrity": "sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==", + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", + "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "@eslint-community/eslint-utils": "^4.4.1", - "ci-info": "^4.1.0", + "@babel/helper-validator-identifier": "^7.24.5", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.40.0", - "esquery": "^1.6.0", - "globals": "^15.15.0", - "indent-string": "^5.0.0", - "is-builtin-module": "^4.0.0", - "jsesc": "^3.1.0", + "core-js-compat": "^3.37.0", + "esquery": "^1.5.0", + "globals": "^15.7.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", "pluralize": "^8.0.0", - "read-package-up": "^11.0.0", + "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", - "regjsparser": "^0.12.0", - "semver": "^7.7.1", - "strip-indent": "^4.0.0" + "regjsparser": "^0.10.0", + "semver": "^7.6.1", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=18.18" @@ -7031,13 +9174,13 @@ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=9.20.0" + "eslint": ">=8.56.0" } }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", "dev": true, "license": "MIT", "engines": { @@ -7047,6 +9190,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/eslint-plugin-vitest-globals": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz", @@ -7055,36 +9211,37 @@ "license": "MIT" }, "node_modules/eslint-plugin-vue": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.0.0.tgz", - "integrity": "sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", + "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "vue-eslint-parser": "^10.0.0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-vue-scoped-css": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.9.0.tgz", - "integrity": "sha512-zXeKtEUpfk3PlsgKnr9/2U8K2xcsCV1M9hXWRhKbl3wipVowGXfHrhqUzHFVWNAHzEQv0DCDXGFWrmsGFqhGGA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.8.1.tgz", + "integrity": "sha512-V6B+zZE60ykYvHTDzdhJ3xa4C83ntmGXqFsylc8l1jdVR9PSgod2+bGFNL7OwRKgZj82ij/o904xa04z1bfCRA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "eslint-compat-utils": "^0.6.0", + "eslint-compat-utils": "^0.5.0", "lodash": "^4.17.21", "postcss": "^8.4.31", "postcss-safe-parser": "^6.0.0", @@ -7104,9 +9261,9 @@ } }, "node_modules/eslint-plugin-wc": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.2.1.tgz", - "integrity": "sha512-KstLqGmyQz088DvFlDYHg0sHih+w2QeulreCi1D1ftr357klO2zqHdG/bbnNMmuQdVFDuNkopNIyNhmG0XCT/g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.1.1.tgz", + "integrity": "sha512-GfJo05ZgWfwAFbW6Gkf+9CMOIU6fmbd3b4nm+PKESHgUdUTmi7vawlELCrzOhdiQjXUPZxDfFIVxYt9D/v/GdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7114,13 +9271,23 @@ "js-levenshtein-esm": "^1.2.0" }, "peerDependencies": { - "eslint": ">=8.40.0" + "eslint": ">=5" + } + }, + "node_modules/eslint-rule-documentation": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", + "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -7128,16 +9295,16 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7147,13 +9314,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7182,6 +9342,37 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7203,15 +9394,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7289,22 +9480,6 @@ "node": ">=0.8.x" } }, - "node_modules/expect-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", - "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7319,16 +9494,16 @@ "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" @@ -7350,7 +9525,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -7368,20 +9542,10 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -7393,9 +9557,9 @@ } }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -7410,37 +9574,17 @@ "node-fetch": "~2.6.1" } }, - "node_modules/fetch-ponyfill/node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/fill-range": { @@ -7472,19 +9616,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -7495,49 +9626,44 @@ } }, "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true, "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { @@ -7593,18 +9719,16 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -7630,6 +9754,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -7641,9 +9775,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "license": "MIT", "engines": { "node": ">=18" @@ -7652,23 +9786,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7677,28 +9816,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-set-props": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.2.0.tgz", - "integrity": "sha512-YCmOj+4YAeEB5Dd9jfp6ETdejMet4zSxXjNkgaa4npBEKRI9uDOGB5MmAdAgi2OoFGAKshYhCbmLq2DS03CgVA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.1.0.tgz", + "integrity": "sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=0.10.0" } }, "node_modules/get-source": { @@ -7712,16 +9837,29 @@ "source-map": "^0.6.1" } }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -7731,9 +9869,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -7848,13 +9986,16 @@ } }, "node_modules/globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7906,13 +10047,13 @@ "license": "MIT" }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7947,12 +10088,13 @@ } }, "node_modules/happy-dom": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-17.4.4.tgz", - "integrity": "sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-15.10.2.tgz", + "integrity": "sha512-NbA5XrSovenJIIcfixCREX3ZnV7yHP4phhbfuxxf4CPn+LZpz/jIM9EqJ2DrPwgVDSMoAKH3pZwQvkbsSiCrUw==", "dev": true, "license": "MIT", "dependencies": { + "entities": "^4.5.0", "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" }, @@ -7961,14 +10103,11 @@ } }, "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7996,14 +10135,11 @@ } }, "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -8012,9 +10148,9 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "license": "MIT", "engines": { @@ -8058,17 +10194,10 @@ "node": ">= 0.4" } }, - "node_modules/hookified": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz", - "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==", - "dev": true, - "license": "MIT" - }, "node_modules/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "license": "ISC", "dependencies": { @@ -8078,6 +10207,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/hpagent": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", @@ -8206,9 +10345,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -8251,29 +10390,13 @@ } }, "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/index-to-position": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.0.0.tgz", - "integrity": "sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/inflight": { @@ -8303,15 +10426,15 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -8332,42 +10455,32 @@ "node": ">=10.13.0" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "license": "MIT", "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8383,17 +10496,13 @@ "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8403,16 +10512,13 @@ } }, "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8431,14 +10537,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8448,44 +10554,21 @@ } }, "node_modules/is-builtin-module": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-4.0.0.tgz", - "integrity": "sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^4.0.0" + "builtin-modules": "^3.3.0" }, "engines": { - "node": ">=18.20" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-builtin-module/node_modules/builtin-modules": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-4.0.0.tgz", - "integrity": "sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-bun-module": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", - "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -8500,9 +10583,9 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -8515,14 +10598,12 @@ } }, "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -8533,14 +10614,13 @@ } }, "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8549,17 +10629,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8570,16 +10639,13 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8595,16 +10661,13 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8614,17 +10677,14 @@ } }, "node_modules/is-get-set-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-2.0.0.tgz", - "integrity": "sha512-C32bqXfHJfRwa0U5UIMqSGziZhALszXDJZ8n8mz8WZ6c6V7oYGHEWwJvftliBswypY3P3EQqdY5lpDSEKvTS1Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz", + "integrity": "sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==", "dev": true, "license": "MIT", "dependencies": { - "get-set-props": "^0.2.0", - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": "> 18.0.0" + "get-set-props": "^0.1.0", + "lowercase-keys": "^1.0.0" } }, "node_modules/is-glob": { @@ -8639,28 +10699,14 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-js-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-3.0.0.tgz", - "integrity": "sha512-IbPf3g3vxm1D902xaBaYp2TUHiXZWwWRu5bM9hgKN9oAQcFaKALV6Gd13PGhXjKE5u2n8s1PhLhdke/E1fchxQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-2.0.0.tgz", + "integrity": "sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==", "dev": true, "license": "MIT", "dependencies": { - "js-types": "^4.0.0" - }, - "engines": { - "node": ">=18.0.0" + "js-types": "^1.0.0" } }, "node_modules/is-map": { @@ -8676,6 +10722,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8686,14 +10745,13 @@ } }, "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8703,17 +10761,24 @@ } }, "node_modules/is-obj-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-2.0.0.tgz", - "integrity": "sha512-2/VFrbzXSZVJIscazpxoB+pOQx2jBOAAL9Gui4cRKxflznUNBpsr8IDvBA4UGol3e40sltLNiY3qnZv/7qSUxA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-1.0.0.tgz", + "integrity": "sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0", - "obj-props": "^2.0.0" - }, + "lowercase-keys": "^1.0.0", + "obj-props": "^1.0.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, "node_modules/is-plain-object": { @@ -8734,17 +10799,14 @@ "license": "MIT" }, "node_modules/is-proto-prop": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-3.0.1.tgz", - "integrity": "sha512-S8xSxNMGJO4eZD86kO46zrq2gLIhA+rN9443lQEvt8Mz/l8cxk72p/AWFmofY6uL9g9ILD6cXW6j8QQj4F3Hcw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-2.0.0.tgz", + "integrity": "sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0", - "prototype-properties": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" + "lowercase-keys": "^1.0.0", + "proto-props": "^2.0.0" } }, "node_modules/is-reference": { @@ -8758,16 +10820,14 @@ } }, "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8790,13 +10850,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -8806,14 +10866,13 @@ } }, "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8823,15 +10882,13 @@ } }, "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8841,13 +10898,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8880,30 +10937,27 @@ } }, "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -8988,6 +11042,20 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -9033,9 +11101,9 @@ } }, "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -9048,17 +11116,17 @@ "license": "MIT" }, "node_modules/js-beautify": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", - "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", "dev": true, "license": "MIT", "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", - "glob": "^10.4.2", + "glob": "^10.3.3", "js-cookie": "^3.0.5", - "nopt": "^7.2.1" + "nopt": "^7.2.0" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -9124,23 +11192,19 @@ "license": "MIT" }, "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-types": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-types/-/js-types-4.0.0.tgz", - "integrity": "sha512-/c+n06zvqFQGxdz1BbElF7S3nEghjNchLN1TjQnk2j10HYDaUc57rcvl6BbnziTx8NQmrg0JOs/iwRpvcYaxjQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/js-types/-/js-types-1.0.0.tgz", + "integrity": "sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/js-yaml": { @@ -9166,9 +11230,9 @@ } }, "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.3.9.tgz", + "integrity": "sha512-i1rBX5N7VPl0eYb6+mHNp52sEuaS2Wi8CDYx1X5sn9naevL78+265XJqy1qENEk7mRKwS06NHpUqiBwR7qeodw==", "dev": true, "license": "MIT", "engines": { @@ -9176,16 +11240,16 @@ } }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/json-buffer": { @@ -9247,22 +11311,13 @@ } }, "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.1.0.tgz", + "integrity": "sha512-gTaNRsPWO/K2KY6MrqaUFClF9kmuM6MFH5Dhg1VYDODgFbByw1yb7xu3hrViE/sz+dGOeMWgCzwUwQtAnCTE9g==", "dev": true, "license": "MIT", - "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" - }, "engines": { - "node": ">=18.0.0" + "node": ">=12.0.0" } }, "node_modules/jsonpointer": { @@ -9298,9 +11353,9 @@ "license": "MIT" }, "node_modules/katex": { - "version": "0.16.21", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", - "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "version": "0.16.11", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", + "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -9347,9 +11402,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", "dev": true, "license": "MIT" }, @@ -9375,6 +11430,26 @@ "node": ">=16.0.0" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", @@ -9433,15 +11508,12 @@ } }, "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">=10" } }, "node_modules/lines-and-columns": { @@ -9484,14 +11556,13 @@ } }, "node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "license": "MIT", "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { "node": ">=14" @@ -9529,6 +11600,13 @@ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -9536,6 +11614,20 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9543,6 +11635,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.sortedlastindex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.sortedlastindex/-/lodash.sortedlastindex-4.1.0.tgz", @@ -9564,34 +11663,54 @@ "dev": true, "license": "MIT" }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", - "engines": { - "node": ">=12" + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/magic-string": { @@ -9658,21 +11777,14 @@ } }, "node_modules/markdownlint": { - "version": "0.37.4", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.37.4.tgz", - "integrity": "sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz", + "integrity": "sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==", "dev": true, "license": "MIT", "dependencies": { "markdown-it": "14.1.0", - "micromark": "4.0.1", - "micromark-core-commonmark": "2.0.2", - "micromark-extension-directive": "3.0.2", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.0", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.1" + "markdownlint-micromark": "0.1.9" }, "engines": { "node": ">=18" @@ -9682,22 +11794,23 @@ } }, "node_modules/markdownlint-cli": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz", - "integrity": "sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ==", + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.41.0.tgz", + "integrity": "sha512-kp29tKrMKdn+xonfefjp3a/MsNzAd9c5ke0ydMEI9PR98bOjzglYN4nfMSaIs69msUf1DNkgevAIAPtK2SeX0Q==", "dev": true, "license": "MIT", "dependencies": { - "commander": "~13.1.0", - "glob": "~10.4.5", - "ignore": "~7.0.3", - "js-yaml": "~4.1.0", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdownlint": "~0.37.4", - "minimatch": "~9.0.5", + "commander": "~12.1.0", + "get-stdin": "~9.0.0", + "glob": "~10.4.1", + "ignore": "~5.3.1", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.2.1", + "jsonpointer": "5.0.1", + "markdownlint": "~0.34.0", + "minimatch": "~9.0.4", "run-con": "~1.3.2", - "smol-toml": "~1.3.1" + "smol-toml": "~1.2.0" }, "bin": { "markdownlint": "markdownlint.js" @@ -9707,9 +11820,9 @@ } }, "node_modules/markdownlint-cli/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { @@ -9737,20 +11850,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/markdownlint-cli/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/markdownlint-cli/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true, "license": "MIT" }, @@ -9770,6 +11873,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/markdownlint-micromark": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz", + "integrity": "sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -9782,16 +11898,6 @@ "node": ">= 12" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -9804,9 +11910,9 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true, "license": "CC0-1.0" }, @@ -9846,43 +11952,36 @@ } }, "node_modules/mermaid": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.5.0.tgz", - "integrity": "sha512-IYhyukID3zzDj1EihKiN1lp+PXNImoJ3Iyz73qeDAgnus4BNGsJV1n471P4PyeGxPVONerZxignwGxGTSwZnlg==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.3.0.tgz", + "integrity": "sha512-fFmf2gRXLtlGzug4wpIGN+rQdZ30M8IZEB1D3eZkXNqC7puhqeURBcD/9tbwXsqBO+A6Nzzo3MSSepmnw5xSeg==", "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.0.4", - "@iconify/utils": "^2.1.33", + "@braintree/sanitize-url": "^7.0.1", + "@iconify/utils": "^2.1.32", "@mermaid-js/parser": "^0.3.0", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", + "cytoscape": "^3.29.2", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.13", - "dompurify": "^3.2.4", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.10", + "dompurify": "^3.0.11 <3.1.7", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", - "marked": "^15.0.7", + "marked": "^13.0.2", "roughjs": "^4.6.6", - "stylis": "^4.3.6", + "stylis": "^4.3.1", "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" + "uuid": "^9.0.1" } }, - "node_modules/mermaid/node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, "node_modules/mermaid/node_modules/marked": { - "version": "15.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.7.tgz", - "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -9891,542 +11990,6 @@ "node": ">= 18" } }, - "node_modules/micromark": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", - "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", - "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", - "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -10472,9 +12035,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", @@ -10539,38 +12102,21 @@ } }, "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "license": "MIT", "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" } }, "node_modules/monaco-editor": { - "version": "0.52.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", - "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.51.0.tgz", + "integrity": "sha512-xaGwVV1fq343cM7aOYB6lVE4Ugf0UyimdD/x5PWcWBMKENwectaEu77FAN7c5sFiyumqeJdX1RPTh1ocioyDjw==", "license": "MIT" }, "node_modules/monaco-editor-webpack-plugin": { @@ -10610,9 +12156,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -10641,9 +12187,9 @@ "license": "MIT" }, "node_modules/nimma": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.3.tgz", - "integrity": "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nimma/-/nimma-0.2.2.tgz", + "integrity": "sha512-V52MLl7BU+tH2Np9tDrIXK8bql3MVUadnMIl/0/oZSGC9keuro0O9UUv9QKp0aMvtN8HRew4G7byY7H4eWsxaQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10656,14 +12202,25 @@ "node": "^12.20 || >=14.13" }, "optionalDependencies": { - "jsonpath-plus": "^6.0.1 || ^10.1.0", + "jsonpath-plus": "^6.0.1", "lodash.topath": "^4.5.2" } }, + "node_modules/nimma/node_modules/jsonpath-plus": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-6.0.1.tgz", + "integrity": "sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -10681,9 +12238,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/node-sarif-builder": { @@ -10765,13 +12322,13 @@ } }, "node_modules/obj-props": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-2.0.0.tgz", - "integrity": "sha512-Q/uLAAfjdhrzQWN2czRNh3fDCgXjh7yRIkdHjDgIHTwpFP0BsshxTA3HRNffHR7Iw/XGTH30u8vdMXQ+079urA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-1.4.0.tgz", + "integrity": "sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=0.10.0" } }, "node_modules/object-assign": { @@ -10793,9 +12350,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, "license": "MIT", "engines": { @@ -10805,6 +12362,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -10816,17 +12390,15 @@ } }, "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10836,15 +12408,63 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -10883,47 +12503,6 @@ "node": ">= 0.8.0" } }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oxc-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-5.0.1.tgz", - "integrity": "sha512-BbclyCSxgnqO5mo05RGcwp8rkVdZL7sf0ugEnFWK67DIBAMq5wR0/GQlQCdPiPkpiv9GESAVX2cbh1DMFux/TQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-resolver/binding-darwin-arm64": "5.0.1", - "@oxc-resolver/binding-darwin-x64": "5.0.1", - "@oxc-resolver/binding-freebsd-x64": "5.0.1", - "@oxc-resolver/binding-linux-arm-gnueabihf": "5.0.1", - "@oxc-resolver/binding-linux-arm64-gnu": "5.0.1", - "@oxc-resolver/binding-linux-arm64-musl": "5.0.1", - "@oxc-resolver/binding-linux-x64-gnu": "5.0.1", - "@oxc-resolver/binding-linux-x64-musl": "5.0.1", - "@oxc-resolver/binding-wasm32-wasi": "5.0.1", - "@oxc-resolver/binding-win32-arm64-msvc": "5.0.1", - "@oxc-resolver/binding-win32-x64-msvc": "5.0.1" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10972,13 +12551,10 @@ "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", - "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" - } + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz", + "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==", + "license": "MIT" }, "node_modules/parent-module": { "version": "1.0.1", @@ -10992,26 +12568,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -11115,9 +12671,9 @@ } }, "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "license": "MIT" }, "node_modules/pathval": { @@ -11137,9 +12693,9 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -11237,24 +12793,24 @@ } }, "node_modules/pkg-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", - "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", "license": "MIT", "dependencies": { - "confbox": "^0.2.1", - "exsolve": "^1.0.1", - "pathe": "^2.0.3" + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" } }, "node_modules/playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", + "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.0" + "playwright-core": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -11267,9 +12823,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -11316,9 +12872,9 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "license": "MIT", "engines": { @@ -11326,9 +12882,9 @@ } }, "node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -11345,8 +12901,8 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", "source-map-js": "^1.2.1" }, "engines": { @@ -11354,21 +12910,28 @@ } }, "node_modules/postcss-html": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.8.0.tgz", - "integrity": "sha512-5mMeb1TgLWoRKxZ0Xh9RZDfwUUIqRrcxO2uXO+Ezl1N5lqpCiSU5Gk6+1kZediBfBHFtPCdopr2UZ2SgUsKcgQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz", + "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==", "dev": true, "license": "MIT", "dependencies": { "htmlparser2": "^8.0.0", "js-tokens": "^9.0.0", - "postcss": "^8.5.0", + "postcss": "^8.4.0", "postcss-safe-parser": "^6.0.0" }, "engines": { "node": "^12 || >=14" } }, + "node_modules/postcss-html/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true, + "license": "MIT" + }, "node_modules/postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -11440,6 +13003,18 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/postcss-loader": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", @@ -11484,13 +13059,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -11500,26 +13075,13 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "license": "ISC", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -11528,19 +13090,6 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -11582,9 +13131,9 @@ } }, "node_modules/postcss-nesting": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", - "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.5.tgz", + "integrity": "sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==", "funding": [ { "type": "github", @@ -11597,74 +13146,17 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^3.0.0", - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" + "@csstools/selector-resolve-nested": "^1.1.0", + "@csstools/selector-specificity": "^3.1.1", + "postcss-selector-parser": "^6.1.0" }, "engines": { - "node": ">=18" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.4" } }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", - "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-resolve-nested-selector": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", @@ -11765,6 +13257,35 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-ms": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz", @@ -11787,6 +13308,18 @@ "dev": true, "license": "Unlicense" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -11794,24 +13327,20 @@ "dev": true, "license": "ISC" }, - "node_modules/prototype-properties": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/prototype-properties/-/prototype-properties-5.0.0.tgz", - "integrity": "sha512-uCWE2QqnGlwvvJXTwiHTPTyHE62+zORO5hpFWhAwBGDtEtTmNZZleNLJDoFsqHCL4p/CeAP2Q1uMKFUKALuRGQ==", + "node_modules/proto-props": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proto-props/-/proto-props-2.0.0.tgz", + "integrity": "sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -11827,22 +13356,6 @@ "node": ">=6" } }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11872,6 +13385,13 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11965,95 +13485,144 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/read-pkg/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.2.0.tgz", - "integrity": "sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.0.0", - "type-fest": "^4.37.0" - }, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/readdirp": { @@ -12094,20 +13663,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", + "es-abstract": "^1.23.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -12116,12 +13684,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp-ast-analysis": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", @@ -12147,18 +13745,16 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.6", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -12167,30 +13763,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/regexpu-core/node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" } }, "node_modules/require-directory": { @@ -12222,21 +13854,18 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12281,15 +13910,32 @@ } }, "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", @@ -12324,29 +13970,6 @@ "points-on-path": "^0.2.1" } }, - "node_modules/rspack-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rspack-resolver/-/rspack-resolver-1.2.2.tgz", - "integrity": "sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/JounQin" - }, - "optionalDependencies": { - "@unrs/rspack-resolver-binding-darwin-arm64": "1.2.2", - "@unrs/rspack-resolver-binding-darwin-x64": "1.2.2", - "@unrs/rspack-resolver-binding-freebsd-x64": "1.2.2", - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "1.2.2", - "@unrs/rspack-resolver-binding-linux-arm64-gnu": "1.2.2", - "@unrs/rspack-resolver-binding-linux-arm64-musl": "1.2.2", - "@unrs/rspack-resolver-binding-linux-x64-gnu": "1.2.2", - "@unrs/rspack-resolver-binding-linux-x64-musl": "1.2.2", - "@unrs/rspack-resolver-binding-wasm32-wasi": "1.2.2", - "@unrs/rspack-resolver-binding-win32-arm64-msvc": "1.2.2", - "@unrs/rspack-resolver-binding-win32-x64-msvc": "1.2.2" - } - }, "node_modules/run-con": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", @@ -12403,16 +14026,15 @@ "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { @@ -12442,33 +14064,16 @@ ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "is-regex": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -12498,9 +14103,9 @@ "license": "ISC" }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -12509,7 +14114,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -12532,9 +14137,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12553,18 +14158,18 @@ } }, "node_modules/seroval": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.2.1.tgz", - "integrity": "sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.1.1.tgz", + "integrity": "sha512-rqEO6FZk8mv7Hyv4UCj3FD3b6Waqft605TLfsCe/BiaylRpyyMC0b+uA5TJKawX3KzMrdi3wsLbCaLplrQmBvQ==", "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.2.1.tgz", - "integrity": "sha512-H5vs53+39+x4Udwp4J5rNZfgFuA+Lt+uU+09w1gYBVWomtAl98B+E9w7yC05Xc81/HgLvJdlyqJbU0fJCKCmdw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.1.1.tgz", + "integrity": "sha512-qNSy1+nUj7hsCOon7AO4wdAIo9P0jrzAMp18XhiOzA6/uO5TKtP7ScozVJ8T293oRIvi5wyCHSM4TrJo/c/GJA==", "license": "MIT", "engines": { "node": ">=10" @@ -12607,21 +14212,6 @@ "node": ">= 0.4" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -12656,73 +14246,16 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { "node": ">= 0.4" @@ -12751,13 +14284,13 @@ } }, "node_modules/simple-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-eval/-/simple-eval-1.0.1.tgz", - "integrity": "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-eval/-/simple-eval-1.0.0.tgz", + "integrity": "sha512-kpKJR+bqTscgC0xuAl2xHN6bB12lHjC2DCUfqjAx19bQyO3R2EVLOurm3H9AUltv/uFVcSCVNc6faegR+8NYLw==", "dev": true, "license": "MIT", "dependencies": { - "jsep": "^1.3.6" + "jsep": "^1.1.2" }, "engines": { "node": ">=12" @@ -12802,22 +14335,19 @@ } }, "node_modules/smol-toml": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", - "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.2.2.tgz", + "integrity": "sha512-fVEjX2ybKdJKzFL46VshQbj9PuA4IUKivalgp48/3zwS9vXzyykzQ6AX92UxHSvWJagziMRLeHMgEzoGO7A8hQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" } }, "node_modules/solid-js": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.5.tgz", - "integrity": "sha512-ogI3DaFcyn6UhYhrgcyRAMbu/buBJitYQASZz5WzfQVPP10RD2AbCoRZ517psnezrasyCbWzIxZ6kVqet768xw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.1.tgz", + "integrity": "sha512-Gd6QWRFfO2XKKZqVK4YwbhWZkr0jWw1dYHOt+VYebomeyikGP0SuMflf42XcDuU9HAEYDArFJIYsBNjlE7iZsw==", "license": "MIT", "dependencies": { "csstype": "^3.1.0", @@ -12826,9 +14356,9 @@ } }, "node_modules/sortablejs": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", - "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.3.tgz", + "integrity": "sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==", "license": "MIT" }, "node_modules/source-list-map": { @@ -12927,9 +14457,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "license": "CC0-1.0" }, @@ -12952,13 +14482,6 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -12978,12 +14501,25 @@ } }, "node_modules/std-env": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", - "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -13013,20 +14549,78 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13036,20 +14630,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13097,20 +14687,27 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.1" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/strip-json-comments": { @@ -13134,9 +14731,9 @@ "license": "ISC" }, "node_modules/stylelint": { - "version": "16.16.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.16.0.tgz", - "integrity": "sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", + "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", "dev": true, "funding": [ { @@ -13150,43 +14747,44 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", - "@csstools/selector-specificity": "^5.0.0", + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "@csstools/selector-specificity": "^4.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.3", - "css-tree": "^3.1.0", - "debug": "^4.3.7", - "fast-glob": "^3.3.3", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.7", + "file-entry-cache": "^9.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.3", + "ignore": "^5.3.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", + "known-css-properties": "^0.34.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.5.3", + "picocolors": "^1.0.1", + "postcss": "^8.4.41", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.0", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "supports-hyperlinks": "^3.2.0", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.9.0", + "table": "^6.8.2", "write-file-atomic": "^5.0.1" }, "bin": { @@ -13210,9 +14808,9 @@ } }, "node_modules/stylelint-declaration-strict-value": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.10.11.tgz", - "integrity": "sha512-oVQvhZlFZAiDz9r2BPFZLtTGm1A2JVhdKObKAJoTjFfR4F/NpApC4bMBTxf4sZS76Na3njYKVOaAaKSZ4+FU+g==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.10.6.tgz", + "integrity": "sha512-aZGEW4Ee26Tx4UvpQJbcElVXZ42EleujEByiyKDTT7t83EeSe9t0lAG3OOLJnnvLjz/dQnp+L+3IYTMeQI51vQ==", "dev": true, "license": "MIT", "engines": { @@ -13239,34 +14837,10 @@ "stylelint": ">=16" } }, - "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" - } - }, "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", + "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", "dev": true, "funding": [ { @@ -13283,7 +14857,20 @@ "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^6.1.0" + } + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -13294,70 +14881,36 @@ "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.7.tgz", - "integrity": "sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.7" + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.7.tgz", - "integrity": "sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.8.9", - "flatted": "^3.3.3", - "hookified": "^1.7.1" - } - }, - "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/stylelint/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "flatted": "^3.3.1", + "keyv": "^4.5.4" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=18" } }, "node_modules/stylelint/node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", "dev": true, "funding": [ { @@ -13381,20 +14934,6 @@ "postcss": "^8.4.31" } }, - "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -13405,10 +14944,26 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", "license": "MIT" }, "node_modules/stylus": { @@ -13521,9 +15076,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "license": "MIT", "dependencies": { @@ -13534,7 +15089,7 @@ "node": ">=14.18" }, "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -13549,6 +15104,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-element-attributes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", + "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -13591,27 +15157,6 @@ "node": ">= 10" } }, - "node_modules/svgo/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/swagger-ui-dist": { "version": "5.17.14", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", @@ -13631,10 +15176,27 @@ "node": ">=14" } }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13649,33 +15211,33 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", - "chokidar": "^3.6.0", + "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.3.2", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", @@ -13694,10 +15256,25 @@ "node": ">=6" } }, + "node_modules/temporal-polyfill": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.4.tgz", + "integrity": "sha512-WA5p0CjQTkMjF9m8sP4wSYgpqI8m2d4q7wPUyaJOWhy4bI9mReLb2yGvTV4qf/DPMTe6H6M/Dig5KmTMB7ev6Q==", + "license": "MIT", + "dependencies": { + "temporal-spec": "^0.2.4" + } + }, + "node_modules/temporal-spec": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/temporal-spec/-/temporal-spec-0.2.4.tgz", + "integrity": "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ==", + "license": "ISC" + }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", + "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13713,16 +15290,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -13746,6 +15323,55 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -13855,60 +15481,15 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", "license": "MIT" }, - "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", "dev": true, "license": "MIT", "engines": { @@ -13916,9 +15497,9 @@ } }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, "license": "MIT", "engines": { @@ -13944,6 +15525,15 @@ "@popperjs/core": "^2.9.0" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13962,35 +15552,6 @@ "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==", "license": "MIT" }, - "node_modules/toml-eslint-parser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.0.tgz", - "integrity": "sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -14014,16 +15575,16 @@ "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.12" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=4.8.4" + "typescript": ">=4.2.0" } }, "node_modules/ts-dedent": { @@ -14041,10 +15602,36 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "dev": true, "license": "0BSD" }, @@ -14062,45 +15649,45 @@ } }, "node_modules/type-fest": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz", - "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -14110,19 +15697,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -14132,18 +15718,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", + "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14153,9 +15739,9 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -14166,33 +15752,10 @@ "node": ">=14.17" } }, - "node_modules/typescript-eslint": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz", - "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.26.1", - "@typescript-eslint/parser": "8.26.1", - "@typescript-eslint/utils": "8.26.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, "node_modules/typo-js": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.5.tgz", - "integrity": "sha512-F45vFWdGX8xahIk/sOp79z2NJs8ETMYsmMChm9D5Hlx3+9j7VnCyQyvij5MOCrNY3NNe8noSyokRjQRfq+Bc7A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.4.tgz", + "integrity": "sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==", "license": "BSD-3-Clause" }, "node_modules/uc.micro": { @@ -14215,41 +15778,69 @@ "license": "ISC" }, "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", + "call-bind": "^1.0.2", "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/universalify": { @@ -14263,9 +15854,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -14283,7 +15874,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -14296,7 +15887,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -14326,16 +15916,16 @@ } }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -14366,21 +15956,21 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", - "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -14389,25 +15979,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -14428,33 +16012,26 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, "node_modules/vite-node": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.8.tgz", - "integrity": "sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" + "debug": "^4.3.6", + "pathe": "^1.1.2", + "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -14489,39 +16066,10 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/vite/node_modules/rollup": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", - "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz", + "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==", "dev": true, "license": "MIT", "dependencies": { @@ -14535,72 +16083,66 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.37.0", - "@rollup/rollup-android-arm64": "4.37.0", - "@rollup/rollup-darwin-arm64": "4.37.0", - "@rollup/rollup-darwin-x64": "4.37.0", - "@rollup/rollup-freebsd-arm64": "4.37.0", - "@rollup/rollup-freebsd-x64": "4.37.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", - "@rollup/rollup-linux-arm-musleabihf": "4.37.0", - "@rollup/rollup-linux-arm64-gnu": "4.37.0", - "@rollup/rollup-linux-arm64-musl": "4.37.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-musl": "4.37.0", - "@rollup/rollup-linux-s390x-gnu": "4.37.0", - "@rollup/rollup-linux-x64-gnu": "4.37.0", - "@rollup/rollup-linux-x64-musl": "4.37.0", - "@rollup/rollup-win32-arm64-msvc": "4.37.0", - "@rollup/rollup-win32-ia32-msvc": "4.37.0", - "@rollup/rollup-win32-x64-msvc": "4.37.0", + "@rollup/rollup-android-arm-eabi": "4.22.5", + "@rollup/rollup-android-arm64": "4.22.5", + "@rollup/rollup-darwin-arm64": "4.22.5", + "@rollup/rollup-darwin-x64": "4.22.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.5", + "@rollup/rollup-linux-arm-musleabihf": "4.22.5", + "@rollup/rollup-linux-arm64-gnu": "4.22.5", + "@rollup/rollup-linux-arm64-musl": "4.22.5", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5", + "@rollup/rollup-linux-riscv64-gnu": "4.22.5", + "@rollup/rollup-linux-s390x-gnu": "4.22.5", + "@rollup/rollup-linux-x64-gnu": "4.22.5", + "@rollup/rollup-linux-x64-musl": "4.22.5", + "@rollup/rollup-win32-arm64-msvc": "4.22.5", + "@rollup/rollup-win32-ia32-msvc": "4.22.5", + "@rollup/rollup-win32-x64-msvc": "4.22.5", "fsevents": "~2.3.2" } }, "node_modules/vitest": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.8.tgz", - "integrity": "sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.8", - "@vitest/mocker": "3.0.8", - "@vitest/pretty-format": "^3.0.8", - "@vitest/runner": "3.0.8", - "@vitest/snapshot": "3.0.8", - "@vitest/spy": "3.0.8", - "@vitest/utils": "3.0.8", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.1.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.0", + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", + "chai": "^5.1.1", + "debug": "^4.3.6", + "magic-string": "^0.30.11", + "pathe": "^1.1.2", + "std-env": "^3.7.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.8", + "tinyexec": "^0.3.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.1", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.8", - "@vitest/ui": "3.0.8", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", "happy-dom": "*", "jsdom": "*" }, @@ -14608,9 +16150,6 @@ "@edge-runtime/vm": { "optional": true }, - "@types/debug": { - "optional": true - }, "@types/node": { "optional": true }, @@ -14629,9 +16168,9 @@ } }, "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "license": "MIT", "dependencies": { @@ -14688,16 +16227,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz", + "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.10", + "@vue/compiler-sfc": "3.5.10", + "@vue/runtime-dom": "3.5.10", + "@vue/server-renderer": "3.5.10", + "@vue/shared": "3.5.10" }, "peerDependencies": { "typescript": "*" @@ -14719,36 +16258,66 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.8.tgz", - "integrity": "sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.1.6.tgz", + "integrity": "sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==", "dev": true, "license": "MIT" }, "node_modules/vue-eslint-parser": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.1.tgz", - "integrity": "sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.4.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.6.0", + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", "lodash": "^4.17.21", - "semver": "^7.6.3" + "semver": "^7.3.6" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^14.17.0 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-loader": { @@ -14810,18 +16379,18 @@ } }, "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -14833,9 +16402,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -14856,39 +16425,42 @@ } }, "node_modules/webpack-cli": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", - "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^12.1.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", - "envinfo": "^7.14.0", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" + "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=18.12.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.82.0" + "webpack": "5.x.x" }, "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, "webpack-bundle-analyzer": { "optional": true }, @@ -14897,27 +16469,18 @@ } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.1" + "wildcard": "^2.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10.0.0" } }, "node_modules/webpack-sources": { @@ -14936,6 +16499,31 @@ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -14958,6 +16546,30 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack/node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -15009,45 +16621,41 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", + "is-regex": "^1.1.4", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", + "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -15076,18 +16684,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.2" }, "engines": { @@ -15268,10 +16874,17 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 6c37136cd1..6b9174807a 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,48 @@ { - "name": "forgejo-aneksajo", "type": "module", "engines": { - "node": ">= 20.0.0" + "node": ">= 18.0.0" }, "dependencies": { - "@citation-js/core": "0.7.14", - "@citation-js/plugin-bibtex": "0.7.16", + "@citation-js/core": "0.7.11", + "@citation-js/plugin-bibtex": "0.7.11", "@citation-js/plugin-software-formats": "0.6.1", "@github/markdown-toolbar-element": "2.2.3", - "@github/quote-selection": "2.1.0", - "@github/relative-time-element": "4.4.5", - "@github/text-expander-element": "2.8.0", + "@github/relative-time-element": "4.4.4", + "@github/text-expander-element": "2.7.1", "@mcaptcha/vanilla-glue": "0.1.0-alpha-3", - "@primer/octicons": "19.14.0", + "@primer/octicons": "19.9.0", "ansi_up": "6.0.2", - "asciinema-player": "3.8.2", - "chart.js": "4.4.5", + "asciinema-player": "3.8.0", + "chart.js": "4.4.4", "chartjs-adapter-dayjs-4": "1.0.4", - "chartjs-plugin-zoom": "2.2.0", + "chartjs-plugin-zoom": "2.0.1", "clippie": "4.1.1", "css-loader": "7.0.0", "dayjs": "1.11.12", "dropzone": "6.0.0-beta.2", "easymde": "2.18.0", - "esbuild-loader": "4.3.0", + "esbuild-loader": "4.2.2", "escape-goat": "4.0.0", - "fast-glob": "3.3.3", + "fast-glob": "3.3.2", "htmx.org": "1.9.12", "idiomorph": "0.3.0", "jquery": "3.7.1", - "katex": "0.16.21", - "mermaid": "11.5.0", - "mini-css-extract-plugin": "2.9.2", + "katex": "0.16.11", + "mermaid": "11.3.0", + "mini-css-extract-plugin": "2.9.1", "minimatch": "10.0.1", - "monaco-editor": "0.52.2", + "monaco-editor": "0.51.0", "monaco-editor-webpack-plugin": "7.1.0", "pdfobject": "2.3.0", - "postcss": "8.5.2", + "postcss": "8.4.47", "postcss-loader": "8.1.1", - "postcss-nesting": "13.0.1", + "postcss-nesting": "12.1.5", "pretty-ms": "9.0.0", - "sortablejs": "1.15.6", + "sortablejs": "1.15.3", "swagger-ui-dist": "5.17.14", - "tailwindcss": "3.4.17", + "tailwindcss": "3.4.13", + "temporal-polyfill": "0.2.4", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tippy.js": "6.3.7", @@ -51,56 +50,50 @@ "tributejs": "5.1.3", "uint8-to-base64": "0.2.0", "vanilla-colorful": "0.7.2", - "vue": "3.5.13", + "vue": "3.5.10", "vue-chartjs": "5.3.1", "vue-loader": "17.4.2", "vue3-calendar-heatmap": "2.0.5", - "webpack": "5.98.0", - "webpack-cli": "6.0.1", + "webpack": "5.95.0", + "webpack-cli": "5.1.4", "wrap-ansi": "9.0.0" }, "devDependencies": { - "@axe-core/playwright": "4.10.1", - "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@playwright/test": "1.51.0", - "@stoplight/spectral-cli": "6.14.3", - "@stylistic/eslint-plugin-js": "4.2.0", - "@stylistic/stylelint-plugin": "3.1.2", - "@vitejs/plugin-vue": "5.2.3", - "@vitest/coverage-v8": "3.0.8", - "@vitest/eslint-plugin": "1.1.25", + "@axe-core/playwright": "4.10.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.4.0", + "@playwright/test": "1.47.2", + "@stoplight/spectral-cli": "6.13.1", + "@stylistic/eslint-plugin-js": "2.8.0", + "@stylistic/stylelint-plugin": "3.0.1", + "@vitejs/plugin-vue": "5.1.4", + "@vitest/coverage-v8": "2.1.1", + "@vitest/eslint-plugin": "1.0.0", "@vue/test-utils": "2.4.6", - "eslint": "9.22.0", - "eslint-import-resolver-typescript": "4.1.1", - "eslint-plugin-array-func": "5.0.2", - "eslint-plugin-import-x": "4.7.0", - "eslint-plugin-no-jquery": "3.1.1", - "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.2.0", - "eslint-plugin-regexp": "2.7.0", - "eslint-plugin-sonarjs": "3.0.2", - "eslint-plugin-unicorn": "57.0.0", - "eslint-plugin-toml": "0.12.0", + "eslint": "8.57.1", + "eslint-plugin-array-func": "4.0.0", + "eslint-plugin-github": "5.0.2", + "eslint-plugin-i": "2.29.1", + "eslint-plugin-no-jquery": "3.0.2", + "eslint-plugin-no-use-extend-native": "0.5.0", + "eslint-plugin-playwright": "1.6.2", + "eslint-plugin-regexp": "2.6.0", + "eslint-plugin-sonarjs": "2.0.2", + "eslint-plugin-unicorn": "55.0.0", "eslint-plugin-vitest-globals": "1.5.0", - "eslint-plugin-vue": "10.0.0", - "eslint-plugin-vue-scoped-css": "2.9.0", - "eslint-plugin-wc": "2.2.1", - "globals": "16.0.0", - "happy-dom": "17.4.4", + "eslint-plugin-vue": "9.28.0", + "eslint-plugin-vue-scoped-css": "2.8.1", + "eslint-plugin-wc": "2.1.1", + "happy-dom": "15.10.2", "license-checker-rseidelsohn": "4.4.2", - "markdownlint-cli": "0.44.0", - "postcss-html": "1.8.0", - "stylelint": "16.16.0", + "markdownlint-cli": "0.41.0", + "postcss-html": "1.7.0", + "stylelint": "16.9.0", "stylelint-declaration-block-no-ignored-properties": "2.8.0", - "stylelint-declaration-strict-value": "1.10.11", + "stylelint-declaration-strict-value": "1.10.6", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", - "typescript": "5.7.3", - "typescript-eslint": "8.26.1", "vite-string-plugin": "1.3.4", - "vitest": "3.0.8" + "vitest": "2.1.1" }, - "browserslist": [ - "defaults" - ] + "browserslist": ["defaults"] } diff --git a/playwright.config.ts b/playwright.config.js similarity index 77% rename from playwright.config.ts rename to playwright.config.js index 3906232abc..25e2a7ab71 100644 --- a/playwright.config.ts +++ b/playwright.config.js @@ -1,6 +1,7 @@ -import {devices, type PlaywrightTestConfig} from '@playwright/test'; +// @ts-check +import {devices} from '@playwright/test'; -const BASE_URL = process.env.GITEA_URL?.replace?.(/\/$/g, '') || 'http://localhost:3003'; +const BASE_URL = process.env.GITEA_URL?.replace?.(/\/$/g, '') || 'http://localhost:3000'; /** * @see https://playwright.dev/docs/test-configuration @@ -8,11 +9,11 @@ const BASE_URL = process.env.GITEA_URL?.replace?.(/\/$/g, '') || 'http://localho */ export default { testDir: './tests/e2e/', - testMatch: /.*\.test\.e2e\.ts/, // Match any .test.e2e.js files + testMatch: /.*\.test\.e2e\.js/, // Match any .test.e2e.js files // you can adjust this value locally to match your machine's power, // or pass `--workers x` to playwright - workers: 1, + workers: process.env.CI ? 1 : 2, /* Maximum time one test can run for. */ timeout: 30 * 1000, @@ -22,7 +23,7 @@ export default { * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` */ - timeout: 3000, + timeout: 2000, }, /* Fail the build on CI if you accidentally left test.only in the source code. */ @@ -30,8 +31,6 @@ export default { /* Retry on CI only */ retries: process.env.CI ? 1 : 0, - /* fail fast */ - maxFailures: process.env.CI ? 1 : 0, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: process.env.CI ? 'list' : [['list'], ['html', {outputFolder: 'tests/e2e/reports/', open: 'never'}]], @@ -43,7 +42,7 @@ export default { locale: 'en-US', /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ - actionTimeout: 3000, + actionTimeout: 2000, /* Maximum time allowed for navigation, such as `page.goto()`. */ navigationTimeout: 10 * 1000, @@ -65,7 +64,6 @@ export default { /* Project-specific settings. */ use: { ...devices['Desktop Chrome'], - permissions: ['clipboard-read', 'clipboard-write'], }, }, @@ -88,7 +86,6 @@ export default { name: 'Mobile Chrome', use: { ...devices['Pixel 5'], - permissions: ['clipboard-read', 'clipboard-write'], }, }, { @@ -99,9 +96,8 @@ export default { }, ], - /* Folder for test artifacts created during test execution such as screenshots, traces, etc. */ + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ outputDir: 'tests/e2e/test-artifacts/', - /* Folder for explicit snapshots for visual testing */ + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ snapshotDir: 'tests/e2e/test-snapshots/', - snapshotPathTemplate: '{snapshotDir}/snapshots/{testFilePath}/{projectName}_{arg}{ext}', -} satisfies PlaywrightTestConfig; +}; diff --git a/poetry.lock b/poetry.lock index 5cda33c903..886dfe53d8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "click" -version = "8.1.8" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -16,13 +16,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "codespell" -version = "2.4.1" -description = "Fix common misspellings in text files" +version = "2.3.0" +description = "Codespell" optional = false python-versions = ">=3.8" files = [ - {file = "codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425"}, - {file = "codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5"}, + {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, + {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, ] [package.extras] @@ -44,13 +44,12 @@ files = [ [[package]] name = "cssbeautifier" -version = "1.15.4" +version = "1.15.1" description = "CSS unobfuscator and beautifier." optional = false python-versions = "*" files = [ - {file = "cssbeautifier-1.15.4-py3-none-any.whl", hash = "sha256:78c84d5e5378df7d08622bbd0477a1abdbd209680e95480bf22f12d5701efc98"}, - {file = "cssbeautifier-1.15.4.tar.gz", hash = "sha256:9bb08dc3f64c101a01677f128acf01905914cf406baf87434dcde05b74c0acf5"}, + {file = "cssbeautifier-1.15.1.tar.gz", hash = "sha256:9f7064362aedd559c55eeecf6b6bed65e05f33488dcbe39044f0403c26e1c006"}, ] [package.dependencies] @@ -60,68 +59,69 @@ six = ">=1.13.0" [[package]] name = "djlint" -version = "1.36.4" +version = "1.35.2" description = "HTML Template Linter and Formatter" optional = false -python-versions = ">=3.9" +python-versions = "<4.0,>=3.8" files = [ - {file = "djlint-1.36.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2dfb60883ceb92465201bfd392291a7597c6752baede6fbb6f1980cac8d6c5c"}, - {file = "djlint-1.36.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc6a1320c0030244b530ac200642f883d3daa451a115920ef3d56d08b644292"}, - {file = "djlint-1.36.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3164a048c7bb0baf042387b1e33f9bbbf99d90d1337bb4c3d66eb0f96f5400a1"}, - {file = "djlint-1.36.4-cp310-cp310-win_amd64.whl", hash = "sha256:3196d5277da5934962d67ad6c33a948ba77a7b6eadf064648bef6ee5f216b03c"}, - {file = "djlint-1.36.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d68da0ed10ee9ca1e32e225cbb8e9b98bf7e6f8b48a8e4836117b6605b88cc7"}, - {file = "djlint-1.36.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c0478d5392247f1e6ee29220bbdbf7fb4e1bc0e7e83d291fda6fb926c1787ba7"}, - {file = "djlint-1.36.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:962f7b83aee166e499eff916d631c6dde7f1447d7610785a60ed2a75a5763483"}, - {file = "djlint-1.36.4-cp311-cp311-win_amd64.whl", hash = "sha256:53cbc450aa425c832f09bc453b8a94a039d147b096740df54a3547fada77ed08"}, - {file = "djlint-1.36.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff9faffd7d43ac20467493fa71d5355b5b330a00ade1c4d1e859022f4195223b"}, - {file = "djlint-1.36.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:79489e262b5ac23a8dfb7ca37f1eea979674cfc2d2644f7061d95bea12c38f7e"}, - {file = "djlint-1.36.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e58c5fa8c6477144a0be0a87273706a059e6dd0d6efae01146ae8c29cdfca675"}, - {file = "djlint-1.36.4-cp312-cp312-win_amd64.whl", hash = "sha256:bb6903777bf3124f5efedcddf1f4716aef097a7ec4223fc0fa54b865829a6e08"}, - {file = "djlint-1.36.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ead475013bcac46095b1bbc8cf97ed2f06e83422335734363f8a76b4ba7e47c2"}, - {file = "djlint-1.36.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c601dfa68ea253311deb4a29a7362b7a64933bdfcfb5a06618f3e70ad1fa835"}, - {file = "djlint-1.36.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda5014f295002363381969864addeb2db13955f1b26e772657c3b273ed7809f"}, - {file = "djlint-1.36.4-cp313-cp313-win_amd64.whl", hash = "sha256:16ce37e085afe5a30953b2bd87cbe34c37843d94c701fc68a2dda06c1e428ff4"}, - {file = "djlint-1.36.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89678661888c03d7bc6cadd75af69db29962b5ecbf93a81518262f5c48329f04"}, - {file = "djlint-1.36.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b01a98df3e1ab89a552793590875bc6e954cad661a9304057db75363d519fa0"}, - {file = "djlint-1.36.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dabbb4f7b93223d471d09ae34ed515fef98b2233cbca2449ad117416c44b1351"}, - {file = "djlint-1.36.4-cp39-cp39-win_amd64.whl", hash = "sha256:7a483390d17e44df5bc23dcea29bdf6b63f3ed8b4731d844773a4829af4f5e0b"}, - {file = "djlint-1.36.4-py3-none-any.whl", hash = "sha256:e9699b8ac3057a6ed04fb90835b89bee954ed1959c01541ce4f8f729c938afdd"}, - {file = "djlint-1.36.4.tar.gz", hash = "sha256:17254f218b46fe5a714b224c85074c099bcb74e3b2e1f15c2ddc2cf415a408a1"}, + {file = "djlint-1.35.2-py3-none-any.whl", hash = "sha256:4ba995bad378f2afa77c8ea56ba1c14429d9ff26a18e8ae23bc71eedb9152243"}, + {file = "djlint-1.35.2.tar.gz", hash = "sha256:318de9d4b9b0061a111f8f5164ecbacd8215f449dd4bd5a76d2a691c815ee103"}, ] [package.dependencies] click = ">=8.0.1" colorama = ">=0.4.4" cssbeautifier = ">=1.14.4" +html-tag-names = ">=0.1.2" +html-void-elements = ">=0.1.0" jsbeautifier = ">=1.14.4" json5 = ">=0.9.11" -pathspec = ">=0.12" -pyyaml = ">=6" +pathspec = ">=0.12.0" +PyYAML = ">=6.0" regex = ">=2023" tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} tqdm = ">=4.62.2" -typing-extensions = {version = ">=3.6.6", markers = "python_version < \"3.11\""} [[package]] name = "editorconfig" -version = "0.17.0" +version = "0.12.4" description = "EditorConfig File Locator and Interpreter for Python" optional = false python-versions = "*" files = [ - {file = "EditorConfig-0.17.0-py3-none-any.whl", hash = "sha256:fe491719c5f65959ec00b167d07740e7ffec9a3f362038c72b289330b9991dfc"}, - {file = "editorconfig-0.17.0.tar.gz", hash = "sha256:8739052279699840065d3a9f5c125d7d5a98daeefe53b0e5274261d77cb49aa2"}, + {file = "EditorConfig-0.12.4.tar.gz", hash = "sha256:24857fa1793917dd9ccf0c7810a07e05404ce9b823521c7dce22a4fb5d125f80"}, +] + +[[package]] +name = "html-tag-names" +version = "0.1.2" +description = "List of known HTML tag names" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "html-tag-names-0.1.2.tar.gz", hash = "sha256:04924aca48770f36b5a41c27e4d917062507be05118acb0ba869c97389084297"}, + {file = "html_tag_names-0.1.2-py3-none-any.whl", hash = "sha256:eeb69ef21078486b615241f0393a72b41352c5219ee648e7c61f5632d26f0420"}, +] + +[[package]] +name = "html-void-elements" +version = "0.1.0" +description = "List of HTML void tag names." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "html-void-elements-0.1.0.tar.gz", hash = "sha256:931b88f84cd606fee0b582c28fcd00e41d7149421fb673e1e1abd2f0c4f231f0"}, + {file = "html_void_elements-0.1.0-py3-none-any.whl", hash = "sha256:784cf39db03cdeb017320d9301009f8f3480f9d7b254d0974272e80e0cb5e0d2"}, ] [[package]] name = "jsbeautifier" -version = "1.15.4" +version = "1.15.1" description = "JavaScript unobfuscator and beautifier." optional = false python-versions = "*" files = [ - {file = "jsbeautifier-1.15.4-py3-none-any.whl", hash = "sha256:72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528"}, - {file = "jsbeautifier-1.15.4.tar.gz", hash = "sha256:5bb18d9efb9331d825735fbc5360ee8f1aac5e52780042803943aa7f854f7592"}, + {file = "jsbeautifier-1.15.1.tar.gz", hash = "sha256:ebd733b560704c602d744eafc839db60a1ee9326e30a2a80c4adb8718adc1b24"}, ] [package.dependencies] @@ -130,18 +130,15 @@ six = ">=1.13.0" [[package]] name = "json5" -version = "0.10.0" +version = "0.9.25" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.8" files = [ - {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, - {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, ] -[package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] - [[package]] name = "pathspec" version = "0.12.1" @@ -217,200 +214,158 @@ files = [ [[package]] name = "regex" -version = "2024.11.6" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, - {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, - {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, - {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, - {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, - {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, - {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, - {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, - {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, - {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, - {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, - {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, - {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, - {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] name = "six" -version = "1.17.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "tomli" -version = "2.2.1" +version = "2.0.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] -discord = ["requests"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +name = "yamllint" +version = "1.35.1" +description = "A linter for YAML files." optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "yamllint" -version = "1.36.2" -description = "A linter for YAML files." -optional = false -python-versions = ">=3.9" -files = [ - {file = "yamllint-1.36.2-py3-none-any.whl", hash = "sha256:6ba19800513d86c987ed3cf48c0aba4e82b3624596e1dab55723b3733e11f35c"}, - {file = "yamllint-1.36.2.tar.gz", hash = "sha256:c9ccc818659736e7b13f7e2f9c3c9bb9ac77445be13e789e7d843e92cb8428ef"}, + {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, + {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] @@ -423,4 +378,4 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "6e4e2a74db7e165f0aa8cae9bb8932cbe1e84ea9bef64db42371e6d620d77c93" +content-hash = "1df1e16b71e0e52111ae167644c1c2a3a28b84c87b43a2313ab865f6586037cc" diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt index 0ac9f09d34..2a75a8dcd2 100644 --- a/public/.well-known/security.txt +++ b/public/.well-known/security.txt @@ -5,4 +5,4 @@ Policy: https://codeberg.org/forgejo/governance/src/commit/5c07b3801537212ed6be1 Contact: mailto:security@forgejo.org Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1B638BDF10969D627926B8D9F585D0F99E1FB56F Preferred-Languages: en -Expires: 2026-07-16T23:59:59.000Z +Expires: 2025-10-25T00:00:00Z diff --git a/public/assets/img/forgejo-loading.svg b/public/assets/img/forgejo-loading.svg index f85fb37c8d..919552ebb5 100644 --- a/public/assets/img/forgejo-loading.svg +++ b/public/assets/img/forgejo-loading.svg @@ -1,6 +1,6 @@ diff --git a/public/assets/img/svg/gitea-alt.svg b/public/assets/img/svg/gitea-alt.svg deleted file mode 100644 index 53e3f17c13..0000000000 --- a/public/assets/img/svg/gitea-alt.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-accessibility-inset.svg b/public/assets/img/svg/octicon-accessibility-inset.svg index 1ace41537d..2a728a9cf7 100644 --- a/public/assets/img/svg/octicon-accessibility-inset.svg +++ b/public/assets/img/svg/octicon-accessibility-inset.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/octicon-ai-model.svg b/public/assets/img/svg/octicon-ai-model.svg deleted file mode 100644 index 57d127bfaa..0000000000 --- a/public/assets/img/svg/octicon-ai-model.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-bookmark-filled.svg b/public/assets/img/svg/octicon-bookmark-filled.svg deleted file mode 100644 index 3ac73a5113..0000000000 --- a/public/assets/img/svg/octicon-bookmark-filled.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-bookmark-slash-fill.svg b/public/assets/img/svg/octicon-bookmark-slash-fill.svg deleted file mode 100644 index bce2a0f0fe..0000000000 --- a/public/assets/img/svg/octicon-bookmark-slash-fill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-file-media.svg b/public/assets/img/svg/octicon-file-media.svg deleted file mode 100644 index 6ee50b4d3e..0000000000 --- a/public/assets/img/svg/octicon-file-media.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-home-fill.svg b/public/assets/img/svg/octicon-home-fill.svg deleted file mode 100644 index c030a0fddf..0000000000 --- a/public/assets/img/svg/octicon-home-fill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-sparkles-fill.svg b/public/assets/img/svg/octicon-sparkles-fill.svg deleted file mode 100644 index 0ca70c1d39..0000000000 --- a/public/assets/img/svg/octicon-sparkles-fill.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-tab.svg b/public/assets/img/svg/octicon-tab.svg deleted file mode 100644 index 71de3e1c35..0000000000 --- a/public/assets/img/svg/octicon-tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/assets/img/svg/octicon-thumbsdown.svg b/public/assets/img/svg/octicon-thumbsdown.svg index 76a6c072b7..f64457ec51 100644 --- a/public/assets/img/svg/octicon-thumbsdown.svg +++ b/public/assets/img/svg/octicon-thumbsdown.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/img/svg/octicon-thumbsup.svg b/public/assets/img/svg/octicon-thumbsup.svg index 64f5cf9d71..1afc4ba99b 100644 --- a/public/assets/img/svg/octicon-thumbsup.svg +++ b/public/assets/img/svg/octicon-thumbsup.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index eb3b338794..b8163c8b7a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,20 +5,21 @@ package-mode = false python = "^3.10" [tool.poetry.group.dev.dependencies] -djlint = "1.36.4" -yamllint = "1.36.2" -codespell = "2.4.1" +djlint = "1.35.2" +yamllint = "1.35.1" +codespell = "^2.2.6" [tool.djlint] profile="golang" ignore="H005,H006,H013,H016,H020,H021,H030,H031" [tool.codespell] -skip = '.git,*.pdf,*.svg,package-lock.json,go.mod,locale,locale_next,license,*.git,objects,*.fr-fr.*,*.de-de.*,*.css,go.sum,*.key,gitignore,pyproject.toml,diff_test.go,go-licenses.json,pyproject.toml,*.lock,venvs,node_modules,plural_rules.go,testdata,disposable_email_domain_data.go' +skip = '.git,*.pdf,*.svg,package-lock.json,go.mod,locale,license,*.git,objects,*.fr-fr.*,*.de-de.*,*.css,go.sum,*.key,gitignore,pyproject.toml,diff_test.go,go-licenses.json,pyproject.toml,*.lock,venvs' # precise hits for CamelCased words,various other curious cases which require regex to ignore # entire line or some portion of it # TODO: Resolve Treshold typo in API and remove from here -ignore-regex = '(\b(Treshold|mx claus|commitT|ReadBy|#afile|respOne|commitI|[cC]rossReference|SMove|reVer|CheckIn|NotIn)\b|shouldbe\.|women’s.*womens|"emoji":.*|,bu,|assert\.Equal.*"fo\b|github\.com/unknwon|Copyright 2014 Unknwon|allowed\.noone|[hH]eadErr|atLeast|{"\\U.*)|Iif|FilterIn|ZiSe' +ignore-regex = '(\b(Treshold|mx claus|commitT|ReadBy|#afile|respOne|commitI|[cC]rossReference|SMove|reVer|CheckIn|NotIn)\b|shouldbe\.|women’s.*womens|"emoji":.*|,bu,|assert\.Equal.*"fo\b|github\.com/unknwon|Copyright 2014 Unknwon|allowed\.noone|[hH]eadErr|atLeast|{"\\U.*)|Iif|FilterIn|.*codespell-ignore.*' +#|.*(Maskenpflicht|Geimpft),.*)' # te - TreeEntry variable # commiter - wrong spelling but seems used in API # ALLWAYS - is a config var diff --git a/release-notes-assistant.sh b/release-notes-assistant.sh index 89fd0833f5..630fa91533 100755 --- a/release-notes-assistant.sh +++ b/release-notes-assistant.sh @@ -7,8 +7,7 @@ label_bug=bug label_feature=feature label_ui=forgejo/ui label_breaking=breaking -label_security=security -label_localization=forgejo/i18n +label_localization=internationalization payload=$(mktemp) pr=$(mktemp) @@ -18,71 +17,50 @@ function test_main() { set -ex PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: ' - test_payload_labels $label_worth $label_breaking $label_security $label_bug - test "$(categorize)" = 'AA Breaking security bug fixes' - - test_payload_labels $label_worth $label_security $label_bug - test "$(categorize)" = 'AB Security bug fixes' - - test_payload_labels $label_worth $label_breaking $label_security $label_feature - test "$(categorize)" = 'AC Breaking security features' - - test_payload_labels $label_worth $label_security $label_feature - test "$(categorize)" = 'AD Security features' - - test_payload_labels $label_worth $label_security - test "$(categorize)" = 'ZA Security changes without a feature or bug label' - test_payload_labels $label_worth $label_breaking $label_feature - test "$(categorize)" = 'BA Breaking features' + test "$(categorize)" = 'AA Breaking features' test_payload_labels $label_worth $label_breaking $label_bug - test "$(categorize)" = 'BB Breaking bug fixes' + test "$(categorize)" = 'AB Breaking bug fixes' test_payload_labels $label_worth $label_breaking - test "$(categorize)" = 'ZB Breaking changes without a feature or bug label' + test "$(categorize)" = 'ZC Breaking changes without a feature or bug label' test_payload_labels $label_worth $label_ui $label_feature - test "$(categorize)" = 'CA User Interface features' + test "$(categorize)" = 'BA User Interface features' test_payload_labels $label_worth $label_ui $label_bug - test "$(categorize)" = 'CB User Interface bug fixes' + test "$(categorize)" = 'BB User Interface bug fixes' test_payload_labels $label_worth $label_ui - test "$(categorize)" = 'ZC User Interface changes without a feature or bug label' + test "$(categorize)" = 'ZD User Interface changes without a feature or bug label' + + test_payload_labels $label_worth $label_feature + test "$(categorize)" = 'CA Features' + + test_payload_labels $label_worth $label_bug + test "$(categorize)" = 'CB Bug fixes' test_payload_labels $label_worth $label_localization test "$(categorize)" = 'DA Localization' - test_payload_labels $label_worth $label_feature - test "$(categorize)" = 'EA Features' - - test_payload_labels $label_worth $label_bug - test "$(categorize)" = 'EB Bug fixes' - test_payload_labels $label_worth test "$(categorize)" = 'ZE Other changes without a feature or bug label' test_payload_labels test "$(categorize)" = 'ZF Included for completeness but not worth a release note' - test_payload_draft "fix(security)!: breaking security bug fix" - test "$(categorize)" = 'AA Breaking security bug fixes' - - test_payload_draft "fix(security): security bug fix" - test "$(categorize)" = 'AB Security bug fixes' - test_payload_draft "feat!: breaking feature" - test "$(categorize)" = 'BA Breaking features' + test "$(categorize)" = 'AA Breaking features' test_payload_draft "fix!: breaking bug fix" - test "$(categorize)" = 'BB Breaking bug fixes' + test "$(categorize)" = 'AB Breaking bug fixes' test_payload_draft "feat: feature" - test "$(categorize)" = 'EA Features' + test "$(categorize)" = 'CA Features' test_payload_draft "fix: bug fix" - test "$(categorize)" = 'EB Bug fixes' + test "$(categorize)" = 'CB Bug fixes' test_payload_draft "something with no prefix" test "$(categorize)" = 'ZE Other changes without a feature or bug label' @@ -131,7 +109,6 @@ function categorize() { is_feature=false is_localization=false is_breaking=false - is_security=false # # first try to figure out the category from the labels @@ -148,12 +125,6 @@ function categorize() { ;; esac - case "$labels" in - *$label_security*) - is_security=true - ;; - esac - case "$labels" in *$label_breaking*) is_breaking=true @@ -172,15 +143,6 @@ function categorize() { if ! $is_bug && ! $is_feature; then draft="$(jq --raw-output .Draft <$payload)" case "$draft" in - fix\(security\)!:*) - is_bug=true - is_breaking=true - is_security=true - ;; - fix\(security\):*) - is_bug=true - is_security=true - ;; fix!:*) is_bug=true is_breaking=true @@ -209,45 +171,29 @@ function categorize() { fi fi - if $is_security; then - if $is_bug; then - if $is_breaking; then - echo -n AA Breaking security bug fixes - else - echo -n AB Security bug fixes - fi - elif $is_feature; then - if $is_breaking; then - echo -n AC Breaking security features - else - echo -n AD Security features - fi - else - echo -n ZA Security changes without a feature or bug label - fi - elif $is_breaking; then + if $is_breaking; then if $is_feature; then - echo -n BA Breaking features + echo -n AA Breaking features elif $is_bug; then - echo -n BB Breaking bug fixes + echo -n AB Breaking bug fixes else - echo -n ZB Breaking changes without a feature or bug label + echo -n ZC Breaking changes without a feature or bug label fi elif $is_ui; then if $is_feature; then - echo -n CA User Interface features + echo -n BA User Interface features elif $is_bug; then - echo -n CB User Interface bug fixes + echo -n BB User Interface bug fixes else - echo -n ZC User Interface changes without a feature or bug label + echo -n ZD User Interface changes without a feature or bug label fi elif $is_localization; then echo -n DA Localization else if $is_feature; then - echo -n EA Features + echo -n CA Features elif $is_bug; then - echo -n EB Bug fixes + echo -n CB Bug fixes else echo -n ZE Other changes without a feature or bug label fi diff --git a/release-notes-published/10.0.0.md b/release-notes-published/10.0.0.md deleted file mode 100644 index deaf181cfb..0000000000 --- a/release-notes-published/10.0.0.md +++ /dev/null @@ -1,574 +0,0 @@ - - - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): fix(security): [commit](https://codeberg.org/forgejo/forgejo/commit/45435a8789f8ff69603799a9031246d2d621d139) Fix and refactor markdown rendering -- Security features - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6074): migrate TOTP secrets to `keying` -- Breaking bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6240): Ensure `source_id` parameter is not skipped when set to 0 and correctly filter users in `/api/v1/admin/users` endpoint -- User Interface features - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6407) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6423)): Rework user profile settings - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6386) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6399)): Rework new repository dialog - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6344): Show repository size on mobile - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6274): Add links to commit lists in contributors graph page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6079): Add copy path button to file view - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6044): Put issue actions in a single row on mobile - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6018): Don't display email in profile settings when hidden - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5899): Highlight user mention in comments and commit messages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5819): When [bleve is used for issue search](https://forgejo.org/docs/next/admin/config-cheat-sheet/#indexer-indexer), a `fuzzy` search now applies to each word instead of all of them, as if they were a phrase. For instance, searching for `activitypub spam moderation` previously [returned no result in Forgejo discussions](https://v9.next.forgejo.org/snematoda/forgejo-discussions/issues?state=open&type=all&q=activitypub+spam+moderation&fuzzy=true) and now returns the [relevant issues](https://codeberg.org/forgejo/discussions/issues?state=open&type=all&q=activitypub+spam+moderation&fuzzy=true). If the search results are too broad, or for searching exact phrases prefer using an `exact` search. Sorting by newest is still available as a non default option under `Sort`. The query was also reworked to improve performances. It makes a significant difference for large instances such as Codeberg. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5777): Add search to releases page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5695): Combine review requests comments - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5677): If you select a portion of a comment and use the 'Quote reply' feature in the context menu, only that portion will be quoted. The markdown syntax is preserved. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5593): Set "your repositories" as the default filter for org dashboards - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5589): Add button to create a Markdown table in a comment - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5518): Add a bullet symbol between author and committer - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4125): Added link to show all Issues/PullRequests -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6122): Fix Action log UI race condition that occasionally prevents logs from loading - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6063): Fix wiki search overflowing on wide screens - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5838): Move "forgot_password"-link to fix login tab order - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5697): Update help links on page with no workflows -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6072): Add Low German to list of default languages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5786): i18n: Add dummy language for checking translation keys (#5785) - - Updates from Codeberg Translate: [[1]](https://codeberg.org/forgejo/forgejo/pulls/6566), [[2]](https://codeberg.org/forgejo/forgejo/pulls/6514), [[3]](https://codeberg.org/forgejo/forgejo/pulls/6378) ([backport](https://codeberg.org/forgejo/forgejo/pulls/6450)), [[4]](https://codeberg.org/forgejo/forgejo/pulls/6331) ([backport](https://codeberg.org/forgejo/forgejo/pulls/6377)), [[5]](https://codeberg.org/forgejo/forgejo/pulls/6242), [[6]](https://codeberg.org/forgejo/forgejo/pulls/6161), [[7]](https://codeberg.org/forgejo/forgejo/pulls/6091), [[8]](https://codeberg.org/forgejo/forgejo/pulls/6041), [[9]](https://codeberg.org/forgejo/forgejo/pulls/5960), [[10]](https://codeberg.org/forgejo/forgejo/pulls/5845), [[11]](https://codeberg.org/forgejo/forgejo/pulls/5754), [[12]](https://codeberg.org/forgejo/forgejo/pulls/5681), [[13]](https://codeberg.org/forgejo/forgejo/pulls/5583) - -- Features - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6448): Add summary card for repos and releases - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/b0d6a7f07bff836190a8e87fe5645d5557893e32) Implement update branch API - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6265): Allow changing default branch update style - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6228): Add sorting functionality to `/api/v1/admin/users` endpoint - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6200): [commit](https://codeberg.org/forgejo/forgejo/commit/0786ddc5de37a01d1c3e3bf99b794665341b3c12) Add Swift login endpoint - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6180): Add support for `pacman -F` in Arch package - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6170): Make LFS http_client parallel within a batch - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6146): Improve performance of notifications page for MySQL - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6143): Filepath filter for code search - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6112): Add option to disable builtin authentication - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6110): [commit](https://codeberg.org/forgejo/forgejo/commit/3973f1022d57a3134e8f775e1c1cc6d398681bb4) Add github compatible tarball download API endpoints - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6100): Improve performance of allowed org repo creation query - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/ddabba5f89c4b196daeeb2af17de9ec2cec14b63) Allow the actions user to login via the jwt token - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6053): Add a "summary card" to issues & PRs for consumption by OpenGraph clients - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/dd3c4d7096cff91854bcc6641f55d9d093e5c86e) Add a doctor check to disable the "Actions" unit for mirrors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5940): Make AVIF Images work with Forgejo - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5822): Trim spaces from repo names on form submission - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/1e595979625e54d375a0eaa440b84ef5e17af160) Add new [lfs_client].BATCH_SIZE and [server].LFS_MAX_BATCH_SIZE config settings. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5787): Add setting to block disposable emails - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5751): mermaid: [Add the Kanban board diagram type](https://github.com/mermaid-js/mermaid/pull/5999). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5751): mermaid: [Class diagram includes a new "classBox" shape, classDef statement, support for styling the default class and lollipop interfaces](https://github.com/mermaid-js/mermaid/pull/5880). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): [commit](https://codeberg.org/forgejo/forgejo/commit/ab660c5944d59cdb4ecc071401445ac9f53cee45) Add `DISABLE_ORGANIZATIONS_PAGE` and `DISABLE_CODE_PAGE` settings for explore pages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5689): Add branch deletion for scheduled PRs - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/c3741d7fb0114691da73f00ae0ac9dced87e884d) The `requested_reviewers` data is included in more webhook events. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/89446e60a6e7ec3441f0c480164c09851ae54ce7) Support migrating GitHub/GitLab PR draft status. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5601): Language detection in the repository learned about the following languages: [Java Template Engine](https://github.com/github-linguist/linguist/pull/6610), [Noir](https://github.com/github-linguist/linguist/pull/6432), [Cylc](https://github.com/github-linguist/linguist/pull/6832), [iCalendar](https://github.com/github-linguist/linguist/pull/6940), [vCard (aka. VCF: Virtual Contact File) and Variant Call Format (VCF)](https://github.com/github-linguist/linguist/pull/6941), [B4X](https://github.com/github-linguist/linguist/pull/6965), [Carbon](https://github.com/github-linguist/linguist/pull/7011), [LiveCode Script](https://github.com/github-linguist/linguist/pull/6833), [Dune (OCaml build system)](https://github.com/github-linguist/linguist/pull/6814). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5601): The following extensions or filenames in a repository are associated with the matching language: [deno.lock](https://github.com/github-linguist/linguist/pull/6885), [uv.lock](https://github.com/github-linguist/linguist/pull/7006), [HOSTS.TXT](https://github.com/github-linguist/linguist/pull/7014), [.peggy](https://github.com/github-linguist/linguist/pull/7017), [.resource](https://github.com/github-linguist/linguist/pull/6500). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5543): [commit](https://codeberg.org/forgejo/forgejo/commit/d0af8fe4dc7b294fe5409b2271468494267d5a7d) Allow filtering pull requests by poster in the API. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/af901ac7bb03d27f175f2292581fc67fa9c8d567) Add support for searching users by email. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5459): New mermaid [flowchart shapes](https://mermaid.js.org/syntax/flowchart.html#complete-list-of-new-shapes). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/8178d6eaba64d05799fd3b62fa889bd13bee07c7) Code search results when using the bleve indexer are sorted by relevance. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/9d3473119893ffde0ab36d98e7a0e41c5d0ba9a3) Add bin to Composer Metadata. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4968): Support regexp in git-grep search - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4753): Git notes can be modified via the API or the UI -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6343): avoid Gitea migration warnings - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6329): maven package where actual pom has no group-id defined, fallback to parent group-id - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/96a7f0a3f065c5db8fdf352c93c8367e24d259de) Fix missing outputs for jobs with matrix - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/2b5c69c451a684b20119e2521dc23734c7869241) Detect whether action view branch was deleted - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6271): [commit](https://codeberg.org/forgejo/forgejo/commit/bf934c96c92d643678ac7a18697b6563bc9d20a5) Add standard-compliant route to serve outdated R packages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6105): Fix unconditional DB queries in commit status fetches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/32a91add34519ef7768ec907888ed837ad0dde2f) Fix GetInactiveUsers - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/64824290912b6300ede2b2f95ff77d55dde9859b) Fix submodule parsing - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6062): [commit](https://codeberg.org/forgejo/forgejo/commit/ddabba5f89c4b196daeeb2af17de9ec2cec14b63) allow the actions user to login via the jwt token - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/a8f2002a9b061ec1092df67c6f05e30aa7d2e2d2) Remove transaction for archive download - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/96ee0f56475204b2bbdc7f2aeb35b1c32eac469c) Fix oauth2 error handle not return immediately - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/c2e8790df37a14b4d2f72c7377db75309e0ebf1d) Trim title before insert/update to database to match the size requirements of database - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/03ab73d92eabaf774278effe3332623b1dc3580a) Fix nil panic if repo doesn't exist - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/56971f9ed90a01fd74a634b7496593e6f62ac260) Disable Oauth check if oauth disabled - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5997): [commit](https://codeberg.org/forgejo/forgejo/commit/56971f9ed90a01fd74a634b7496593e6f62ac260) Disable OAuth check if OAuth disabled - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5988): [commit](https://codeberg.org/forgejo/forgejo/commit/fc26becba4b08877a726f2e7e453992310245fe5) When a tag was removed and a release existed for that tag, it would be broken. The release is no longer broken the tag can be added again. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5811): Escaping specific markdown in commit messages on Discord-type embeds - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/362ad0ba39bdbc87202e349678e21fc2a75ff7cb) Update force-pushed tags too when syncing mirrors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/4c5bdddf7751a35985c08ba6506f1f30103749d6) Fix `missing signature key` error when pulling Docker images with `SERVE_DIRECT` enabled - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/2c5fdb108ff9e23e8f907fb6afe59177c6bb202e) Fix the missing menu in organization project view page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): [commit](https://codeberg.org/forgejo/forgejo/commit/2358c0d899faec8311e46dcb0550041496bcd532) Properly clean temporary index files - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5781): Preview picture not visible on Markdown file - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): [commit](https://codeberg.org/forgejo/forgejo/commit/d13a4ab5632d6a9697bd0907f9c69ed57d949340) Fixed a bug related to disabling two-factor authentication - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/f3f386545ee97b91f1aaac4142480e70a443c655) Always update expiration time when creating an artifact, so that artifacts from re-ran jobs do not get lost. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/c163bf6fb55c922ab0cf552b47475fc8fc8b99d9) Remove the button toolbar when deleting a diff comment. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5621): [commit](https://codeberg.org/forgejo/forgejo/commit/e8700cee612f0aa769dc6929772d9b04c6c21807) Run scheduled tasks against the latest commit. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5517): Allow Organisations to remove the Email Address - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/1dfe58ad11bc6fdc73a2b5ffb3c1481fbddbf46b) PR creation on forked repositories. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5477): [commit](https://codeberg.org/forgejo/forgejo/commit/b67b7c12385059898fc8cb7997755a88b3afa483) The logic of finding the latest pull review commit ID is incorrect. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/b496317b5a2aea970bc94ccf6fcde35cd417ec20) After migrating a repository that contains merged pull requests, the branch is missing and cannot be deleted. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5416): [commit](https://codeberg.org/forgejo/forgejo/commit/a226064711899da07d6b1455a68ef758f2f3e7e0) Forgejo Actions artifact v4 upload above 8MB. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5307): Don't allow modification to internal reference -- Other changes without a feature or bug label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5789): chore: [commit](https://codeberg.org/forgejo/forgejo/commit/b308bcca7c950b7f0d127ee4282019c2a9923299) Improved diff view performance - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5714): chore: [commit](https://codeberg.org/forgejo/forgejo/commit/ab26d880932dbc116c43ea277029984c7a6d4e94) Emit a log message when failing to delete an inactive user -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6553): Update module github.com/alecthomas/chroma/v2 to v2.15.0 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6513) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6517)): Add lock for parallel maven upload - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6496): Update module github.com/go-git/go-git/v5 to v5.13.1 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6491) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6493)): fix: upgrade gof3 package and driver - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6488) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6492)): chore: remove illegal git usage - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6463) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6465)): fix(ui): show oauth divider on signup page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6432) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6444)): Fix editing pr review - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6441) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6442)): fix(code search): empty mode dropdown when keyword is empty - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6427) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6430)): fix(ui): use primary color for button in table modal - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6421) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6426)): Fix edit cancel button - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6419) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6424)): Fix issue/comment menus - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6403) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6420)): chore(branding): strip metadata information from the footer - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6410) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6418)): fix: use DateUtils for blocked users list - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6391) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6416)): [gitea] week 2024-53 cherry pick (gitea/main -> forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6405) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6406)): fix: xorm needs to be lowercase otherwise it is ignored - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6401) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6402)): Cosmetic changes and fixes around repo homepage - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6286) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6398)): feat: When comparing in repos, mention that pull request creation requires sign-in - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6390) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6392)): Fix overflow in git notes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6382)): Revert "Update dependency idiomorph to v0.4.0" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6375) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6376)): chore(i18n): user/label translations in danish/latvian - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6368): harden keying implementation - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6367): Update dependency webpack-cli to v6 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6366): Update linters (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6365): Update dependency djlint to v1.36.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6364): Update dependency @vitest/eslint-plugin to v1.1.20 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6363): Update github.com/shurcooL/vfsgen digest to 0000e14 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6357): chore(docs): explain vars.SKIP_END_TO_END when building a release - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6355): Update dependency idiomorph to v0.4.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6354): Update module google.golang.org/protobuf to v1.36.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6349): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6348): Update module github.com/go-testfixtures/testfixtures/v3 to v3.14.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6347): Update renovate Docker tag to v39.82.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6342): [gitea] week 2024-52 cherry pick (gitea/main -> forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6339): repo avatar generating (#6338) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6337): keep commit count limit in file history pagination static and not increase with every page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6335): template config path (#2836) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6330): branding: update contrib/legal - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6324): chore(release): link to the standalone release notes file - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6322): Update module google.golang.org/grpc to v1.69.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6321): Update dependency globals to v15.14.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6320): Update actions/cascading-pr action to v2.2.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6319): Update dependency katex to v0.16.18 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6316): Update module golang.org/x/net to v0.33.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6313): actions move to data.forgejo.org - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6311): chore: avoid using gock - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6310): chore: remove unused dependency from build.go - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6309): Update dependency markdownlint-cli to v0.43.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6308): Update dependency @playwright/test to v1.49.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6307): Update vitest monorepo to v2.1.8 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6306): Update module github.com/blevesearch/bleve/v2 to v2.4.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6305): Update dependency tailwindcss to v3.4.17 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6304): Update dependency katex to v0.16.17 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6303): Update dependency eslint-plugin-import-x to v4.5.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6301): Replace actions/cascading-pr action with actions/cascading-pr v2.1.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6299): chore: Make Forgejo build with go1.24 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6298): Update actions/setup-forgejo action to v2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6296): Add readme to locale folder - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6295): Update module google.golang.org/protobuf to v1.36.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6293): Update dependency eslint-plugin-sonarjs to v3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6292): Update linters (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6291): Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v1.62.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6290): Update dependency @vitest/eslint-plugin to v1.1.16 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6288): Some improvements to base locale - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6287): Don't notify when a user self-request as reviewer - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6282): Update module github.com/go-chi/chi/v5 to v5.2.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6281): Update actions/cascading-pr action to v2.2.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6278): Update renovate to v39.69.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6264): Update forgejo/forgejo-build-publish action to v5.2.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6260): Update module golang.org/x/tools/gopls to v0.17.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6259): Update dependency @primer/octicons to v19.14.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6258): Update module github.com/gliderlabs/ssh to v0.3.8 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6256): chore(release-notes): Forgejo v9.0.3 [skip ci] - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6255): chore(release-notes): Forgejo v7.0.12 [skip ci] - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6254): Use correct title for container images - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6245): Adjust MySQL instruction - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6243): Update module golang.org/x/crypto to v0.31.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6237): Avoid having to store i18n linter exceptions for - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6234): Update github.com/grafana/go-json digest to a119ee5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6233): Add missing automerge feed message - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6229): Update dependency katex to v0.16.15 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6227): Replace actions/setup-forgejo action with actions/setup-forgejo v1.0.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6226): Replace actions/cascading-pr action with actions/cascading-pr v2.1.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6223): chore(ci): set the milestone when a pull request is closed (take 4) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6222): Clipboard read permission for Chromium - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6221): Add `-` as reserved user - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6219): chore(ci): set the milestone when a pull request is open (take 3) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6213): chore(ci): set the milestone when a pull request is open (take 2) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6211): chore(ci): set the milestone when a pull request is open [skip ci] - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6210): Update dependency forgejo-lxc to v12 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6206): Cleanup `package/arch` route - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6205): Update dependency katex to v0.16.14 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6204): Update renovate to v39.57.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6202): nix-dev-improvements - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6201): Simplify main-attribute labels - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6199): feat(secret): generate FORGEJO_TOKEN for all tasks - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6196): Rebrand help text in `forgejo migrate` #6194 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6191): Do not offer duplicating a PR for a recently pushed branch - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6190): Update x/tools to v0.28.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6188): don't specify FOR clause for index hint - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6182): chore(ci): common issue-labels name for all related workflows - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6178): Revert "chore(ci): merge jobs in issue-labels.yml in one workflow" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6177): chore(ci): docker-runner-one is not a known label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6175): Update module golang.org/x/net to v0.32.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6172): Update dependency webpack to v5.97.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6171): Update dependency @github/relative-time-element to v4.4.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6165): chore(release-notes): keep release notes in release-notes-published - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6160): Update module golang.org/x/image to v0.23.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6159): Update module golang.org/x/crypto to v0.30.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6157): Update dependency @primer/octicons to v19.13.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6153): highlight Gradle Kotlin as Kotlin - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6152): remove softbreak from github legacy callout - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6151): build: only require go minor - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6150): Update module code.forgejo.org/go-chi/session to v1.0.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6148): Update module code.forgejo.org/go-chi/captcha to v1.0.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6145): Update dependency go to v1.23.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6144): correct permission loading for limited organisation - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6140): Update dependency webpack to v5.97.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6139): Update dependency tailwindcss to v3.4.16 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6137): Update fnetx/setup-cache-go digest to 4b50dd2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6136): build: relax required go version for local development - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6130): avoid sorting for `MakeSelfOnTop` - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6128): clean up log files that no longer exist - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6120): chore(ci): run merge conditions when a new commit is pushed - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6119): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6118): Update dependency globals to v15.13.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6117): Regular visual regression testing - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6115): Update renovate to v39.42.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6114): return correct type in `GetSubModule` - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6113): Rework GetLatestCommitStatusForPairs query using a subquery for PG compatibility - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6109): Update dependency happy-dom to v15.11.7 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6108): Update dependency djlint to v1.36.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6107): Update dependency @vitest/eslint-plugin to v1.1.13 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6106): Update dependency @stoplight/spectral-cli to v6.14.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6095): Update dependency sortablejs to v1.15.6 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6090): chore(i18): cleanup locales - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6089): typos, mostly from `codespell`, others just by eyeballing - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6088): Update dependency sortablejs to v1.15.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6087): Update dependency mermaid to v11.4.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6084): normalize guessed languages from enry - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6083): improve wording of limited visibility - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6082): Update dependency chartjs-plugin-zoom to v2.2.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6071): Use user.FullName in Oauth2 id_token response - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6067): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6066): Update dependency sortablejs to v1.15.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6065): Update renovate to v39.28.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6059): Improve colors used by colorblind-friendly forgejo themes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6058): Update module github.com/stretchr/testify to v1.10.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6052): Show page titles in wiki search results (#6048) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6050): Improve Swagger documentation for user endpoints - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6049): Update dependency typescript to v5.7.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6046): ci: use more `tmpfs` and `noatime` for faster CI - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6045): test: fix e2e test - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6034): chore(ci): remove unused experimental DNS updates - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6029): bug: git notes edit/remove button displayed to anonymous visitors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6027): Apply smaller padding to comment headers - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6025): Improve git notes UI - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6023): Update dependency chartjs-plugin-zoom to v2.1.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6021): chore(ci): merge jobs issue label jobs in one workflow - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6020): chore(ci): make release-notes-assistant job copy/pastable (part two) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6019): chore(ci): make release-notes-assistant job copy/pastable - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6013): fix(test): TestGitAttributeCheckerError must allow broken pipe - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6010): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6008): Update renovate to v39.19.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6006): vertical center the date on GPG keys - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6003): chore(release-notes-assistant): security fix / features come first - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6002): chore(ci): make backporting job copy/pastable - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6001): chore(ci): make merge-conditions job copy/pastable - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6000): chore(ci): make end-to-end job copy/pastable - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5996): check read permissions for code owner review requests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5995): remember fuzzy for open/close state - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5994): Revert defaulting to EdDSA - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5991): api repo compare with commit hashes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5989): use better code to group UID and stopwatches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5987): Default to generating EdDSA for OAuth JWT signing key - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5986): bug: correctly generate oauth2 jwt signing key - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5984): extend `forgejo_auth_token` table (part two) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5983): improve `GetLatestCommitStatusForPairs` - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5981): Update dependency vue to v3.5.13 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5980): Update github.com/grafana/go-json digest to f14426c (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5978): chore(release-notes): fix the v9.0.2 links - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5977): chore: fix e2e - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5973): ci: upload all e2e artifacts - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5969): Update module google.golang.org/grpc to v1.68.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5968): test: fix e2e tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5966): Update dependency tailwindcss to v3.4.15 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5965): use oci mirror for `tonistiigi/xx` image - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5964): ci: proper job name - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5963): ci: use oci mirror images - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5962): ci: disable postgresql fsync - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5958): ci: use tmpfs for service storage - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5957): ci: disable mysql binlog - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5956): test: use sqlite in-memory db for integration - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5955): test: add trailing newline to `testlogger.go:recordError` message - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5954): chore: improve slow tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5951): chore(i18n): allow datnes nosaukums for filename (Latvian) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5949): Update module code.forgejo.org/forgejo/act to v1.22.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5948): chore: improve preparing tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5946): Update module github.com/blevesearch/bleve/v2 to v2.4.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5944): chore(ci): ROLE forgejo-coding & forgejo-testing (part two) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5943): chore(release-notes): update the v9.0.2 & v7.0.11 links - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5942): chore(ci): ROLE forgejo-coding & forgejo-testing - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5935): chore(renovate): throttle down upgrade of linters & test packages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5934): Update linters (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5933): Update dependency @stoplight/spectral-cli to v6.14.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5932): Update dependency happy-dom to v15.11.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5931): Update dependency @vitest/eslint-plugin to v1.1.10 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5929): tests(e2e): Refactor various tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5928): chore(lint): Ignore playwright reports for linting - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5924): fix(ci): synchronize updates the commit status asynchronously - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5923): chore(renovate): always set the test/not-needed label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5922): Update module github.com/buildkite/terminal-to-html/v3 to v3.16.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5921): Update dependency postcss to v8.4.49 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5920): Update dependency happy-dom to v15.11.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5919): Update dependency @axe-core/playwright to v4.10.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5916): chore(e2e): Update global patterns - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5913): chore: set recommend vscode settings for golangci-lint - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5912): test: fix test linting - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5911): Update module github.com/golangci/golangci-lint/cmd/golangci-lint to v1.62.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5910): Update dependency @vitejs/plugin-vue to v5.1.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5909): Re-add least recently updated as sort order - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5908): Update dependency postcss to v8.4.48 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5907): Update renovate to v39.9.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5906): chore: improve database docker instructions - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5904): chore: improve test quality - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5903): chore: simplify CopyDir - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5896): fix(ci): only trigger end-to-end tests when the label is set - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5892): Proper parsing of date for git commits - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5890): Update module golang.org/x/net to v0.31.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5888): chore: lazy-loaded version of goccy/go-json - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5886): chore(ci): Enforce test label with CI check - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5885): fix(ui): Details icon in repo settings sidebar - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5883): Update module golang.org/x/crypto to v0.29.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5881): [THEME] Copy ansi terminal colours from gitea to forgejo themes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5878): fix(ci): slow runners may need more than 50 minutes for a test - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5869): bug: require.Eventually must not test with assert - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5865): Update module code.forgejo.org/go-chi/session to v1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5864): Update module code.forgejo.org/go-chi/captcha to v1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5863): Update module code.forgejo.org/go-chi/cache to v1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5862): Update module code.forgejo.org/go-chi/binding to v1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5858): chore(renovate): only run if renovate workflow changed - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5857): chore(renovate): update settings - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5843): issue labels are not set after deleting one label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5840): Update dependency happy-dom to v15.11.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5837): Update dependency eslint-plugin-playwright to v2.0.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5836): Update dependency go to v1.23.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5835): Make direnv optional to let developers use their own direnv configuration - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5832): chore(renovate): fix regex - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5830): chore(renovate): use squash for automerge - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5829): Update renovate to v39 (forgejo) (major) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5825): Update dependency happy-dom to v15.10.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5824): Update dependency djlint to v1.36.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5820): chore(ci): deprecate legacy infrastructure supporting v*.next - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5817): test: enable gitea migration tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5816): test: enable github migration tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5815): Update linters to v8.13.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5814): Update dependency globals to v15.12.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5813): Update dependency happy-dom to v15.9.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5804): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5803): Update dependency happy-dom to v15.8.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5802): Update renovate to v38.142.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5796): [PORT] Replace DateTime with proper functions (gitea#32402) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5795): support `www.github.com` for migrations - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5794): [PORT] Fix git error handling (gitea#32401) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5793): [PORT] Refactor the DB migration system slightly (gitea#32344) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5792): [PORT] Fix toAbsoluteLocaleDate and add more tests (gitea#32387) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5791): [PORT] Fix a number of typescript issues (gitea#32308) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5790): [PORT] Refactor tests to prevent from unnecessary preparations (gitea#32398) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5788): chore(cleanup): remove unused TestCreateFile - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5784): Update dependency eslint-plugin-array-func to v5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5783): Update module github.com/gorilla/sessions to v1.4.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5782): Update actions/git-backporting action to v4.8.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5780): Update module github.com/yuin/goldmark to v1.7.8 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5779): support color dots for 4 character hex. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5775): Update module github.com/fsnotify/fsnotify to v1.8.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5774): Update linters (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5773): Update dependency happy-dom to v15.8.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5772): Update dependency djlint to v1.35.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5771): tests: improve actvititypub integration test code - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5769): Revert: chore(ci): Enforce test label with CI check - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5768): chore(renovate): explicit base branches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5767): Improvements to some English strings - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5766): Update infrastructure/next-digest action to v1.1.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5764): Update dependency webpack to v5.96.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5763): Update dependency mini-css-extract-plugin to v2.9.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5762): Update module code.forgejo.org/forgejo/act to v1.21.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5756): chore(ci): Enforce test label with CI check - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5755): chore(ci): use rootless for the container images sent to k8s - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5750): Update dependency djlint to v1.35.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5747): chore(ci): notify the k8s cluster about experimental releases - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5738): Update module github.com/meilisearch/meilisearch-go to v0.29.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5737): Update vitest monorepo to v2.1.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5734): refactor: Migrate playwright to typescript - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5732): chore(release): also copy the release to code.forgejo.org - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5729): docs: add links to the v7.0.10 & v9.0.1 release notes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5717): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5716): Update renovate to v38.133.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5713): i18n: fix placeholders in string for refusing to review - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5712): Link back to one-time code page from scratch code page - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5705): Update linters (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5704): Update dependency @playwright/test to v1.48.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5703): harden localization against malicious HTML - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5702): use buffered iterate for debian searchpackages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5698): Update internationalization label in release-notes-assistant - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5692): tests(e2e): skip browser downloads - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5690): Add typescript support - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5688): make branch protection work for new branches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5685): chore: output playwright directly to std{out,err} - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5684): reset `history.scrollRestoration` if set to `manual` and no issue anchor in url - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5678): Update dependency postcss-nesting to v13.0.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5669): Update dependency eslint-plugin-playwright to v2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5668): chore: remove eslint v9 restriction in renovate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5665): Update module github.com/jhillyerd/enmime to v2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5664): Update dependency postcss-nesting to v13 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5663): Update dependency eslint-plugin-unicorn to v56 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5662): chore: move to Eslint flat config - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5657): use combo markdown editor for milestone description - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5653): don't show truncated comments in RSS/Atom feeds - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5652): typo on releases for source code downloads - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5651): link to security policy in security.txt - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5646): chore(release-notes): no need to specify they are draft - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5644): conf: Improve delete_old_actions description - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5641): make synchronize tags to database handle annotated tags - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5640): Revert "add gap between branch dropdown and PR button" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5638): Better messages for cases of private profiles - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5637): feat(ci): allow manual triggering of the test suite - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5633): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5632): Update renovate to v38.128.6 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5625): fix(i18n): edit should not be lowercase here - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5617): Create temporary user helper function - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5615): Don't double escape delete branch text - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5608): Update code.forgejo.org/go-chi/session digest to 2a99226 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5595): Add server logging for OAuth server errors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5592): forgejo-cli is now a symlink and cannot be used for sanity checks - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5591): Update dependency @primer/octicons to v19.12.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5590): Update dependency @playwright/test to v1.48.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5578): Update module github.com/buildkite/terminal-to-html/v3 to v3.16.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5576): Update dependency chart.js to v4.4.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5569): Update vitest monorepo to v2.1.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5568): Update module github.com/redis/go-redis/v9 to v9.6.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5563): Update security option in issue template - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5561): Fix typo in English locale file - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5560): regression from #4125 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5555): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5554): Fix typo in #5537 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5550): Update module github.com/urfave/cli/v2 to v2.27.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5549): Update renovate to v38.121.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5541): Update module github.com/minio/minio-go/v7 to v7.0.78 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5540): Update module github.com/klauspost/compress to v1.17.11 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5539): Update dependency vue to v3.5.12 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5537): i18n: Improve translation strings for webhook events - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5536): use column flex on mobile to prevent project title from wrapping - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5533): i18n: remove unnecessary variable - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5530): Make chroma match case-insensitive - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5523): i18n: Fine tune language for units - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5522): Update dependency @github/text-expander-element to v2.8.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5514): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5511): Update x/tools to v0.26.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5510): Update module google.golang.org/protobuf to v1.35.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5509): Update module golang.org/x/sys to v0.26.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5508): Update module golang.org/x/net to v0.30.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5506): Do not change stroke size in the loading animation - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5505): Small fixes and rename for #5482 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5503): update git book link to v2 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5502): Update module golang.org/x/image to v0.21.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5501): Update dependency @playwright/test to v1.48.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5498): Update actions/cache action to v4.1.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5495): Update dependency eslint-plugin-wc to v2.2.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5494): Update dependency @vitest/eslint-plugin to v1.1.7 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5493): Update actions/git-backporting action to v4.8.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5491): correct documentation for non 200 responses in swagger - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5485): chore(ci): update changed-files actions URL for consistency - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5483): Update renovate to v38.110.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5482): "Assign to me" button on PR and Issues #5215 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5479): Improve 'Verify' error message, stopgap for #2809 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5476): Update dependency @stylistic/eslint-plugin-js to v2.9.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5474): Update actions/cache action to v4.1.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5473): Update module github.com/mattn/go-sqlite3 to v1.14.24 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5472): "forked from" note alignment on 404 error pages #5324 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5471): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5467): Update dependency @vitest/eslint-plugin to v1.1.6 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5466): Update dependency @stylistic/stylelint-plugin to v3.1.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5458): Update dependency vue to v3.5.11 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5456): log concise repo names in lfs doctor - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5454): Update vitest monorepo to v2.1.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5453): Update module github.com/caddyserver/certmagic to v0.21.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5452): Update dependency @vitest/eslint-plugin to v1.1.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5450): ci/tests(e2e): always run e2e tests, but only on changed files - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5449): Update dependency go to v1.23.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5441): Update actions/setup-go action to v5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5437): Update ghcr.io/devcontainers/features/git-lfs Docker tag to v1.2.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5436): Update dependency eslint-plugin-sonarjs to v2.0.3 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5435): Update github.com/google/pprof digest to 017d972 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5434): chore: remove spurious comment in tests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5430): referenced sha256:* container images may be deleted - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5428): Update actions/setup-node action to v4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5427): Update actions/checkout action to v4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5426): Update actions/cache action to v4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5424): Lock file maintenance (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5422): Update renovate to v38.101.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5421): ci: move composite workflow location - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5415): document sqlite3 as suggested database - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5413): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5411): Update dependency webpack to v5.95.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5410): ci: Move preparations to local actions - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5405): Update dependency markdownlint-cli to v0.42.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5404): Update dependency @vitest/eslint-plugin to v1.1.4 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5403): Update dependency @stylistic/stylelint-plugin to v3.1.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5402): Update dependency vue to v3.5.10 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5398): Update module github.com/minio/minio-go/v7 to v7.0.77 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5397): Update module github.com/klauspost/compress to v1.17.10 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5396): Update dependency @github/text-expander-element to v2.7.2 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5395): Update citation-js monorepo (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5391): docs: add link to the v9.0.0 release notes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5389): mail issue: Display issue type in email header - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5374): Update dependency monaco-editor to v0.51.0 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5370): Update module google.golang.org/grpc to v1.67.1 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5355): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5353): Remove some Windows-specific files - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5351): Add architecture-specific removal support for arch package - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5328): ci: use custom action for Go caching - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5294): tests(e2e): Refactor branch protection test - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5249): Makefile: support gotestsum - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5240): Update module github.com/prometheus/client_golang to v1.20.5 (forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5158): use ValidateEmail as binding across web forms -- Already announced in the release notes of an older stable release - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6249): Revert "allow synchronizing user status from OAuth2 login providers (#31572)" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6248): ensure correct ssh public key is used for authentication - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6124): doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6097): Do not rewrite ssh keys files when deleting a user without one - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6054): Do not delete global Oauth2 applications - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/1ce33aa38d1d258d14523ff2c7c2dbf339f22b74) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/061abe60045212acf8c3f5c49b5cc758b4cbcde9) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/3e3ef76808100cb1c853378733d0f6a910324ac6) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/9508aa7713632ed40124a933d91d5766cf2369c2) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/786dfc7fb81ee76d4292ca5fcb33e6ea7bdccc29) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/e6bbecb02d47730d3cc630d419fe27ef2fb5cb39) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/7067cc7da4f144cc8a2fd2ae6e5307e0465ace7f) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974): [commit](https://codeberg.org/forgejo/forgejo/commit/b70196653f9d7d3b9d4e72d114e5cc6f472988c4) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5941): handle renamed dependency for cargo registry - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5850): [PORT] Fix code owners will not be mentioned when a pull request comes from a forked repository (gitea#30476) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5831): labels are missing in the pull request payload removing a label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): In a Forgejo Actions workflow, the `unlabeled` event type for pull requests was incorrectly mapped to the labeled event type. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): When a Forgejo Actions issue or pull request workflow is triggered by an `labeled` or `unlabeled` event type, it misses information about the label added or removed. It is now available in the `label` data member of the event payload. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778): The pull request workflow must always update the head SHA commit status. Not just when the PR is synchronized, opened or closed. Otherwise it makes it impossible to define a job to be a required check (for instance a job that is triggered when labels are modified and verifies that a given combination is present). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5746): git-grep for code search when git version is below 2.38 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5719): Forgejo generates a token which is used to authenticate web endpoints that are only meant to be used internally, for instance when the SSH daemon is used to push a commit with Git. The verification of this token was not done in constant time and was susceptible to [timing attacks](https://en.wikipedia.org/wiki/Timing_attack). A pre-condition for such an attack is the precise measurements of the time for each operation. Since it requires observing the timing of network operations, the issue is mitigated when a Forgejo instance is accessed over the internet because the ISP introduce unpredictable random delays. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5718): Because of a missing permission check, the branch used to propose a pull request to a repository can always be deleted by the user performing the merge. It was fixed so that such a deletion is only allowed if the user performing the merge has write permission to the repository from which the pull request was made. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5634): package arch database not updating when uploading "any" architecture - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5627): correct SQL query for active issues - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5626): specify default value for `EXPLORE_DEFAULT_SORT`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5613): Add `recentupdated` as recognized sort option - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5587): Dockerfile: use alpine:3.20 instead of golang:1.23-alpine3.20 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5585): Dockerfile: unnecessary container image layer duplication - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5529): Don't allow owner team with incorrect unit access (includes doctor fix) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5515): **Fixing this bug is a breaking change because existing tokens with a public scope will no longer return private resources. They have to be deleted and re-created without the public scope to restore their original behavior**. The public scope of an application token does not filter out private repositories, organizations or packages in some cases. This scope is not the default, it has to be manually set via the web UI or the API. When the public scope is explicitly added to an application token that is allowed to list the repositories and packages of a user or an organization, it is meant as a restriction. For instance if a user has two repositories, one private and the other publicly visible, a token with the public scope used with the API endpoint listing the repositories that belong to this user must only return the publicly visible one and not reveal the existence of the private one. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5492): correct Discord webhook JSON for issue events - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5470): don't cancel schedule workflows on push to main branch - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5439): Fix boolean inputs in workflow_dispatch - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/f709de24039ab7e605d3e09e3b61240836381603) Fix wrong last modify time. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/2675a24649af2fff34f5c7e416d6ff78591d8d9c) Repo Activity: count new issues that were closed. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/526054332acb221e061d3900bba2dc6e012da52d) Fix incorrect /tokens api. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372): [commit](https://codeberg.org/forgejo/forgejo/commit/0cafec4c7a2faf810953e9d522faf5dc019e1522) Do not escape relative path in RPM primary index. - diff --git a/release-notes-published/10.0.1.md b/release-notes-published/10.0.1.md deleted file mode 100644 index f8f47433f8..0000000000 --- a/release-notes-published/10.0.1.md +++ /dev/null @@ -1,44 +0,0 @@ -See also the [dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). - - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6839): Verify the ID of Forgejo Actions web endpoints belongs to the repository to prevent the deletion of runners or variables or the modification of variables. [Read more in the dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6838): Enforce permissions on publicly available user or organizations projects to not leak information from issues and pull requests that belong to private repositories. [Read more in the dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6803) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6833)): fix(ui): display verified icon for default gpg key -- Localization - - Updates from Codeberg Translate: [[1]](https://codeberg.org/forgejo/forgejo/pulls/6764), [[2]](https://codeberg.org/forgejo/forgejo/pulls/6834) -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6674) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6678)): fix: load settings for valid user and email check - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6639) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6651)): Teach the doctor to remove orphaned two_factor with `forgejo doctor check --run check-db-consistency --fix`. Such rows may contain invalid data and [block the migration to v10](https://codeberg.org/forgejo/forgejo/issues/6637) with a message such as `failed: AesDecrypt invalid decrypted base64 string: illegal base64 data at input byte 0`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6633) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6643)): fix: listing tokens must not require basic auth -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6817) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6832)): fix: avoid y-axis clipping for branch name - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6646) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6810)): ci: fix go version check - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6808) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6809)): chore(i18n): lint errors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6782) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6783)): fix: make author search case insensitive - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6620) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6770)): fix(ui): add triangle down octicon to code search options dropdown - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6708) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6749)): Set explore pages to configurable default sort - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6734) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6748)): Disable autofocus on the dashboard repository search box - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6525) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6739)): fix inline file preview for files with encoded URL, fix #5069 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6726) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6730)): fix: check for webauthn in 2fa user search - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6716) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6720)): fix: disallow blame on directories - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6701) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6718)): fix(i18n): add forgotten translatable string - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6715) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6717)): fix: render issue titles consistently - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6704): chore: consistent docker image and action references - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6694): Update dependency katex to v0.16.21 [SECURITY] (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6572) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6685)): Fix inline file preview for rendered files - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6677) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6684)): fix: add non allowed domain translation - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6655) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6668)): chore(security): update security.txt with new expiration date - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6644): Update dependency go to v1.23.5 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6617) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6636)): fix(ui): prevent overflow of branch selector in commit graph - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6597) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6632)): Fix mention and emoji expansion & Improve leaving list completion - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6613) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6614)): Hide git note add button for commit, if commit already has a note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6595) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6601)): fix: Reset content of comment edit field on cancel - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6591) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6594)): fix: reduce noise for the v303 migration - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6569) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6587)): tests(e2e): Various fixes to visual testing - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6400) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6585)): Refactor e2e tests to simplify authentication setup - diff --git a/release-notes-published/10.0.2.md b/release-notes-published/10.0.2.md deleted file mode 100644 index 594614a790..0000000000 --- a/release-notes-published/10.0.2.md +++ /dev/null @@ -1,37 +0,0 @@ - - - - -## Release notes - -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7277): update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7067): update of translations from multiple sources -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7251) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7255)): When migrating from a Forgejo version lower than v10, the TOTP secrets found to be corrupted are now transparently removed from the database instead of failing the migration. 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. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7167) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7178)): replies to pending review comments no longer generate a notification, this was caused by an incomplete determination if the comment was part of the pending review or not - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7143) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7144)): consider public issues for project boards - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7038) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7046)): the rootless Forgejo image version label is not set - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7004) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7018)): do not allow SSH url for migration - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6680) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6930)): `setting.Service.EnableInternalSignIn = false` is disabling forgotten password - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6920) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6929)): show internal login prompt for account linking - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6915)): enable ssh mirrors in rootless Forgejo images - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6853) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6859)): render link in heading correctly in wiki TOC -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7284): Update module github.com/redis/go-redis/v9 to v9.7.3 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7270) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7272)): fix: consider issues in repository accessible via `access` table - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7199) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7202)): fix(api): miss-spelled description, corrected to `public` - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7171) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7177)): fix: revert issue rendering for `` element - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7078) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7079)): chore(ci): ensure the manually cached Go can be run - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6590) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7073)): chore(ci): Get Go binary from GOROOT instead of hardcoded path - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7072): Update module golang.org/x/crypto to v0.35.0 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7052): Update https://data.forgejo.org/forgejo/forgejo-build-publish action to v5.3.4 (v10.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7003) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7014)): fix: return 404 for empty repositories - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6937) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6976)): fix: delay deleting authorization token - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6953) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6954)): fix: native parsing of ssh certificate key - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6898) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6905)): fix(ui): hide extra PR property labels on title edit - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6866) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6884)): fix: always set stripped slashes on http request - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6851) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6860)): fix(ui): hide 'New migration' button on org pages with migrations disabled (#6850) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6700) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6854)): ui: update language stats layout and click behavior - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6812): Update dependency go to v1.23.6 (v10.0/forgejo) - diff --git a/release-notes-published/10.0.3.md b/release-notes-published/10.0.3.md deleted file mode 100644 index 16c6ad872b..0000000000 --- a/release-notes-published/10.0.3.md +++ /dev/null @@ -1,13 +0,0 @@ - - - - -## Release notes - -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7295) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7306)): fixes a [regression introduced in Forgejo v10.0.2](https://codeberg.org/forgejo/forgejo/pulls/6866/files) which caused unnecessary escaping of URLs. The symptoms were, for instance, a [failure to access theme files when they contain a space](https://codeberg.org/forgejo/forgejo/issues/7294) or [double escaping of links](https://codeberg.org/forgejo/forgejo/issues/7292). -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7304): Update module golang.org/x/oauth2 to v0.27.0 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7303): Update module golang.org/x/net to v0.36.0 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7302): Update module github.com/golang-jwt/jwt/v5 to v5.2.2 - diff --git a/release-notes-published/7.0.10.md b/release-notes-published/7.0.10.md deleted file mode 100644 index bbdc413a44..0000000000 --- a/release-notes-published/7.0.10.md +++ /dev/null @@ -1,13 +0,0 @@ - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5719) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5723)): Forgejo generates a token which is used to authenticate web endpoints that are only meant to be used internally, for instance when the SSH daemon is used to push a commit with Git. The verification of this token was not done in constant time and was susceptible to [timing attacks](https://en.wikipedia.org/wiki/Timing_attack). A pre-condition for such an attack is the precise measurements of the time for each operation. Since it requires observing the timing of network operations, the issue is mitigated when a Forgejo instance is accessed over the internet because the ISP introduce unpredictable random delays. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5718) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5720)): Because of a missing permission check, the branch used to propose a pull request to a repository can always be deleted by the user performing the merge. It was fixed so that such a deletion is only allowed if the user performing the merge has write permission to the repository from which the pull request was made. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5182) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5401)): Translation backports to v7 -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5725): Update dependency mermaid to v10.9.3 [SECURITY] (v7.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5241): Update dependency go to v1.22.7 (v7.0/forgejo) - diff --git a/release-notes-published/7.0.11.md b/release-notes-published/7.0.11.md deleted file mode 100644 index 16a2b1ecc9..0000000000 --- a/release-notes-published/7.0.11.md +++ /dev/null @@ -1,14 +0,0 @@ - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/1ce33aa38d1d258d14523ff2c7c2dbf339f22b74) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/061abe60045212acf8c3f5c49b5cc758b4cbcde9) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/3e3ef76808100cb1c853378733d0f6a910324ac6) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/9508aa7713632ed40124a933d91d5766cf2369c2) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/786dfc7fb81ee76d4292ca5fcb33e6ea7bdccc29) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/e6bbecb02d47730d3cc630d419fe27ef2fb5cb39) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/7067cc7da4f144cc8a2fd2ae6e5307e0465ace7f) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5976)): [commit](https://codeberg.org/forgejo/forgejo/commit/b70196653f9d7d3b9d4e72d114e5cc6f472988c4) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors. - diff --git a/release-notes-published/7.0.12.md b/release-notes-published/7.0.12.md deleted file mode 100644 index b382d82bbe..0000000000 --- a/release-notes-published/7.0.12.md +++ /dev/null @@ -1,18 +0,0 @@ - - - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6248) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6252)): When Forgejo is configured to run the internal ssh server with `[server].START_SSH_SERVER=true`, it was possible for a registered user to impersonate another user. The rootless container image uses the internal ssh server by default and was vulnerable. A Forgejo instance running from a binary or from a root container image does not use the internal ssh server by default and was not vulnerable. The incorrect use of the crypto package is the root cause of the vulnerability and was fixed for the internal ssh server. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6124) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6132)): fix: doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6054) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6056)): fix: Do not delete global Oauth2 applications -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6246): Update module golang.org/x/crypto to v0.31.0 (v7.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6223) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6230)): chore(ci): set the milestone when a pull request is closed (take 4) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6219) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6224)): chore(ci): set the milestone when a pull request is open (take 3) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6211) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6216)): chore(ci): set the milestone when a pull request is open - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6034) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6036)): chore(ci): remove unused experimental DNS updates - diff --git a/release-notes-published/7.0.13.md b/release-notes-published/7.0.13.md deleted file mode 100644 index 484bbc4afa..0000000000 --- a/release-notes-published/7.0.13.md +++ /dev/null @@ -1,19 +0,0 @@ -See also the [dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). - - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6845): Verify the ID of Forgejo Actions web endpoints belongs to the repository to prevent the deletion of runners or variables or the modification of variables. [Read more in the dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6846): Enforce permissions on publicly available user or organizations projects to not leak information from issues and pull requests that belong to private repositories. [Read more in the dedicated blog post](https://forgejo.org/2025-02-release-v10-0-1/). -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6674) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6679)): fix: load settings for valid user and email check -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6693): Update dependency katex to v0.16.21 [SECURITY] (v7.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6655) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6669)): chore(security): update security.txt with new expiration date - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6501): chore: remove illegal git usage - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6483): Update module github.com/go-git/go-git/v5 to v5.13.1 (v7.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6324) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6325)): chore(release): link to the standalone release notes file - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6317): Update module golang.org/x/net to v0.33.0 (v7.0/forgejo) - diff --git a/release-notes-published/7.0.14.md b/release-notes-published/7.0.14.md deleted file mode 100644 index b7e85d8184..0000000000 --- a/release-notes-published/7.0.14.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -## Release notes - -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7143) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7145)): consider public issues for project boards - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7038) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7049)): the rootless image version label is not set -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6299) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7233)): chore: Make Forgejo build with go1.24 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7081): Update golang packages to v1.23 (v7.0/forgejo) (minor) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/7051): Update https://code.forgejo.org/forgejo/forgejo-build-publish action to v5.3.4 (v7.0/forgejo) - diff --git a/release-notes-published/7.0.7.md b/release-notes-published/7.0.7.md deleted file mode 100644 index 310d430304..0000000000 --- a/release-notes-published/7.0.7.md +++ /dev/null @@ -1,13 +0,0 @@ -This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v7.0/admin/upgrade/). - -- Security - A [change introduced in Forgejo v1.21](https://codeberg.org/forgejo/forgejo/pulls/1433) allows a Forgejo user with write permission on a repository description to [inject a client-side script into the web page viewed by the visitor](https://en.wikipedia.org/wiki/Cross-site_scripting). This XSS allows for `href` in anchor elements to be set to a `javascript:` URI in the repository description, which will execute the specified script upon clicking (and not upon loading). [`AllowStandardURLs`](https://pkg.go.dev/github.com/microcosm-cc/bluemonday#Policy.AllowStandardURLs) is now called for the repository description policy, which ensures that URIs in anchor elements are `mailto:`, `http://` or `https://` and thereby disallowing the `javascript:` URI. - - - - -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4900)): disallow javascript: URI in the repository description -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4568) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4882)): i18n: backport of #4568 #4668 and #4783 to v7 - diff --git a/release-notes-published/7.0.8.md b/release-notes-published/7.0.8.md deleted file mode 100644 index a679b0131c..0000000000 --- a/release-notes-published/7.0.8.md +++ /dev/null @@ -1,18 +0,0 @@ -This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v7.0/admin/upgrade/). - -- Security bug fixes - [The scope of application tokens was not verified](https://codeberg.org/forgejo/forgejo/pulls/5149) when writing containers or Conan packages. This is of no consequence when the user associated with the application token does not have write access to packages. If the user has write access to packages, such a token can be used to write containers and Conan packages. An application token that was used to write containers or Conan packages without the `package:write` scope will now fail with an unauthorized error. It must be re-created to include the `package:write` scope. - - - - - -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5029) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5033)): Overflow for images on project cards. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5149) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5150)): The scope of application tokens is not verified when writing containers or Conan packages. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4885) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4950)): Run full PR checks on AGit push. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/3264) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4999)): - [commit](https://codeberg.org/forgejo/forgejo/commit/364922c6e4f28264add9e2501a352c25ad6a0993) When a repository is adopted, its object format is not set in the database. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/3264) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4999)): - [commit](https://codeberg.org/forgejo/forgejo/commit/e7f332a55d6a48a3f3b4f2bfa43d18455ac00acc) During a migration from bitbucket, LFS downloads fail. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4889) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5138)): Backports of #4889 and #4984 to v7 diff --git a/release-notes-published/7.0.9.md b/release-notes-published/7.0.9.md deleted file mode 100644 index 2cfa328162..0000000000 --- a/release-notes-published/7.0.9.md +++ /dev/null @@ -1,9 +0,0 @@ - - - -- Security - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5244) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5246)): replace v-html with v-text in branch search inputbox for XSS protection - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5201): Upgrade [webpack to v5.94.0](https://github.com/webpack/webpack/releases/tag/v5.94.0) as a precaution to mitigate [CVE-2024-43788](https://github.com/advisories/GHSA-4vvj-4cpr-p986), although we were not yet able to confirm that this can be exploited in Forgejo. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5070) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5181)): i18n: update of translations from Codeberg Translate - diff --git a/release-notes-published/8.0.1.md b/release-notes-published/8.0.1.md deleted file mode 100644 index a1877f4597..0000000000 --- a/release-notes-published/8.0.1.md +++ /dev/null @@ -1,20 +0,0 @@ -This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v8.0/admin/upgrade/). - -- Security bug fixes - A [change introduced in Forgejo v1.21](https://codeberg.org/forgejo/forgejo/pulls/1433) allows a Forgejo user with write permission on a repository description to [inject a client-side script into the web page viewed by the visitor](https://en.wikipedia.org/wiki/Cross-site_scripting). This XSS allows for `href` in anchor elements to be set to a `javascript:` URI in the repository description, which will execute the specified script upon clicking (and not upon loading). [`AllowStandardURLs`](https://pkg.go.dev/github.com/microcosm-cc/bluemonday#Policy.AllowStandardURLs) is now called for the repository description policy, which ensures that URIs in anchor elements are `mailto:`, `http://` or `https://` and thereby disallowing the `javascript:` URI. - - - - -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4835) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4848)): Do not include trailing EOL character when counting lines - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4836) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4847)): Add background to reactions on hover - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4806) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4807)): Prevent uppercase in header of dashboard context selector - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4754) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4756)): Fix page layout in admin settings -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4896) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4901)): disallow javascript: URI in the repository description - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4852) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4865)): Ensure all filters are persistent in issue filters - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4828) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4840)): Allow 4 character SHA in `/src/commit` -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4668) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4881)): i18n: backport of #4668 and #4783 to v8 - diff --git a/release-notes-published/8.0.2.md b/release-notes-published/8.0.2.md deleted file mode 100644 index 52f0783ad1..0000000000 --- a/release-notes-published/8.0.2.md +++ /dev/null @@ -1,24 +0,0 @@ -This is a security release. See the documentation for more information on the [upgrade procedure](https://forgejo.org/docs/v8.0/admin/upgrade/). - -- Security - [The scope of application tokens was not verified](https://codeberg.org/forgejo/forgejo/pulls/5149) when writing containers or Conan packages. This is of no consequence when the user associated with the application token does not have write access to packages. If the user has write access to packages, such a token can be used to write containers and Conan packages. An application token that was used to write containers or Conan packages without the `package:write` scope will now fail with an unauthorized error. It must be re-created to include the `package:write` scope. - - - - -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5029) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5032)): Overflow for images on project cards. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4798) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4919)): Allow unreacting from comment popover. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5149) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5151)): The scope of application tokens is not verified when writing containers or Conan packages. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5065) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5080)): When a Forgejo Actions workflow includes a `workflow_dispatch` with `inputs` and other events (for instance `push`), it is silently ignored because of a parsing error. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5053): Automerge on AGit pull requests is ignored. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): [commit](https://codeberg.org/forgejo/forgejo/commit/7f1db1df3ee8d620f997b8e70a40c2f48ae96c0f) Show lock owner instead of repo owner on LFS setting page. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): [commit](https://codeberg.org/forgejo/forgejo/commit/ebfdc659d814561f8783094e2eb26738a5500e55) Render plain text file if the LFS object doesn't exist. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): [commit](https://codeberg.org/forgejo/forgejo/commit/9e066c3cad7bb1b30e2def34bd0608aac825cf58) Panic of ssh public key page after deletion of an auth source. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4998) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5050)): [commit](https://codeberg.org/forgejo/forgejo/commit/a8e25e907c66140961f28ba92403176c816dfb60) Add missing repository type filter parameters to pager. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4907) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4965)): Reverted a change from Gitea which prevented allow/reject reviews on merged or closed PRs. This change was not considered by the Forgejo UI team and there is a consensus that it feels like a regression, since it interferes with workflows known to be used by Forgejo users without providing a tangible benefit. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4885) ([backported](https://codeberg.org/forgejo/forgejo/pulls/4951)): Run full PR checks on AGit push. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4984) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5116)): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4889) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5114)): i18n: update of translations from Codeberg Translate diff --git a/release-notes-published/8.0.3.md b/release-notes-published/8.0.3.md deleted file mode 100644 index 5dea61f08a..0000000000 --- a/release-notes-published/8.0.3.md +++ /dev/null @@ -1,10 +0,0 @@ - - - -- Security - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5244) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5247)): replace v-html with v-text in branch search inputbox for XSS protection - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5202): Upgrade [webpack to v5.94.0](https://github.com/webpack/webpack/releases/tag/v5.94.0) as a precaution to mitigate [CVE-2024-43788](https://github.com/advisories/GHSA-4vvj-4cpr-p986), although we were not yet able to confirm that this can be exploited in Forgejo. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5182) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5230)): i18n: update of translations from Codeberg Translate - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5070) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5161)): i18n: update of translations from Codeberg Translate - diff --git a/release-notes-published/9.0.0.md b/release-notes-published/9.0.0.md deleted file mode 100644 index 9fca889b79..0000000000 --- a/release-notes-published/9.0.0.md +++ /dev/null @@ -1,114 +0,0 @@ -A [companion blog post](https://forgejo.org/2024-10-release-v9-0/) provides additional context on this major release. - - - - -- Breaking changes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4724): OIDC integrations that POST to `/login/oauth/introspect` without sending HTTP basic authentication will now fail with a 401 HTTP Unauthorized error. To fix the error, the client must begin sending HTTP basic authentication with a valid client ID and secret. This endpoint was previously authenticated via the introspection token itself, which is less secure. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5515) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5526)): **Fixing this bug is a breaking change because existing tokens with a public scope will no longer return private resources. They have to be deleted and re-created without the public scope to restore their original behavior**. The public scope of an application token does not filter out private repositories, organizations or packages in some cases. This scope is not the default, it has to be manually set via the web UI or the API. When the public scope is explicitly added to an application token that is allowed to list the repositories and packages of a user or an organization, it is meant as a restriction. For instance if a user has two repositories, one private and the other publicly visible, a token with the public scope used with the API endpoint listing the repositories that belong to this user must only return the publicly visible one and not reveal the existence of the private one. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4941): Drop support to build Forgejo with the optional go-git Git backend. It only affects users who built Forgejo manually using `TAGS=gogits`, which no longer has any effect. Moving forward, we only support the default backend using the git binary. Please get in touch if you used the go-git backend and require any assistance moving away from it. -- User Interface features - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5286): Set created_by as the default filter for /issues and /pulls. - Note that this also affects /org/*/pulls and /org/*/issues, but for them this default might be reverted back in the future releases. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5270): Set fuzzy as default for issue search. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5214): Improve commit graph layout. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): mermaid: [Add support for iconify icons](https://github.com/mermaid-js/mermaid/pull/5793). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): mermaid: [Allow multi-line relationship labels](https://github.com/mermaid-js/mermaid/pull/5711). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5205): mermaid: [Adds architecture diagrams which allows users to show relations between services](https://github.com/mermaid-js/mermaid/pull/5452). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5110): Improve diffs generated by Forgejo. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5002): Add `rel="nofollow"` to in-list labels. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4782): Distinguish between new tags, releases and pre-releases on activity page. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4749): Highlighted code search results. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4710): Refactor repo migration items. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4697): Add package counter to repo/user/org overview pages. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4571): Replace `vue-bar-graph` with `chart.js`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4541): Add more emoji and code block rendering in issues. -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5261): Bad spacing on new release page. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5180): Milestone assignment in new issue. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4928): git-grep: ensure bounded default for MatchesPerFile. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4597): Incorrect go to citation button. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4538): Incorrect HTMX support for profile card. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4490): Accessibility keyboard support for test actions. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4455): Update pull request icons. -- Features - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5482) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5524)): "Assign to me" button on PR and Issues. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5351) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5407)): Add architecture-specific removal support for arch package. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): [commit](https://codeberg.org/forgejo/forgejo/commit/9d3473119893ffde0ab36d98e7a0e41c5d0ba9a3) Add bin to Composer Metadata. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5383): Internationalization user experience improvements on team permissions and issue closing. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): [commit](https://codeberg.org/forgejo/forgejo/commit/2da0ebbd2314f12b287694c378a888311dd337bc) Support allowed hosts for migrations to work with proxy. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5125): Trivial default quota configuration. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5120): Language detection in the repository learned about the following languages: [Luau](https://github.com/github-linguist/linguist/pull/6612), [BQN](https://github.com/github-linguist/linguist/pull/6623), [Cron table](https://github.com/github-linguist/linguist/pull/6759), [NMODL](https://github.com/github-linguist/linguist/pull/6776), [Pkl](https://github.com/github-linguist/linguist/pull/6730), [templ](https://github.com/github-linguist/linguist/pull/6798), [FIRRTL](https://github.com/github-linguist/linguist/pull/6848), [Julia REPL](https://github.com/github-linguist/linguist/pull/6859), [Caddyfile](https://github.com/github-linguist/linguist/pull/6862). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5120): The following extensions or filenames in a repository are associated with the matching language: [.sublime-color-scheme](https://github.com/github-linguist/linguist/pull/6758), [MODULE.bazel.lock](https://github.com/github-linguist/linguist/pull/6783), [Cargo.toml.orig](https://github.com/github-linguist/linguist/pull/6787), [tsx](https://github.com/github-linguist/linguist/pull/6788), [justfile](https://github.com/github-linguist/linguist/pull/6795), [.zig.zon](https://github.com/github-linguist/linguist/pull/6820), [.envrc](https://github.com/github-linguist/linguist/pull/6865). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5090): Remove support for Couchbase as a session provider; it instead will now fallback to the file provider. The rationale for removing Couchbase support is that it's not free software, https://www.couchbase.com/blog/couchbase-adopts-bsl-license/, and therefore cannot be tested in Forgejo and neither should be supported. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4967): git-grep: allow searching for words with initial dashes. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4927): git-grep: skip binary files. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4924): [commit](https://codeberg.org/forgejo/forgejo/commit/bf7373a2520ae56a1dc00416efa02de9749b63d3) Forgejo Actions logs are compressed by default. It can be disabled by setting `[actions].LOG_COMPRESSION=none`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4903): Support grouping by any path for arch package. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4891): Remove expensive nearest branch calculatations (`$.BranchName`) from commit diff view (`/:owner/:repo/commit/:commit`). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4819): Allow push mirrors to use a SSH key as the authentication method for the mirroring action instead of using user:password authentication. The SSH keypair is created by Forgejo and the destination repository must be configured with the public key to allow for push over SSH. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/11b6253e7532ba11dee8bc31d4c262b102674a4d) Use UTC as a timezone when running scheduled actions tasks. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/feb43b2584b7f64ec7f9952af2b50b2210e6e6cf) The actions logs older than `[actions].LOG_RETENTION_DAYS` days are removed (the default is 365). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4780): Add signature support for the RPM module. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4766): Allow color and background-color style properties for table cells. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): [commit](https://codeberg.org/forgejo/forgejo/commit/8d23433dab08fcbb8043e5d239171fba59c53108): support pull_request_target event for commit status. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): [commit](https://codeberg.org/forgejo/forgejo/commit/cb9071bbf433715f0e16e39cb60126b65f8236a0): support delete user email in admin panel. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4704): Notify owner about TOTP enrollment. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4635): Email notifications are now sent when account security changes are made: password changed, primary email changed (email sent to old primary mail), TOTP disabled or a security key removed. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4633): Enable `INVALIDATE_REFRESH_TOKENS`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4625): Sort milestones by name by default instead of the due date. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): [commit](https://codeberg.org/forgejo/forgejo/commit/21fdd28f084e7f1aef309c9ebd7599ffa6986453) allow synchronizing user status from OAuth2 login providers. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): [commit](https://codeberg.org/forgejo/forgejo/commit/004cc6dc0ab7cc9c324ccb4ecd420c6aeeb20500) add option to change mail from user display name. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4607): [commit](https://codeberg.org/forgejo/forgejo/commit/d0227c236aa195bd03990210f968b8e52eb20b79) issue Templates: add option to have dropdown printed list. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4605): the default setting attachment.ALLOWED_TYPES was adjusted to allow .webp attachments in issues - a more efficient format for images like screenshots. All attachments are treated as normal files and are not re-encoded by Forgejo. If you have customized this setting, you may also want to add .webp to it for the benefit of your users, as well as to reduce server traffic and storage usage. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4542): Convert milestone to HTMX. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4516): Use the full user name in emails to address the recipient, when available. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4449): Enhancing OAuth2 Provider with Granular Scopes for Resource Access. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4429): [Display URLs in .sh-session files](https://github.com/buildkite/terminal-to-html/pull/163). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4367): The caching of contributor stats was improved (the data used by `///activity/recent-commits`) to use the configured cache TTL from the config (`[cache].ITEM_TTL`) instead of a hardcoded TTL of ten minutes. The computation of this operation is computationally heavy and makes a lot of requests to the database and Git on repositories with a lot of commits. It should be cached for longer than what was previously hardcoded, ten minutes. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4266): Add support for LFS server implementations which have batch API responses in an older/deprecated schema. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4218): [Forgejo Actions artifacts](https://forgejo.org/docs/next/user/actions/#artifacts) support [range requests](https://en.wikipedia.org/wiki/Byte_serving) to resume a download. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4212): Added the foundations of a flexible, configurable quota system. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/2869): Logs journald integration. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/1445): A release asset can be a URL instead of a file. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5529) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5565)): Don't allow owner team with incorrect unit access (includes doctor fix). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5470) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5547)): Schedule workflows are canceled when pushing to the default branch. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5492) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5507)): Incorrect Discord webhook JSON for issue events. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): [commit](https://codeberg.org/forgejo/forgejo/commit/f709de24039ab7e605d3e09e3b61240836381603) wrong last modify time. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): [commit](https://codeberg.org/forgejo/forgejo/commit/2675a24649af2fff34f5c7e416d6ff78591d8d9c) Repo Activity: count new issues that were closed. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): [commit](https://codeberg.org/forgejo/forgejo/commit/526054332acb221e061d3900bba2dc6e012da52d) incorrect /tokens API. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5372) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5406)): [commit](https://codeberg.org/forgejo/forgejo/commit/0cafec4c7a2faf810953e9d522faf5dc019e1522) Do not escape relative path in RPM primary index. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): [commit](https://codeberg.org/forgejo/forgejo/commit/eb765dabfd43e353bd2208e8375b102935d0f103) Handle invalid target when creating releases using API. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5325): [commit](https://codeberg.org/forgejo/forgejo/commit/5af168fb92e5dd3b0c81d97ba27a6f19739bef18) /repos/{owner}/{repo}/pulls/{index}/files endpoint not populating previous_filename. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5269): Improve textarea paste. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5195): [commit](https://codeberg.org/forgejo/forgejo/commit/196907e359420f63003f884d1cf827b4a4d7a4e5) Handle "close" actionable references for manual merges. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5195): [commit](https://codeberg.org/forgejo/forgejo/commit/46b1f2e7e4e795331f28f74666094c9416499e03) Team admins are allowed to search team members via the API. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5109): [commit](https://codeberg.org/forgejo/forgejo/commit/3ade4d9b2bfa6ae84a1ded932907a53060565575) Don't return 500 if mirror url contains special chars. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5109): [commit](https://codeberg.org/forgejo/forgejo/commit/dda53569b1b70507469fc296881eec89606ab9c3) Agit automerge is not working properly. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5075): Improve the display of PR & issue short links. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4978): Migrate scoped GitLab labels as scoped Forgejo labels. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4924): [commit](https://codeberg.org/forgejo/forgejo/commit/9812b7af91b69386c5d4c08982aece7bd8f9a174) /repos/{owner}/{repo}/pulls/{index} [requested_reviewers contains null for teams](https://codeberg.org/forgejo/forgejo/issues/4108). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4809): Validate title length when updating an issue. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/0dbc6230286e113accbc6d5e829ce8dae1d1f5d4) Hide the "Details" link of commit status when the user cannot access actions. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/6e63afe31f43eaf5ff7c8595ddeaf8515c2dc0c0) The API endpoint to get the actions registration token is GET /repos/{owner}/{repo}/actions/runners/registration-token and not GET /repos/{owner}/{repo}/runners/registration-token. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/6e63afe31f43eaf5ff7c8595ddeaf8515c2dc0c0) Runner registration token via API is broken for repo level runners. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/c784a5874066ca1a1fd518408d5767b4eb57bd69) Deleted projects causes bad popover text on issues. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/42bb51af9b8283071e15ac6470ada9824d87cd40) Distinguish LFS object errors to ignore missing objects during migration. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/6328f648decc2754ef10ee5ca6ca9785a156614c) When viewing the revision history of wiki pages, the pagination links are broken: instead of org/repo/wiki/Page?action=_revision&page=2, the link is only org/repo/wiki/Page?page=2, thus bringing the user back to the wiki page. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4801): [commit](https://codeberg.org/forgejo/forgejo/commit/2310556158d70bf1dbfca96dc928e1be3d3f41be) Also rename the head branch of open pull requests when renaming a branch. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): [commit](https://codeberg.org/forgejo/forgejo/commit/ee11a263f8c9de33d42fc117443f4054a311c875): add return type to GetRawFileOrLFS and GetRawFile. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4716): [commit](https://codeberg.org/forgejo/forgejo/commit/f61873c7e42b613405d367421ad19db80f831053): properly filter issue list given no assignees filter. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4698): Cron task to cleanup dangling container images with version sha256:*. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4619): Allow updates to runners' secrets. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4487): Do not fire webhook notifications for updates and deletions of comments that are part of an ongoing review (a review that is still in draft). Also, content history will not be saved for such comments, to avoid exposing fixing embarrassing typos you've have made while the review was still pending. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4427): Fixed social media previews for links to wiki pages. -- Localization - - Updates of translations from [Codeberg Translate](https://translate.codeberg.org/projects/forgejo/forgejo/). - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4980): Improve the clarity of confirmation in email messages. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5523) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5534)): Fine tune language for units. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5537) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5538)): Improve translation strings for webhook events. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4829): Allow different translations of creation links and titles. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4599): English strings improvements for internationalization. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/4596): Encourage participation in the localization of Forgejo in language settings. - diff --git a/release-notes-published/9.0.1.md b/release-notes-published/9.0.1.md deleted file mode 100644 index 1cd9a56170..0000000000 --- a/release-notes-published/9.0.1.md +++ /dev/null @@ -1,33 +0,0 @@ - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5719) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5724)): Forgejo generates a token which is used to authenticate web endpoints that are only meant to be used internally, for instance when the SSH daemon is used to push a commit with Git. The verification of this token was not done in constant time and was susceptible to [timing attacks](https://en.wikipedia.org/wiki/Timing_attack). A pre-condition for such an attack is the precise measurements of the time for each operation. Since it requires observing the timing of network operations, the issue is mitigated when a Forgejo instance is accessed over the internet because the ISP introduce unpredictable random delays. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5718) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5721)): Because of a missing permission check, the branch used to propose a pull request to a repository can always be deleted by the user performing the merge. It was fixed so that such a deletion is only allowed if the user performing the merge has write permission to the repository from which the pull request was made. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5439) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5708)): Fix boolean inputs in workflow_dispatch - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5634) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5636)): package arch database not updating when uploading "any" architecture - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5627) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5631)): correct SQL query for active issues - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5626) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5629)): specify default value for `EXPLORE_DEFAULT_SORT`. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5613) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5624)): fix: Add `recentupdated` as recognized sort option - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5616): Update dependency mermaid to v11.3.0 (v9.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5587) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5588)): Dockerfile: use alpine:3.20 instead of golang:1.23-alpine3.20 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5585) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5586)): Dockerfile: unnecessary container image layer duplication - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5647): [commit](https://codeberg.org/forgejo/forgejo/commit/1913399d8176944f170d4f1c032dc37003aaafc0) Always update expiration time when creating an artifact - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5647): [commit](https://codeberg.org/forgejo/forgejo/commit/4fe311e7c0292e3ac79f8bc063f1bcacef4494f0) Update scheduled tasks even if changes are pushed by "ActionsUser" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5715): [commit](https://codeberg.org/forgejo/forgejo/commit/768402c8841db5e8acc97919149ba329d5124e17) Fix disable 2fa bug -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5583) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5680)): i18n: update of translations from Codeberg Translate -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5702) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5710)): fix: use buffered iterate for debian searchpackages - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5688) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5691)): fix: make branch protection work for new branches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5651) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5656)): link to security policy in security.txt - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5653) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5655)): fix: don't show truncated comments in RSS/Atom feeds - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5652) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5654)): fix: typo on releases for source code downloads - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5640) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5645)): Revert "add gap between branch dropdown and PR button" - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5615) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5618)): fix: Don't double escape delete branch text - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5595) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5596)): fix: Add server logging for OAuth server errors - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5592) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5594)): forgejo-cli is now a symlink and cannot be used for sanity checks - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5491) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5575)): fix: correct documentation for non 200 responses in swagger - diff --git a/release-notes-published/9.0.2.md b/release-notes-published/9.0.2.md deleted file mode 100644 index 4a10e4981c..0000000000 --- a/release-notes-published/9.0.2.md +++ /dev/null @@ -1,26 +0,0 @@ - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/1ce33aa38d1d258d14523ff2c7c2dbf339f22b74) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/061abe60045212acf8c3f5c49b5cc758b4cbcde9) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/3e3ef76808100cb1c853378733d0f6a910324ac6) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/9508aa7713632ed40124a933d91d5766cf2369c2) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/786dfc7fb81ee76d4292ca5fcb33e6ea7bdccc29) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/e6bbecb02d47730d3cc630d419fe27ef2fb5cb39) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/7067cc7da4f144cc8a2fd2ae6e5307e0465ace7f) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5974) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5975)): [commit](https://codeberg.org/forgejo/forgejo/commit/b70196653f9d7d3b9d4e72d114e5cc6f472988c4) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors. -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5941) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5945)): fix: handle renamed dependency for cargo registry. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5795) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5800)): support `www.github.com` for migrations. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5887): move forgot_password-link to fix login tab order. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5850) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5879)): code owners will not be mentioned when a pull request comes from a forked repository. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5831) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5834)): labels are missing in the pull request payload removing a label. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): in a Forgejo Actions workflow, the `unlabeled` event type for pull requests was incorrectly mapped to the labeled event type. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): when a Forgejo Actions issue or pull request workflow is triggered by an `labeled` or `unlabeled` event type, it misses information about the label added or removed. It is now available in the `label` data member of the event payload. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5778) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5810)): the pull request workflow must always update the head SHA commit status. Not just when the PR is synchronized, opened or closed. Otherwise, a job that is run more often than on commits (e.g. checking for specific labels or approvals) cannot be defined as a required check. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5746) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5759)): fix git-grep for code search when git version is below 2.38. -- Localization - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5681) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5748)): i18n: update of translations from Codeberg Translate. - diff --git a/release-notes-published/9.0.3.md b/release-notes-published/9.0.3.md deleted file mode 100644 index 06ab9f152a..0000000000 --- a/release-notes-published/9.0.3.md +++ /dev/null @@ -1,39 +0,0 @@ - - - - -## Release notes - -- Security bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6248) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6253)): When Forgejo is configured to run the internal ssh server with `[server].START_SSH_SERVER=true`, it was possible for a registered user to impersonate another user. The rootless container image uses the internal ssh server by default and was vulnerable. A Forgejo instance running from a binary or from a root container image does not use the internal ssh server by default and was not vulnerable. The incorrect use of the crypto package is the root cause of the vulnerability and was fixed for the internal ssh server. - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6249) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6251)): Revert "allow synchronizing user status from OAuth2 login providers" -- User Interface bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6104): Fix wiki search overflowing on wide screens (#6047) -- Bug fixes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6097) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6168)): Do not rewrite ssh keys files when deleting a user without one - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6124) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6129)): fix: doctor fails with pq: syntax error at or near "." whilst counting Authorization token without existing User - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6054) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6057)): fix: Do not delete global Oauth2 applications -- Other changes without a feature or bug label - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6064): [gitea] week 2024-48-v9.0 cherry pick (gitea/main -> v9.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5998): [commit](https://codeberg.org/forgejo/forgejo/commit/53c546951115d9e269a2778f90e43b0cb413eab6) Strict matching of allowed content for sanitizer for asciicast and csv rendering -- Included for completeness but not worth a release note - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6247): Update module golang.org/x/crypto to v0.31.0 (v9.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6223) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6231)): chore(ci): set the milestone when a pull request is closed (take 4) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6219) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6225)): chore(ci): set the milestone when a pull request is open (take 3) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6211) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6217)): chore(ci): set the milestone when a pull request is open - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6176): Update dependency @github/relative-time-element to v4.4.4 (v9.0/forgejo) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6152) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6155)): fix: remove softbreak from github legacy callout - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6144) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6149)): fix: correct permission loading for limited organisation - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6128) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6131)): fix: clean up log files that no longer exist - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6114) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6127)): fix: return correct type in `GetSubModule` - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6050) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6092)): Improve Swagger documentation for user endpoints - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6084) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6085)): fix: normalize guessed languages from enry - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6052) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6070)): Show page titles in wiki search results (#6048) - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6060): i18n: backport of translation updates 5754, 5845, 5960 - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6034) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6035)): chore(ci): remove unused experimental DNS updates - - [PR](https://codeberg.org/forgejo/forgejo/pulls/6013) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6016)): fix(test): TestGitAttributeCheckerError must allow broken pipe - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5996) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6005)): fix: check read permissions for code owner review requests - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5989) ([backported](https://codeberg.org/forgejo/forgejo/pulls/6004)): fix: use better code to group UID and stopwatches - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5991) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5993)): fix: api repo compare with commit hashes - - [PR](https://codeberg.org/forgejo/forgejo/pulls/5986) ([backported](https://codeberg.org/forgejo/forgejo/pulls/5992)): bug: correctly generate oauth2 jwt signing key - diff --git a/release-notes-published/up-to-and-including-8.0.0.md b/release-notes-published/up-to-and-including-8.0.0.md deleted file mode 120000 index a2fdedd0e1..0000000000 --- a/release-notes-published/up-to-and-including-8.0.0.md +++ /dev/null @@ -1 +0,0 @@ -../RELEASE-NOTES.md \ No newline at end of file diff --git a/release-notes/4125.md b/release-notes/4125.md deleted file mode 100644 index 4e1e401285..0000000000 --- a/release-notes/4125.md +++ /dev/null @@ -1 +0,0 @@ -Added link to show all Issues/PullRequests diff --git a/release-notes/5416.md b/release-notes/5416.md deleted file mode 100644 index 1368b952ae..0000000000 --- a/release-notes/5416.md +++ /dev/null @@ -1,3 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/8178d6eaba64d05799fd3b62fa889bd13bee07c7) Code search results when using the bleve indexer are sorted by relevance. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/b496317b5a2aea970bc94ccf6fcde35cd417ec20) After migrating a repository that contains merged pull requests, the branch is missing and cannot be deleted. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/a226064711899da07d6b1455a68ef758f2f3e7e0) Forgejo Actions artifact v4 upload above 8MB. diff --git a/release-notes/5418.md b/release-notes/5418.md new file mode 100644 index 0000000000..729f4a4f88 --- /dev/null +++ b/release-notes/5418.md @@ -0,0 +1,2 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/0a0a3cea1b54d9cd7c95faf9318f6c3cdf1469a9) After migrating a repository that contains merged pull requests, the branch is missing and cannot be deleted. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/14c7055494b995476d9d2ec1948784bf36dd9e4d) Forgejo Actions artifact v4 upload above 8MB. diff --git a/release-notes/5459.md b/release-notes/5459.md deleted file mode 100644 index fb1c5b873c..0000000000 --- a/release-notes/5459.md +++ /dev/null @@ -1 +0,0 @@ -feat: New mermaid [flowchart shapes](https://mermaid.js.org/syntax/flowchart.html#complete-list-of-new-shapes). diff --git a/release-notes/5477.md b/release-notes/5477.md deleted file mode 100644 index 3f735e043f..0000000000 --- a/release-notes/5477.md +++ /dev/null @@ -1,3 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/af901ac7bb03d27f175f2292581fc67fa9c8d567) Add support for searching users by email. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/1dfe58ad11bc6fdc73a2b5ffb3c1481fbddbf46b) PR creation on forked repositories. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/b67b7c12385059898fc8cb7997755a88b3afa483) the logic of finding the latest pull review commit ID is incorrect. diff --git a/release-notes/5480.md b/release-notes/5480.md new file mode 100644 index 0000000000..5623c0ddc7 --- /dev/null +++ b/release-notes/5480.md @@ -0,0 +1,2 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/7d3a013e5e81bbc054f4a730923e08f61814bf66) PR creation on forked repositories. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/700e9f027bce8c783b74de07b3f29e09be045fa7) the logic of finding the latest pull review commit ID is incorrect. diff --git a/release-notes/5515.md b/release-notes/5515.md deleted file mode 100644 index 46671195e1..0000000000 --- a/release-notes/5515.md +++ /dev/null @@ -1 +0,0 @@ -**Fixing this bug is a breaking change because existing tokens with a public scope will no longer return private resources. They have to be deleted and re-created without the public scope to restore their original behavior**. The public scope of an application token does not filter out private repositories, organizations or packages in some cases. This scope is not the default, it has to be manually set via the web UI or the API. When the public scope is explicitly added to an application token that is allowed to list the repositories and packages of a user or an organization, it is meant as a restriction. For instance if a user has two repositories, one private and the other publicly visible, a token with the public scope used with the API endpoint listing the repositories that belong to this user must only return the publicly visible one and not reveal the existence of the private one. diff --git a/release-notes/5543.md b/release-notes/5543.md deleted file mode 100644 index 5218deddc5..0000000000 --- a/release-notes/5543.md +++ /dev/null @@ -1 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/d0af8fe4dc7b294fe5409b2271468494267d5a7d) Allow filtering pull requests by poster in the API. diff --git a/release-notes/5601.md b/release-notes/5601.md deleted file mode 100644 index 9a186e880f..0000000000 --- a/release-notes/5601.md +++ /dev/null @@ -1,2 +0,0 @@ -feat: Language detection in the repository learned about the following languages: [Java Template Engine](https://github.com/github-linguist/linguist/pull/6610), [Noir](https://github.com/github-linguist/linguist/pull/6432), [Cylc](https://github.com/github-linguist/linguist/pull/6832), [iCalendar](https://github.com/github-linguist/linguist/pull/6940), [vCard (aka. VCF: Virtual Contact File) and Variant Call Format (VCF)](https://github.com/github-linguist/linguist/pull/6941), [B4X](https://github.com/github-linguist/linguist/pull/6965), [Carbon](https://github.com/github-linguist/linguist/pull/7011), [LiveCode Script](https://github.com/github-linguist/linguist/pull/6833), [Dune (OCaml build system)](https://github.com/github-linguist/linguist/pull/6814). -feat: The following extensions or filenames in a repository are associated with the matching language: [deno.lock](https://github.com/github-linguist/linguist/pull/6885), [uv.lock](https://github.com/github-linguist/linguist/pull/7006), [HOSTS.TXT](https://github.com/github-linguist/linguist/pull/7014), [.peggy](https://github.com/github-linguist/linguist/pull/7017), [.resource](https://github.com/github-linguist/linguist/pull/6500). diff --git a/release-notes/5621.md b/release-notes/5621.md deleted file mode 100644 index 973c6f880d..0000000000 --- a/release-notes/5621.md +++ /dev/null @@ -1,5 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/f3f386545ee97b91f1aaac4142480e70a443c655) Always update expiration time when creating an artifact, so that artifacts from re-ran jobs do not get lost. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/c163bf6fb55c922ab0cf552b47475fc8fc8b99d9) Remove the button toolbar when deleting a diff comment. -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/c3741d7fb0114691da73f00ae0ac9dced87e884d) The `requested_reviewers` data is included in more webhook events. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/e8700cee612f0aa769dc6929772d9b04c6c21807) Run scheduled tasks against the latest commit. -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/89446e60a6e7ec3441f0c480164c09851ae54ce7) Support migrating GitHub/GitLab PR draft status. diff --git a/release-notes/5647.md b/release-notes/5647.md new file mode 100644 index 0000000000..5341a0d690 --- /dev/null +++ b/release-notes/5647.md @@ -0,0 +1,2 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/1913399d8176944f170d4f1c032dc37003aaafc0) Always update expiration time when creating an artifact +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/4fe311e7c0292e3ac79f8bc063f1bcacef4494f0) Update scheduled tasks even if changes are pushed by "ActionsUser" diff --git a/release-notes/5677.md b/release-notes/5677.md deleted file mode 100644 index d089cbf01a..0000000000 --- a/release-notes/5677.md +++ /dev/null @@ -1 +0,0 @@ -If you select a portion of a comment and use the 'Quote reply' feature in the context menu, only that portion will be quoted. The markdown syntax is preserved. diff --git a/release-notes/5714.md b/release-notes/5714.md deleted file mode 100644 index 968ad8bb51..0000000000 --- a/release-notes/5714.md +++ /dev/null @@ -1,3 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/d13a4ab5632d6a9697bd0907f9c69ed57d949340) Fixed a bug related to disabling two-factor authentication -chore: [commit](https://codeberg.org/forgejo/forgejo/commit/ab26d880932dbc116c43ea277029984c7a6d4e94) Emit a log message when failing to delete an inactive user -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/ab660c5944d59cdb4ecc071401445ac9f53cee45) Add `DISABLE_ORGANIZATIONS_PAGE` and `DISABLE_CODE_PAGE` settings for explore pages diff --git a/release-notes/5715.md b/release-notes/5715.md new file mode 100644 index 0000000000..fa8a2cc533 --- /dev/null +++ b/release-notes/5715.md @@ -0,0 +1 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/768402c8841db5e8acc97919149ba329d5124e17) Fix disable 2fa bug diff --git a/release-notes/5751.md b/release-notes/5751.md deleted file mode 100644 index b9666b7282..0000000000 --- a/release-notes/5751.md +++ /dev/null @@ -1,2 +0,0 @@ -feat: mermaid: [Add the Kanban board diagram type](https://github.com/mermaid-js/mermaid/pull/5999). -feat: mermaid: [Class diagram includes a new "classBox" shape, classDef statement, support for styling the default class and lollipop interfaces](https://github.com/mermaid-js/mermaid/pull/5880). diff --git a/release-notes/5789.md b/release-notes/5789.md deleted file mode 100644 index 0c0763a46e..0000000000 --- a/release-notes/5789.md +++ /dev/null @@ -1,6 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/362ad0ba39bdbc87202e349678e21fc2a75ff7cb) Update force-pushed tags too when syncing mirrors -chore: [commit](https://codeberg.org/forgejo/forgejo/commit/b308bcca7c950b7f0d127ee4282019c2a9923299) Improved diff view performance -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/4c5bdddf7751a35985c08ba6506f1f30103749d6) Fix `missing signature key` error when pulling Docker images with `SERVE_DIRECT` enabled -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/2c5fdb108ff9e23e8f907fb6afe59177c6bb202e) Fix the missing menu in organization project view page -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/1e595979625e54d375a0eaa440b84ef5e17af160) Add new [lfs_client].BATCH_SIZE and [server].LFS_MAX_BATCH_SIZE config settings. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/2358c0d899faec8311e46dcb0550041496bcd532) Properly clean temporary index files diff --git a/release-notes/5974.md b/release-notes/5975.md similarity index 66% rename from release-notes/5974.md rename to release-notes/5975.md index 2f78d4733f..1cab8fd90c 100644 --- a/release-notes/5974.md +++ b/release-notes/5975.md @@ -1,8 +1,8 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/1ce33aa38d1d258d14523ff2c7c2dbf339f22b74) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/061abe60045212acf8c3f5c49b5cc758b4cbcde9) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/3e3ef76808100cb1c853378733d0f6a910324ac6) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/9508aa7713632ed40124a933d91d5766cf2369c2) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/786dfc7fb81ee76d4292ca5fcb33e6ea7bdccc29) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/e6bbecb02d47730d3cc630d419fe27ef2fb5cb39) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/7067cc7da4f144cc8a2fd2ae6e5307e0465ace7f) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases. -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/b70196653f9d7d3b9d4e72d114e5cc6f472988c4) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/177011717848d3847d1432f22c9285def2595947) it was possible to use a token sent via email for secondary email validation to reset the password instead. In other words, a token sent for a given action (registration, password reset or secondary email validation) could be used to perform a different action. It is no longer possible to use a token for an action that is different from its original purpose. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/36300be94eca5ffcd9f64fac5e761c21ba94ff57) a fork of a public repository would show in the list of forks, even if its owner was not a public user or organization. Such a fork is now hidden from the list of forks of the public repository. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/6c75d1a5045c667bf5879deef71a101abf4ce550) the members of an organization team with read access to a repository (e.g. to read issues) but no read access to the code could read the RSS or atom feeds which include the commit activity. Reading the RSS or atom feeds is now denied unless the team has read permissions on the code. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/1379914c45680d41b17b451238fed6c1813196aa) the tokens used when [replying by email to issues or pull requests](https://forgejo.org/docs/v9.0/user/incoming/) were weaker than the [rfc2104 recommendations](https://datatracker.ietf.org/doc/html/rfc2104#section-5). The tokens are now truncated to 128 bits instead of 80 bits. It is no longer possible to reply to emails sent before the upgrade because the weaker tokens are invalid. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/c8c8377acbab41083f1b92e836a9bde15e29e362) a registered user could modify the update frequency of any push mirror (e.g. every 4h instead of every 8h). They are now only able to do that if they have administrative permissions on the repository. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/42f36444098a604c5bf80cf3b904e88ef260f36e) it was possible to use basic authorization (i.e. user:password) for requests to the API even when security keys were enrolled for a user. It is no longer possible, an application token must be used instead. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/254bded75e1a3f5f6b8babcb84d99b87e83483ce) some markup sanitation rules were not as strong as they could be (e.g. allowing `emoji somethingelse` as well as `emoji`). The rules are now stricter and do not allow for such cases. +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/a88e3e6ac0c75ccb08028b3f5b3523ff668a41f3) when Forgejo is configured to enable instance wide search (e.g. with [bleve](https://blevesearch.com/)), results found in the repositories of private or limited users were displayed to anonymous visitors. The results found in private or limited organizations were not displayed. The search results found in the repositories of private or limited user are no longer displayed to anonymous visitors. diff --git a/release-notes/5988.md b/release-notes/5988.md deleted file mode 100644 index 52add6347e..0000000000 --- a/release-notes/5988.md +++ /dev/null @@ -1 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/fc26becba4b08877a726f2e7e453992310245fe5) when a tag was removed and a release existed for that tag, it would be broken. The release is no longer broken the tag can be added again. diff --git a/release-notes/5997.md b/release-notes/5997.md deleted file mode 100644 index 9597da9e79..0000000000 --- a/release-notes/5997.md +++ /dev/null @@ -1,8 +0,0 @@ -fix(security): [commit](https://codeberg.org/forgejo/forgejo/commit/45435a8789f8ff69603799a9031246d2d621d139) Fix and refactor markdown rendering -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/a8f2002a9b061ec1092df67c6f05e30aa7d2e2d2) Remove transaction for archive download -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/96ee0f56475204b2bbdc7f2aeb35b1c32eac469c) Fix oauth2 error handle not return immediately -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/c2e8790df37a14b4d2f72c7377db75309e0ebf1d) Trim title before insert/update to database to match the size requirements of database -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/03ab73d92eabaf774278effe3332623b1dc3580a) Fix nil panic if repo doesn't exist -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/56971f9ed90a01fd74a634b7496593e6f62ac260) Disable Oauth check if oauth disabled -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/7f51210672031aee7a790455d51a17ce11a70559) Harden runner updateTask and updateLog api -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/dd3c4d7096cff91854bcc6641f55d9d093e5c86e) Add a doctor check to disable the "Actions" unit for mirrors diff --git a/release-notes/5998.md b/release-notes/5998.md new file mode 100644 index 0000000000..b1b7d56d08 --- /dev/null +++ b/release-notes/5998.md @@ -0,0 +1,4 @@ +fix(security): [commit](https://codeberg.org/forgejo/forgejo/commit/53c546951115d9e269a2778f90e43b0cb413eab6) Fix and refactor markdown rendering +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/6ac04b8c7dcedb9c6d994bb2a8cd37580394d9dd) Fix oauth2 error handle not return immediately +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/9f05c76b7b84f3cfafd4de22f5f18b87e4c79775) Fix nil panic if repo doesn't exist +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/8cec637d08542535d1dc9689c22943cd3ffe1c45) Disable Oauth check if oauth disabled diff --git a/release-notes/6062.md b/release-notes/6062.md deleted file mode 100644 index 7ae7f87548..0000000000 --- a/release-notes/6062.md +++ /dev/null @@ -1,4 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/32a91add34519ef7768ec907888ed837ad0dde2f) Fix GetInactiveUsers -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/64824290912b6300ede2b2f95ff77d55dde9859b) Fix submodule parsing -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/ddabba5f89c4b196daeeb2af17de9ec2cec14b63) allow the actions user to login via the jwt token -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/262c48409b1224e3f6dc63c8d1e04fef0e0cf2c0) Support HTTP POST requests to `/userinfo`, aligning to OpenID Core specification diff --git a/release-notes/6064.md b/release-notes/6064.md new file mode 100644 index 0000000000..c146c8db9e --- /dev/null +++ b/release-notes/6064.md @@ -0,0 +1,3 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/bf520f5184327eea9590ac5eb52d98f16af43c12) Fix GetInactiveUsers +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/1c04f8f10a7ebc02f41af3d2db6a2a4e85127441) Fix submodule parsing +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/48872d11ca920849ec174f76c0d667ca2b289aef) allow the actions user to login via the jwt token diff --git a/release-notes/6110.md b/release-notes/6110.md deleted file mode 100644 index b87ec44882..0000000000 --- a/release-notes/6110.md +++ /dev/null @@ -1 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/3973f1022d57a3134e8f775e1c1cc6d398681bb4) Add github compatible tarball download API endpoints diff --git a/release-notes/6200.md b/release-notes/6200.md deleted file mode 100644 index f7cf8de471..0000000000 --- a/release-notes/6200.md +++ /dev/null @@ -1 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/0786ddc5de37a01d1c3e3bf99b794665341b3c12) Add Swift login endpoint diff --git a/release-notes/6271.md b/release-notes/6271.md deleted file mode 100644 index 4a4821682f..0000000000 --- a/release-notes/6271.md +++ /dev/null @@ -1,4 +0,0 @@ -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/96a7f0a3f065c5db8fdf352c93c8367e24d259de) Fix missing outputs for jobs with matrix -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/2b5c69c451a684b20119e2521dc23734c7869241) Detect whether action view branch was deleted -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/b0d6a7f07bff836190a8e87fe5645d5557893e32) Implement update branch API -fix: [commit](https://codeberg.org/forgejo/forgejo/commit/bf934c96c92d643678ac7a18697b6563bc9d20a5) Add standard-compliant route to serve outdated R packages diff --git a/release-notes/6351.md b/release-notes/6351.md deleted file mode 100644 index b87427724b..0000000000 --- a/release-notes/6351.md +++ /dev/null @@ -1 +0,0 @@ -feat: [Alt Linux Apt-Rpm](https://en.altlinux.org/RPM) repository [support for Forgejo packages](https://forgejo.org/docs/next/user/packages/alt/). \ No newline at end of file diff --git a/release-notes/6445.md b/release-notes/6445.md deleted file mode 100644 index d3755701b2..0000000000 --- a/release-notes/6445.md +++ /dev/null @@ -1 +0,0 @@ -feat: webhook: sourcehut: submit SSH URL for private repository or when pre-filled diff --git a/release-notes/6471.md b/release-notes/6471.md deleted file mode 100644 index 4e70286eee..0000000000 --- a/release-notes/6471.md +++ /dev/null @@ -1 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/76a85d26c8576fc410dc6494f2907ffc2b353c39) Use `Project-URL` metadata field to get a PyPI package's homepage URL diff --git a/release-notes/6523.md b/release-notes/6523.md deleted file mode 100644 index 96a1fe0cf3..0000000000 --- a/release-notes/6523.md +++ /dev/null @@ -1 +0,0 @@ -Reduce noise in the timeline of issues and pull requests. If certain timeline events are performed within a certain timeframe of each other with no other events in between, they will be combined into a single timeline event, and any contradictory actions will be canceled and not displayed. The older the events, the wider the timeframe will become. diff --git a/release-notes/6639.md b/release-notes/6639.md deleted file mode 100644 index 1bc01c12a3..0000000000 --- a/release-notes/6639.md +++ /dev/null @@ -1 +0,0 @@ -Teach the doctor to remove orphaned two_factor with `forgejo doctor check --run check-db-consistency --fix`. Such rows may contain invalid data and [block the migration to v10](https://codeberg.org/forgejo/forgejo/issues/6637) with a message such as `failed: AesDecrypt invalid decrypted base64 string: illegal base64 data at input byte 0`. diff --git a/release-notes/6763.md b/release-notes/6763.md deleted file mode 100644 index cb5ec172c7..0000000000 --- a/release-notes/6763.md +++ /dev/null @@ -1 +0,0 @@ -feat: [commit](https://codeberg.org/forgejo/forgejo/commit/689fb82a7043fdb2fee02195701b0bc728e99709) API endpoint to rename an organization diff --git a/release-notes/7251.md b/release-notes/7251.md deleted file mode 100644 index 9c35603981..0000000000 --- a/release-notes/7251.md +++ /dev/null @@ -1 +0,0 @@ -When migrating from a Forgejo version lower than v10, the TOTP secrets found to be corrupted are now transparently removed from the database instead of failing the migration. 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. diff --git a/renovate.json b/renovate.json index 7ea5e9d6b9..cfd9c397eb 100644 --- a/renovate.json +++ b/renovate.json @@ -8,15 +8,13 @@ ], "baseBranches": [ "$default", - "/^v7\\.\\d+/forgejo$/", - "/^v10\\.\\d+/forgejo$/", - "/^v11\\.\\d+/forgejo$/" + "/^v[7-9]\\.\\d+/forgejo$/", + "/^v\\d\\d+\\.\\d+\\/forgejo$/" ], "postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"], "prConcurrentLimit": 10, "osvVulnerabilityAlerts": true, - "automergeStrategy": "squash", - "labels": ["dependency-upgrade","test/not-needed"], + "labels": ["dependency-upgrade"], "packageRules": [ { "description": "Require approval for python minor version", @@ -58,6 +56,18 @@ "ghcr.io/devcontainers-contrib/features/**" ] }, + { + "description": "Group nodejs packages", + "matchPackageNames": [ + "code.forgejo.org/oci/node", + "docker.io/library/node", + "docker.io/node", + "node" + ], + "groupName": "nodejs packages", + "versionCompatibility": "^(?[^-]+)(?-.*)?$", + "versioning": "node" + }, { "description": "x/tools/* are used in the CI only and upgraded together", "matchUpdateTypes": ["minor", "patch", "digest"], @@ -71,12 +81,6 @@ "matchUpdateTypes": ["minor", "patch"], "groupName": "postcss" }, - { - "description": "Group Forgejo go-chi packages", - "matchUpdateTypes": ["minor", "patch", "digest"], - "matchPackageNames": ["code.forgejo.org/go-chi/**"], - "groupName": "forgejo go-chi packages" - }, { "description": "Split minor and patch updates", "matchPackageNames": [ @@ -98,34 +102,46 @@ "matchUpdateTypes": ["patch"], "automerge": true }, + { + "description": "Automerge renovate updates", + "matchDatasources": ["docker"], + "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"], + "matchUpdateTypes": ["minor", "patch", "digest"], + "automerge": true + }, { "description": "Add reviewer and additional labels to renovate PRs", "matchDatasources": ["docker"], - "matchPackageNames": ["data.forgejo.org/renovate/renovate"], + "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"], "reviewers": ["viceice"], - "addLabels": ["forgejo/ci"] + "addLabels": ["forgejo/ci", "test/not-needed"] + }, + { + "description": "Update renovate with higher prio to come through rate limit", + "matchDatasources": ["docker"], + "matchPackageNames": ["code.forgejo.org/forgejo-contrib/renovate"], + "extends": ["schedule:weekly"], + "prPriority": 10, + "groupName": "renovate" }, { "description": "Disable renovate self-updates for release branches", - "matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"], + "matchBaseBranches": ["^v\\d+\\.\\d+\\/forgejo$"], + "matchDatasources": ["docker"], "matchPackageNames": [ "code.forgejo.org/forgejo-contrib/renovate", - "data.forgejo.org/renovate/renovate", "ghcr.io/visualon/renovate" ], "enabled": false }, { "description": "Automerge some packages when CI succeeds", - "extends": ["packages:linters", "packages:test", "schedule:monthly"], + "extends": ["packages:linters", "packages:test"], "matchPackageNames": [ - "@axe-core/playwright", "@eslint-community/**", "@playwright/**", "@stoplight/spectral-cli", "@stylistic/**", - "@vitejs/plugin-vue", - "@vue/test-utils", "djlint", "github.com/editorconfig-checker/editorconfig-checker/v2/cmd/editorconfig-checker", "github.com/golangci/golangci-lint/cmd/golangci-lint", @@ -137,7 +153,7 @@ "mvdan.cc/gofumpt", "updates", "vite-string-plugin", - "yamllint" + "@vue/test-utils" ], "automerge": true }, @@ -146,6 +162,11 @@ "matchPackageNames": ["monaco-editor"], "minimumReleaseAge": "30 days" }, + { + "description": "disallow `eslint-plugin-no-use-extend-native` v0.6.0+, requires eslint v9", + "matchPackageNames": ["eslint-plugin-no-use-extend-native"], + "allowedVersions": "<0.6.0" + }, { "description": "Require approval for stable branches (must be last rule to override all others)", "matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"], @@ -154,6 +175,14 @@ } ], "customManagers": [ + { + "description": "Update node-version in forgejo workflows", + "customType": "regex", + "fileMatch": ["^.forgejo/workflows/.+\\.yml$"], + "matchStrings": ["\\s+node-version: ['\"]?(?.+?)['\"]?\\s"], + "depNameTemplate": "node", + "datasourceTemplate": "node-version" + }, { "description": "Update deps inside Makefile", "customType": "regex", diff --git a/routers/api/actions/actions.go b/routers/api/actions/actions.go index 70158c4e18..a418b3a1c4 100644 --- a/routers/api/actions/actions.go +++ b/routers/api/actions/actions.go @@ -6,9 +6,9 @@ package actions import ( "net/http" - "forgejo.org/modules/web" - "forgejo.org/routers/api/actions/ping" - "forgejo.org/routers/api/actions/runner" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/actions/ping" + "code.gitea.io/gitea/routers/api/actions/runner" ) func Routes(prefix string) *web.Route { diff --git a/routers/api/actions/artifacts.go b/routers/api/actions/artifacts.go index 85a1f5f5be..bc29e4481d 100644 --- a/routers/api/actions/artifacts.go +++ b/routers/api/actions/artifacts.go @@ -69,18 +69,18 @@ import ( "strconv" "strings" - "forgejo.org/models/actions" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - web_types "forgejo.org/modules/web/types" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + web_types "code.gitea.io/gitea/modules/web/types" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" ) const artifactRouteBase = "/_apis/pipelines/workflows/{run_id}/artifacts" @@ -437,7 +437,7 @@ func (ar artifactRoutes) getDownloadArtifactURL(ctx *ArtifactContext) { for _, artifact := range artifacts { var downloadURL string if setting.Actions.ArtifactStorage.MinioConfig.ServeDirect { - u, err := ar.fs.URL(artifact.StoragePath, artifact.ArtifactName, nil) + u, err := ar.fs.URL(artifact.StoragePath, artifact.ArtifactName) if err != nil && !errors.Is(err, storage.ErrURLNotSupported) { log.Error("Error getting serve direct url: %v", err) } diff --git a/routers/api/actions/artifacts_chunks.go b/routers/api/actions/artifacts_chunks.go index a15fa4fd1e..cdb56584b8 100644 --- a/routers/api/actions/artifacts_chunks.go +++ b/routers/api/actions/artifacts_chunks.go @@ -17,10 +17,10 @@ import ( "strings" "time" - "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/storage" ) func saveUploadChunkBase(st storage.ObjectStorage, ctx *ArtifactContext, diff --git a/routers/api/actions/artifacts_utils.go b/routers/api/actions/artifacts_utils.go index 18c8e3fbed..db602f1e14 100644 --- a/routers/api/actions/artifacts_utils.go +++ b/routers/api/actions/artifacts_utils.go @@ -10,9 +10,9 @@ import ( "strconv" "strings" - "forgejo.org/models/actions" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) const ( diff --git a/routers/api/actions/artifactsv4.go b/routers/api/actions/artifactsv4.go index c6bc39e7d2..677e89da2f 100644 --- a/routers/api/actions/artifactsv4.go +++ b/routers/api/actions/artifactsv4.go @@ -98,16 +98,16 @@ import ( "strings" "time" - "forgejo.org/models/actions" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" "google.golang.org/protobuf/encoding/protojson" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -530,7 +530,7 @@ func (r *artifactV4Routes) getSignedArtifactURL(ctx *ArtifactContext) { respData := GetSignedArtifactURLResponse{} if setting.Actions.ArtifactStorage.MinioConfig.ServeDirect { - u, err := storage.ActionsArtifacts.URL(artifact.StoragePath, artifact.ArtifactPath, nil) + u, err := storage.ActionsArtifacts.URL(artifact.StoragePath, artifact.ArtifactPath) if u != nil && err == nil { respData.SignedUrl = u.String() } diff --git a/routers/api/actions/ping/ping.go b/routers/api/actions/ping/ping.go index 6b3378b72e..13985c93a3 100644 --- a/routers/api/actions/ping/ping.go +++ b/routers/api/actions/ping/ping.go @@ -8,7 +8,7 @@ import ( "fmt" "net/http" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/log" pingv1 "code.gitea.io/actions-proto-go/ping/v1" "code.gitea.io/actions-proto-go/ping/v1/pingv1connect" diff --git a/routers/api/actions/ping/ping_test.go b/routers/api/actions/ping/ping_test.go index 98d2dcb820..098b003ea2 100644 --- a/routers/api/actions/ping/ping_test.go +++ b/routers/api/actions/ping/ping_test.go @@ -4,6 +4,7 @@ package ping import ( + "context" "net/http" "net/http/httptest" "testing" @@ -50,7 +51,7 @@ func MainServiceTest(t *testing.T, h http.Handler) { clients := []pingv1connect.PingServiceClient{connectClient, grpcClient, grpcWebClient} t.Run("ping request", func(t *testing.T) { for _, client := range clients { - result, err := client.Ping(t.Context(), connect.NewRequest(&pingv1.PingRequest{ + result, err := client.Ping(context.Background(), connect.NewRequest(&pingv1.PingRequest{ Data: "foobar", })) require.NoError(t, err) diff --git a/routers/api/actions/runner/interceptor.go b/routers/api/actions/runner/interceptor.go index be83af6997..521ba910e3 100644 --- a/routers/api/actions/runner/interceptor.go +++ b/routers/api/actions/runner/interceptor.go @@ -9,13 +9,15 @@ import ( "errors" "strings" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "connectrpc.com/connect" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -35,12 +37,12 @@ var withRunner = connect.WithInterceptors(connect.UnaryInterceptorFunc(func(unar runner, err := actions_model.GetRunnerByUUID(ctx, uuid) if err != nil { if errors.Is(err, util.ErrNotExist) { - return nil, connect.NewError(connect.CodeUnauthenticated, errors.New("unregistered runner")) + return nil, status.Error(codes.Unauthenticated, "unregistered runner") } - return nil, connect.NewError(connect.CodeInternal, err) + return nil, status.Error(codes.Internal, err.Error()) } if subtle.ConstantTimeCompare([]byte(runner.TokenHash), []byte(auth_model.HashToken(token, runner.TokenSalt))) != 1 { - return nil, connect.NewError(connect.CodeUnauthenticated, errors.New("unregistered runner")) + return nil, status.Error(codes.Unauthenticated, "unregistered runner") } cols := []string{"last_online"} diff --git a/routers/api/actions/runner/main_test.go b/routers/api/actions/runner/main_test.go deleted file mode 100644 index 112ebe3cb6..0000000000 --- a/routers/api/actions/runner/main_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package runner - -import ( - "testing" - - "forgejo.org/models/unittest" - - _ "forgejo.org/models/forgefed" -) - -func TestMain(m *testing.M) { - unittest.MainTest(m) -} diff --git a/routers/api/actions/runner/runner.go b/routers/api/actions/runner/runner.go index 8aae69f463..017bdf6324 100644 --- a/routers/api/actions/runner/runner.go +++ b/routers/api/actions/runner/runner.go @@ -6,21 +6,22 @@ package runner import ( "context" "errors" - "fmt" "net/http" - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/actions" - "forgejo.org/modules/log" - "forgejo.org/modules/util" - actions_service "forgejo.org/services/actions" + actions_model "code.gitea.io/gitea/models/actions" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" + actions_service "code.gitea.io/gitea/services/actions" runnerv1 "code.gitea.io/actions-proto-go/runner/v1" "code.gitea.io/actions-proto-go/runner/v1/runnerv1connect" "connectrpc.com/connect" gouuid "github.com/google/uuid" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) func NewRunnerServiceHandler() (string, http.Handler) { @@ -43,27 +44,27 @@ func (s *Service) Register( req *connect.Request[runnerv1.RegisterRequest], ) (*connect.Response[runnerv1.RegisterResponse], error) { if req.Msg.Token == "" || req.Msg.Name == "" { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("missing runner token, name")) + return nil, errors.New("missing runner token, name") } runnerToken, err := actions_model.GetRunnerToken(ctx, req.Msg.Token) if err != nil { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("runner registration token not found")) + return nil, errors.New("runner registration token not found") } if !runnerToken.IsActive { - return nil, connect.NewError(connect.CodeInvalidArgument, errors.New("runner registration token has been invalidated, please use the latest one")) + return nil, errors.New("runner registration token has been invalidated, please use the latest one") } if runnerToken.OwnerID > 0 { if _, err := user_model.GetUserByID(ctx, runnerToken.OwnerID); err != nil { - return nil, connect.NewError(connect.CodeInternal, errors.New("owner of the token not found")) + return nil, errors.New("owner of the token not found") } } if runnerToken.RepoID > 0 { if _, err := repo_model.GetRepositoryByID(ctx, runnerToken.RepoID); err != nil { - return nil, connect.NewError(connect.CodeInternal, errors.New("repository of the token not found")) + return nil, errors.New("repository of the token not found") } } @@ -80,18 +81,18 @@ func (s *Service) Register( AgentLabels: labels, } if err := runner.GenerateToken(); err != nil { - return nil, connect.NewError(connect.CodeInternal, errors.New("can't generate token")) + return nil, errors.New("can't generate token") } // create new runner if err := actions_model.CreateRunner(ctx, runner); err != nil { - return nil, connect.NewError(connect.CodeInternal, errors.New("can't create new runner")) + return nil, errors.New("can't create new runner") } // update token status runnerToken.IsActive = true if err := actions_model.UpdateRunnerToken(ctx, runnerToken, "is_active"); err != nil { - return nil, connect.NewError(connect.CodeInternal, errors.New("can't update runner token status")) + return nil, errors.New("can't update runner token status") } res := connect.NewResponse(&runnerv1.RegisterResponse{ @@ -116,7 +117,7 @@ func (s *Service) Declare( runner.AgentLabels = req.Msg.Labels runner.Version = req.Msg.Version if err := actions_model.UpdateRunner(ctx, runner, "agent_labels", "version"); err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update runner: %w", err)) + return nil, status.Errorf(codes.Internal, "update runner: %v", err) } return connect.NewResponse(&runnerv1.DeclareResponse{ @@ -142,10 +143,10 @@ func (s *Service) FetchTask( tasksVersion := req.Msg.TasksVersion // task version from runner latestVersion, err := actions_model.GetTasksVersionByScope(ctx, runner.OwnerID, runner.RepoID) if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("query tasks version failed: %w", err)) + return nil, status.Errorf(codes.Internal, "query tasks version failed: %v", err) } else if latestVersion == 0 { if err := actions_model.IncreaseTaskVersion(ctx, runner.OwnerID, runner.RepoID); err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("fail to increase task version: %w", err)) + return nil, status.Errorf(codes.Internal, "fail to increase task version: %v", err) } // if we don't increase the value of `latestVersion` here, // the response of FetchTask will return tasksVersion as zero. @@ -157,9 +158,9 @@ func (s *Service) FetchTask( // if the task version in request is not equal to the version in db, // it means there may still be some tasks not be assigned. // try to pick a task for the runner that send the request. - if t, ok, err := actions_service.PickTask(ctx, runner); err != nil { + if t, ok, err := pickTask(ctx, runner); err != nil { log.Error("pick task failed: %v", err) - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("pick task: %w", err)) + return nil, status.Errorf(codes.Internal, "pick task: %v", err) } else if ok { task = t } @@ -176,11 +177,9 @@ func (s *Service) UpdateTask( ctx context.Context, req *connect.Request[runnerv1.UpdateTaskRequest], ) (*connect.Response[runnerv1.UpdateTaskResponse], error) { - runner := GetRunner(ctx) - - task, err := actions_model.UpdateTaskByState(ctx, runner.ID, req.Msg.State) + task, err := actions_model.UpdateTaskByState(ctx, req.Msg.State) if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update task: %w", err)) + return nil, status.Errorf(codes.Internal, "update task: %v", err) } for k, v := range req.Msg.Outputs { @@ -209,10 +208,10 @@ func (s *Service) UpdateTask( } if err := task.LoadJob(ctx); err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("load job: %w", err)) + return nil, status.Errorf(codes.Internal, "load job: %v", err) } if err := task.Job.LoadRun(ctx); err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("load run: %w", err)) + return nil, status.Errorf(codes.Internal, "load run: %v", err) } // don't create commit status for cron job @@ -240,15 +239,11 @@ func (s *Service) UpdateLog( ctx context.Context, req *connect.Request[runnerv1.UpdateLogRequest], ) (*connect.Response[runnerv1.UpdateLogResponse], error) { - runner := GetRunner(ctx) - res := connect.NewResponse(&runnerv1.UpdateLogResponse{}) task, err := actions_model.GetTaskByID(ctx, req.Msg.TaskId) if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("get task: %w", err)) - } else if runner.ID != task.RunnerID { - return nil, connect.NewError(connect.CodeInternal, errors.New("invalid runner for task")) + return nil, status.Errorf(codes.Internal, "get task: %v", err) } ack := task.LogLength @@ -258,13 +253,13 @@ func (s *Service) UpdateLog( } if task.LogInStorage { - return nil, connect.NewError(connect.CodeAlreadyExists, errors.New("log file has been archived")) + return nil, status.Errorf(codes.AlreadyExists, "log file has been archived") } rows := req.Msg.Rows[ack-req.Msg.Index:] ns, err := actions.WriteLogs(ctx, task.LogFilename, task.LogSize, rows) if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("write logs: %w", err)) + return nil, status.Errorf(codes.Internal, "write logs: %v", err) } task.LogLength += int64(len(rows)) for _, n := range ns { @@ -279,12 +274,12 @@ func (s *Service) UpdateLog( task.LogInStorage = true remove, err = actions.TransferLogs(ctx, task.LogFilename) if err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("transfer logs: %w", err)) + return nil, status.Errorf(codes.Internal, "transfer logs: %v", err) } } if err := actions_model.UpdateTask(ctx, task, "log_indexes", "log_length", "log_size", "log_in_storage"); err != nil { - return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("update task: %w", err)) + return nil, status.Errorf(codes.Internal, "update task: %v", err) } if remove != nil { remove() diff --git a/routers/api/actions/runner/utils.go b/routers/api/actions/runner/utils.go new file mode 100644 index 0000000000..ff6ec5bd54 --- /dev/null +++ b/routers/api/actions/runner/utils.go @@ -0,0 +1,189 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package runner + +import ( + "context" + "fmt" + + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + secret_model "code.gitea.io/gitea/models/secret" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/actions" + + runnerv1 "code.gitea.io/actions-proto-go/runner/v1" + "google.golang.org/protobuf/types/known/structpb" +) + +func pickTask(ctx context.Context, runner *actions_model.ActionRunner) (*runnerv1.Task, bool, error) { + t, ok, err := actions_model.CreateTaskForRunner(ctx, runner) + if err != nil { + return nil, false, fmt.Errorf("CreateTaskForRunner: %w", err) + } + if !ok { + return nil, false, nil + } + + secrets, err := secret_model.GetSecretsOfTask(ctx, t) + if err != nil { + return nil, false, fmt.Errorf("GetSecretsOfTask: %w", err) + } + + vars, err := actions_model.GetVariablesOfRun(ctx, t.Job.Run) + if err != nil { + return nil, false, fmt.Errorf("GetVariablesOfRun: %w", err) + } + + actions.CreateCommitStatus(ctx, t.Job) + + task := &runnerv1.Task{ + Id: t.ID, + WorkflowPayload: t.Job.WorkflowPayload, + Context: generateTaskContext(t), + Secrets: secrets, + Vars: vars, + } + + if needs, err := findTaskNeeds(ctx, t); err != nil { + log.Error("Cannot find needs for task %v: %v", t.ID, err) + // Go on with empty needs. + // If return error, the task will be wild, which means the runner will never get it when it has been assigned to the runner. + // In contrast, missing needs is less serious. + // And the task will fail and the runner will report the error in the logs. + } else { + task.Needs = needs + } + + return task, true, nil +} + +func generateTaskContext(t *actions_model.ActionTask) *structpb.Struct { + event := map[string]any{} + _ = json.Unmarshal([]byte(t.Job.Run.EventPayload), &event) + + // TriggerEvent is added in https://github.com/go-gitea/gitea/pull/25229 + // This fallback is for the old ActionRun that doesn't have the TriggerEvent field + // and should be removed in 1.22 + eventName := t.Job.Run.TriggerEvent + if eventName == "" { + eventName = t.Job.Run.Event.Event() + } + + baseRef := "" + headRef := "" + ref := t.Job.Run.Ref + sha := t.Job.Run.CommitSHA + if pullPayload, err := t.Job.Run.GetPullRequestEventPayload(); err == nil && pullPayload.PullRequest != nil && pullPayload.PullRequest.Base != nil && pullPayload.PullRequest.Head != nil { + baseRef = pullPayload.PullRequest.Base.Ref + headRef = pullPayload.PullRequest.Head.Ref + + // if the TriggerEvent is pull_request_target, ref and sha need to be set according to the base of pull request + // In GitHub's documentation, ref should be the branch or tag that triggered workflow. But when the TriggerEvent is pull_request_target, + // the ref will be the base branch. + if t.Job.Run.TriggerEvent == actions_module.GithubEventPullRequestTarget { + ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name + sha = pullPayload.PullRequest.Base.Sha + } + } + + refName := git.RefName(ref) + + giteaRuntimeToken, err := actions.CreateAuthorizationToken(t.ID, t.Job.RunID, t.JobID) + if err != nil { + log.Error("actions.CreateAuthorizationToken failed: %v", err) + } + + taskContext, err := structpb.NewStruct(map[string]any{ + // standard contexts, see https://docs.github.com/en/actions/learn-github-actions/contexts#github-context + "action": "", // string, The name of the action currently running, or the id of a step. GitHub removes special characters, and uses the name __run when the current step runs a script without an id. If you use the same action more than once in the same job, the name will include a suffix with the sequence number with underscore before it. For example, the first script you run will have the name __run, and the second script will be named __run_2. Similarly, the second invocation of actions/checkout will be actionscheckout2. + "action_path": "", // string, The path where an action is located. This property is only supported in composite actions. You can use this path to access files located in the same repository as the action. + "action_ref": "", // string, For a step executing an action, this is the ref of the action being executed. For example, v2. + "action_repository": "", // string, For a step executing an action, this is the owner and repository name of the action. For example, actions/checkout. + "action_status": "", // string, For a composite action, the current result of the composite action. + "actor": t.Job.Run.TriggerUser.Name, // string, The username of the user that triggered the initial workflow run. If the workflow run is a re-run, this value may differ from github.triggering_actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges. + "api_url": setting.AppURL + "api/v1", // string, The URL of the GitHub REST API. + "base_ref": baseRef, // string, The base_ref or target branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target. + "env": "", // string, Path on the runner to the file that sets environment variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions." + "event": event, // object, The full event webhook payload. You can access individual properties of the event using this context. This object is identical to the webhook payload of the event that triggered the workflow run, and is different for each event. The webhooks for each GitHub Actions event is linked in "Events that trigger workflows." For example, for a workflow run triggered by the push event, this object contains the contents of the push webhook payload. + "event_name": eventName, // string, The name of the event that triggered the workflow run. + "event_path": "", // string, The path to the file on the runner that contains the full event webhook payload. + "graphql_url": "", // string, The URL of the GitHub GraphQL API. + "head_ref": headRef, // string, The head_ref or source branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target. + "job": fmt.Sprint(t.JobID), // string, The job_id of the current job. + "ref": ref, // string, The fully-formed ref of the branch or tag that triggered the workflow run. For workflows triggered by push, this is the branch or tag ref that was pushed. For workflows triggered by pull_request, this is the pull request merge branch. For workflows triggered by release, this is the release tag created. For other triggers, this is the branch or tag ref that triggered the workflow run. This is only set if a branch or tag is available for the event type. The ref given is fully-formed, meaning that for branches the format is refs/heads/, for pull requests it is refs/pull//merge, and for tags it is refs/tags/. For example, refs/heads/feature-branch-1. + "ref_name": refName.ShortName(), // string, The short ref name of the branch or tag that triggered the workflow run. This value matches the branch or tag name shown on GitHub. For example, feature-branch-1. + "ref_protected": false, // boolean, true if branch protections are configured for the ref that triggered the workflow run. + "ref_type": refName.RefType(), // string, The type of ref that triggered the workflow run. Valid values are branch or tag. + "path": "", // string, Path on the runner to the file that sets system PATH variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions." + "repository": t.Job.Run.Repo.OwnerName + "/" + t.Job.Run.Repo.Name, // string, The owner and repository name. For example, Codertocat/Hello-World. + "repository_owner": t.Job.Run.Repo.OwnerName, // string, The repository owner's name. For example, Codertocat. + "repositoryUrl": t.Job.Run.Repo.HTMLURL(), // string, The Git URL to the repository. For example, git://github.com/codertocat/hello-world.git. + "retention_days": "", // string, The number of days that workflow run logs and artifacts are kept. + "run_id": fmt.Sprint(t.Job.RunID), // string, A unique number for each workflow run within a repository. This number does not change if you re-run the workflow run. + "run_number": fmt.Sprint(t.Job.Run.Index), // string, A unique number for each run of a particular workflow in a repository. This number begins at 1 for the workflow's first run, and increments with each new run. This number does not change if you re-run the workflow run. + "run_attempt": fmt.Sprint(t.Job.Attempt), // string, A unique number for each attempt of a particular workflow run in a repository. This number begins at 1 for the workflow run's first attempt, and increments with each re-run. + "secret_source": "Actions", // string, The source of a secret used in a workflow. Possible values are None, Actions, Dependabot, or Codespaces. + "server_url": setting.AppURL, // string, The URL of the GitHub server. For example: https://github.com. + "sha": sha, // string, The commit SHA that triggered the workflow. The value of this commit SHA depends on the event that triggered the workflow. For more information, see "Events that trigger workflows." For example, ffac537e6cbbf934b08745a378932722df287a53. + "token": t.Token, // string, A token to authenticate on behalf of the GitHub App installed on your repository. This is functionally equivalent to the GITHUB_TOKEN secret. For more information, see "Automatic token authentication." + "triggering_actor": "", // string, The username of the user that initiated the workflow run. If the workflow run is a re-run, this value may differ from github.actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges. + "workflow": t.Job.Run.WorkflowID, // string, The name of the workflow. If the workflow file doesn't specify a name, the value of this property is the full path of the workflow file in the repository. + "workspace": "", // string, The default working directory on the runner for steps, and the default location of your repository when using the checkout action. + + // additional contexts + "gitea_default_actions_url": setting.Actions.DefaultActionsURL.URL(), + "gitea_runtime_token": giteaRuntimeToken, + }) + if err != nil { + log.Error("structpb.NewStruct failed: %v", err) + } + + return taskContext +} + +func findTaskNeeds(ctx context.Context, task *actions_model.ActionTask) (map[string]*runnerv1.TaskNeed, error) { + if err := task.LoadAttributes(ctx); err != nil { + return nil, fmt.Errorf("LoadAttributes: %w", err) + } + if len(task.Job.Needs) == 0 { + return nil, nil + } + needs := container.SetOf(task.Job.Needs...) + + jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: task.Job.RunID}) + if err != nil { + return nil, fmt.Errorf("FindRunJobs: %w", err) + } + + ret := make(map[string]*runnerv1.TaskNeed, len(needs)) + for _, job := range jobs { + if !needs.Contains(job.JobID) { + continue + } + if job.TaskID == 0 || !job.Status.IsDone() { + // it shouldn't happen, or the job has been rerun + continue + } + outputs := make(map[string]string) + got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID) + if err != nil { + return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err) + } + for _, v := range got { + outputs[v.OutputKey] = v.OutputValue + } + ret[job.JobID] = &runnerv1.TaskNeed{ + Outputs: outputs, + Result: runnerv1.Result(job.Status), + } + } + + return ret, nil +} diff --git a/routers/api/forgejo/v1/api.go b/routers/api/forgejo/v1/api.go index dfc5a29d05..88c7502e66 100644 --- a/routers/api/forgejo/v1/api.go +++ b/routers/api/forgejo/v1/api.go @@ -4,8 +4,8 @@ package v1 import ( - "forgejo.org/modules/web" - "forgejo.org/routers/api/shared" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/shared" ) func Routes() *web.Route { diff --git a/routers/api/forgejo/v1/forgejo.go b/routers/api/forgejo/v1/forgejo.go index b63db6fb9a..0f1f4f1932 100644 --- a/routers/api/forgejo/v1/forgejo.go +++ b/routers/api/forgejo/v1/forgejo.go @@ -5,8 +5,8 @@ package v1 import ( "net/http" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" ) type Forgejo struct{} diff --git a/routers/api/packages/alpine/alpine.go b/routers/api/packages/alpine/alpine.go index dc992ebb5a..831a910e36 100644 --- a/routers/api/packages/alpine/alpine.go +++ b/routers/api/packages/alpine/alpine.go @@ -13,16 +13,16 @@ import ( "net/http" "strings" - packages_model "forgejo.org/models/packages" - alpine_model "forgejo.org/models/packages/alpine" - "forgejo.org/modules/json" - packages_module "forgejo.org/modules/packages" - alpine_module "forgejo.org/modules/packages/alpine" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" - alpine_service "forgejo.org/services/packages/alpine" + packages_model "code.gitea.io/gitea/models/packages" + alpine_model "code.gitea.io/gitea/models/packages/alpine" + "code.gitea.io/gitea/modules/json" + packages_module "code.gitea.io/gitea/modules/packages" + alpine_module "code.gitea.io/gitea/modules/packages/alpine" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" + alpine_service "code.gitea.io/gitea/services/packages/alpine" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/alt/alt.go b/routers/api/packages/alt/alt.go deleted file mode 100644 index a118459ce3..0000000000 --- a/routers/api/packages/alt/alt.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package alt - -import ( - stdctx "context" - "errors" - "fmt" - "io" - "net/http" - "strings" - - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - packages_module "forgejo.org/modules/packages" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - notify_service "forgejo.org/services/notify" - packages_service "forgejo.org/services/packages" - alt_service "forgejo.org/services/packages/alt" -) - -func apiError(ctx *context.Context, status int, obj any) { - helper.LogAndProcessError(ctx, status, obj, func(message string) { - ctx.PlainText(status, message) - }) -} - -func GetRepositoryConfig(ctx *context.Context) { - group := ctx.Params("group") - - var groupParts []string - if group != "" { - groupParts = strings.Split(group, "/") - } - - url := fmt.Sprintf("%sapi/packages/%s/alt", setting.AppURL, ctx.Package.Owner.Name) - - ctx.PlainText(http.StatusOK, `[gitea-`+strings.Join(append([]string{ctx.Package.Owner.LowerName}, groupParts...), "-")+`] -name=`+strings.Join(append([]string{ctx.Package.Owner.Name, setting.AppName}, groupParts...), " - ")+` -baseurl=`+strings.Join(append([]string{url}, groupParts...), "/")+` -enabled=1`) -} - -// Gets a pre-generated repository metadata file -func GetRepositoryFile(ctx *context.Context, arch string) { - pv, err := alt_service.GetOrCreateRepositoryVersion(ctx, ctx.Package.Owner.ID) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - s, u, pf, err := packages_service.GetFileStreamByPackageVersion( - ctx, - pv, - &packages_service.PackageFileInfo{ - Filename: ctx.Params("filename"), - CompositeKey: arch + "__" + ctx.Params("group"), - }, - ) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - } else { - apiError(ctx, http.StatusInternalServerError, err) - } - return - } - - helper.ServePackageFile(ctx, s, u, pf) -} - -func UploadPackageFile(ctx *context.Context) { - upload, needToClose, err := ctx.UploadStream() - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - if needToClose { - defer upload.Close() - } - - buf, err := packages_module.CreateHashedBufferFromReader(upload) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - defer buf.Close() - - pck, err := rpm_module.ParsePackage(buf, "alt") - if err != nil { - if errors.Is(err, util.ErrInvalidArgument) { - apiError(ctx, http.StatusBadRequest, err) - } else { - apiError(ctx, http.StatusInternalServerError, err) - } - return - } - if _, err := buf.Seek(0, io.SeekStart); err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - fileMetadataRaw, err := json.Marshal(pck.FileMetadata) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - group := ctx.Params("group") - _, _, err = packages_service.CreatePackageOrAddFileToExisting( - ctx, - &packages_service.PackageCreationInfo{ - PackageInfo: packages_service.PackageInfo{ - Owner: ctx.Package.Owner, - PackageType: packages_model.TypeAlt, - Name: pck.Name, - Version: pck.Version, - }, - Creator: ctx.Doer, - Metadata: pck.VersionMetadata, - }, - &packages_service.PackageFileCreationInfo{ - PackageFileInfo: packages_service.PackageFileInfo{ - Filename: fmt.Sprintf("%s-%s.%s.rpm", pck.Name, pck.Version, pck.FileMetadata.Architecture), - CompositeKey: group, - }, - Creator: ctx.Doer, - Data: buf, - IsLead: true, - Properties: map[string]string{ - rpm_module.PropertyGroup: group, - rpm_module.PropertyArchitecture: pck.FileMetadata.Architecture, - rpm_module.PropertyMetadata: string(fileMetadataRaw), - }, - }, - ) - if err != nil { - switch err { - case packages_model.ErrDuplicatePackageVersion, packages_model.ErrDuplicatePackageFile: - apiError(ctx, http.StatusConflict, err) - case packages_service.ErrQuotaTotalCount, packages_service.ErrQuotaTypeSize, packages_service.ErrQuotaTotalSize: - apiError(ctx, http.StatusForbidden, err) - default: - apiError(ctx, http.StatusInternalServerError, err) - } - return - } - - if err := alt_service.BuildSpecificRepositoryFiles(ctx, ctx.Package.Owner.ID, group); err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - ctx.Status(http.StatusCreated) -} - -func DownloadPackageFile(ctx *context.Context) { - name := ctx.Params("name") - version := ctx.Params("version") - - s, u, pf, err := packages_service.GetFileStreamByPackageNameAndVersion( - ctx, - &packages_service.PackageInfo{ - Owner: ctx.Package.Owner, - PackageType: packages_model.TypeAlt, - Name: name, - Version: version, - }, - &packages_service.PackageFileInfo{ - Filename: fmt.Sprintf("%s-%s.%s.rpm", name, version, ctx.Params("architecture")), - CompositeKey: ctx.Params("group"), - }, - ) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - apiError(ctx, http.StatusNotFound, err) - } else { - apiError(ctx, http.StatusInternalServerError, err) - } - return - } - - helper.ServePackageFile(ctx, s, u, pf) -} - -func DeletePackageFile(webctx *context.Context) { - group := webctx.Params("group") - name := webctx.Params("name") - version := webctx.Params("version") - architecture := webctx.Params("architecture") - - var pd *packages_model.PackageDescriptor - - err := db.WithTx(webctx, func(ctx stdctx.Context) error { - pv, err := packages_model.GetVersionByNameAndVersion(ctx, - webctx.Package.Owner.ID, - packages_model.TypeAlt, - name, - version, - ) - if err != nil { - return err - } - - pf, err := packages_model.GetFileForVersionByName( - ctx, - pv.ID, - fmt.Sprintf("%s-%s.%s.rpm", name, version, architecture), - group, - ) - if err != nil { - return err - } - - if err := packages_service.DeletePackageFile(ctx, pf); err != nil { - return err - } - - has, err := packages_model.HasVersionFileReferences(ctx, pv.ID) - if err != nil { - return err - } - if !has { - pd, err = packages_model.GetPackageDescriptor(ctx, pv) - if err != nil { - return err - } - - if err := packages_service.DeletePackageVersionAndReferences(ctx, pv); err != nil { - return err - } - } - - return nil - }) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - apiError(webctx, http.StatusNotFound, err) - } else { - apiError(webctx, http.StatusInternalServerError, err) - } - return - } - - if pd != nil { - notify_service.PackageDelete(webctx, webctx.Doer, pd) - } - - if err := alt_service.BuildSpecificRepositoryFiles(webctx, webctx.Package.Owner.ID, group); err != nil { - apiError(webctx, http.StatusInternalServerError, err) - return - } - - webctx.Status(http.StatusNoContent) -} diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go index ebd081ae77..1337ce4569 100644 --- a/routers/api/packages/api.go +++ b/routers/api/packages/api.go @@ -8,37 +8,36 @@ import ( "regexp" "strings" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/perm" - quota_model "forgejo.org/models/quota" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/routers/api/packages/alpine" - "forgejo.org/routers/api/packages/alt" - "forgejo.org/routers/api/packages/arch" - "forgejo.org/routers/api/packages/cargo" - "forgejo.org/routers/api/packages/chef" - "forgejo.org/routers/api/packages/composer" - "forgejo.org/routers/api/packages/conan" - "forgejo.org/routers/api/packages/conda" - "forgejo.org/routers/api/packages/container" - "forgejo.org/routers/api/packages/cran" - "forgejo.org/routers/api/packages/debian" - "forgejo.org/routers/api/packages/generic" - "forgejo.org/routers/api/packages/goproxy" - "forgejo.org/routers/api/packages/helm" - "forgejo.org/routers/api/packages/maven" - "forgejo.org/routers/api/packages/npm" - "forgejo.org/routers/api/packages/nuget" - "forgejo.org/routers/api/packages/pub" - "forgejo.org/routers/api/packages/pypi" - "forgejo.org/routers/api/packages/rpm" - "forgejo.org/routers/api/packages/rubygems" - "forgejo.org/routers/api/packages/swift" - "forgejo.org/routers/api/packages/vagrant" - "forgejo.org/services/auth" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/perm" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/packages/alpine" + "code.gitea.io/gitea/routers/api/packages/arch" + "code.gitea.io/gitea/routers/api/packages/cargo" + "code.gitea.io/gitea/routers/api/packages/chef" + "code.gitea.io/gitea/routers/api/packages/composer" + "code.gitea.io/gitea/routers/api/packages/conan" + "code.gitea.io/gitea/routers/api/packages/conda" + "code.gitea.io/gitea/routers/api/packages/container" + "code.gitea.io/gitea/routers/api/packages/cran" + "code.gitea.io/gitea/routers/api/packages/debian" + "code.gitea.io/gitea/routers/api/packages/generic" + "code.gitea.io/gitea/routers/api/packages/goproxy" + "code.gitea.io/gitea/routers/api/packages/helm" + "code.gitea.io/gitea/routers/api/packages/maven" + "code.gitea.io/gitea/routers/api/packages/npm" + "code.gitea.io/gitea/routers/api/packages/nuget" + "code.gitea.io/gitea/routers/api/packages/pub" + "code.gitea.io/gitea/routers/api/packages/pypi" + "code.gitea.io/gitea/routers/api/packages/rpm" + "code.gitea.io/gitea/routers/api/packages/rubygems" + "code.gitea.io/gitea/routers/api/packages/swift" + "code.gitea.io/gitea/routers/api/packages/vagrant" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" ) func reqPackageAccess(accessMode perm.AccessMode) func(ctx *context.Context) { @@ -154,10 +153,66 @@ func CommonRoutes() *web.Route { }) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/arch", func() { - r.Methods("HEAD,GET", "/repository.key", arch.GetRepositoryKey) - r.Methods("HEAD,GET", "*", arch.GetPackageOrDB) - r.Methods("PUT", "*", reqPackageAccess(perm.AccessModeWrite), arch.PushPackage) - r.Methods("DELETE", "*", reqPackageAccess(perm.AccessModeWrite), arch.RemovePackage) + r.Group("/repository.key", func() { + r.Head("", arch.GetRepositoryKey) + r.Get("", arch.GetRepositoryKey) + }) + + r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) { + pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") + groupLen := len(pathGroups) + isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET" + isPut := ctx.Req.Method == "PUT" + isDelete := ctx.Req.Method == "DELETE" + if isGetHead { + if groupLen < 2 { + ctx.Status(http.StatusNotFound) + return + } + if groupLen == 2 { + ctx.SetParams("group", "") + ctx.SetParams("arch", pathGroups[0]) + ctx.SetParams("file", pathGroups[1]) + } else { + ctx.SetParams("group", strings.Join(pathGroups[:groupLen-2], "/")) + ctx.SetParams("arch", pathGroups[groupLen-2]) + ctx.SetParams("file", pathGroups[groupLen-1]) + } + arch.GetPackageOrDB(ctx) + return + } else if isPut { + ctx.SetParams("group", strings.Join(pathGroups, "/")) + reqPackageAccess(perm.AccessModeWrite)(ctx) + if ctx.Written() { + return + } + arch.PushPackage(ctx) + return + } else if isDelete { + if groupLen < 3 { + ctx.Status(http.StatusBadRequest) + return + } + if groupLen == 3 { + ctx.SetParams("group", "") + ctx.SetParams("package", pathGroups[0]) + ctx.SetParams("version", pathGroups[1]) + ctx.SetParams("arch", pathGroups[2]) + } else { + ctx.SetParams("group", strings.Join(pathGroups[:groupLen-3], "/")) + ctx.SetParams("package", pathGroups[groupLen-3]) + ctx.SetParams("version", pathGroups[groupLen-2]) + ctx.SetParams("arch", pathGroups[groupLen-1]) + } + reqPackageAccess(perm.AccessModeWrite)(ctx) + if ctx.Written() { + return + } + arch.RemovePackage(ctx) + return + } + ctx.Status(http.StatusNotFound) + }) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/cargo", func() { r.Group("/api/v1/crates", func() { @@ -338,7 +393,6 @@ func CommonRoutes() *web.Route { r.Get("/PACKAGES", cran.EnumerateSourcePackages) r.Get("/PACKAGES{format}", cran.EnumerateSourcePackages) r.Get("/{filename}", cran.DownloadSourcePackageFile) - r.Get("/Archive/{packagename}/{filename}", cran.DownloadSourcePackageFile) }) r.Put("", reqPackageAccess(perm.AccessModeWrite), enforcePackagesQuota(), cran.UploadSourcePackageFile) }) @@ -625,73 +679,6 @@ func CommonRoutes() *web.Route { ctx.Status(http.StatusNotFound) }) }, reqPackageAccess(perm.AccessModeRead)) - r.Group("/alt", func() { - var ( - baseURLPattern = regexp.MustCompile(`\A(.*?)\.repo\z`) - uploadPattern = regexp.MustCompile(`\A(.*?)/upload\z`) - baseRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\/base/(\S+)`) - rpmsRepoPattern = regexp.MustCompile(`(\S+)\.repo/(\S+)\.(\S+)\/([a-zA-Z0-9_-]+)-([\d.]+-[a-zA-Z0-9_-]+)\.(\S+)\.rpm`) - ) - - r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) { - path := ctx.Params("*") - isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET" - isPut := ctx.Req.Method == "PUT" - isDelete := ctx.Req.Method == "DELETE" - - m := baseURLPattern.FindStringSubmatch(path) - if len(m) == 2 && isGetHead { - ctx.SetParams("group", strings.Trim(m[1], "/")) - alt.GetRepositoryConfig(ctx) - return - } - - m = baseRepoPattern.FindStringSubmatch(path) - if len(m) == 4 { - if strings.Trim(m[1], "/") != "alt" { - ctx.SetParams("group", strings.Trim(m[1], "/")) - } - ctx.SetParams("filename", m[3]) - if isGetHead { - alt.GetRepositoryFile(ctx, m[2]) - } - return - } - - m = uploadPattern.FindStringSubmatch(path) - if len(m) == 2 && isPut { - reqPackageAccess(perm.AccessModeWrite)(ctx) - if ctx.Written() { - return - } - ctx.SetParams("group", strings.Trim(m[1], "/")) - alt.UploadPackageFile(ctx) - return - } - - m = rpmsRepoPattern.FindStringSubmatch(path) - if len(m) == 7 && (isGetHead || isDelete) { - if strings.Trim(m[1], "/") != "alt" { - ctx.SetParams("group", strings.Trim(m[1], "/")) - } - ctx.SetParams("name", m[4]) - ctx.SetParams("version", m[5]) - ctx.SetParams("architecture", m[6]) - if isGetHead { - alt.DownloadPackageFile(ctx) - } else { - reqPackageAccess(perm.AccessModeWrite)(ctx) - if ctx.Written() { - return - } - alt.DeletePackageFile(ctx) - } - return - } - - ctx.Status(http.StatusNotFound) - }) - }, reqPackageAccess(perm.AccessModeRead)) r.Group("/rubygems", func() { r.Get("/specs.4.8.gz", rubygems.EnumeratePackages) r.Get("/latest_specs.4.8.gz", rubygems.EnumeratePackagesLatest) @@ -706,46 +693,40 @@ func CommonRoutes() *web.Route { }, reqPackageAccess(perm.AccessModeWrite)) }, reqPackageAccess(perm.AccessModeRead)) r.Group("/swift", func() { - r.Group("", func() { // Needs to be unauthenticated. - r.Post("", swift.CheckAuthenticate) - r.Post("/login", swift.CheckAuthenticate) - }) - r.Group("", func() { - r.Group("/{scope}/{name}", func() { - r.Group("", func() { - r.Get("", swift.EnumeratePackageVersions) - r.Get(".json", swift.EnumeratePackageVersions) - }, swift.CheckAcceptMediaType(swift.AcceptJSON)) - r.Group("/{version}", func() { - r.Get("/Package.swift", swift.CheckAcceptMediaType(swift.AcceptSwift), swift.DownloadManifest) - r.Put("", reqPackageAccess(perm.AccessModeWrite), swift.CheckAcceptMediaType(swift.AcceptJSON), enforcePackagesQuota(), swift.UploadPackageFile) - r.Get("", func(ctx *context.Context) { - // Can't use normal routes here: https://github.com/go-chi/chi/issues/781 + r.Group("/{scope}/{name}", func() { + r.Group("", func() { + r.Get("", swift.EnumeratePackageVersions) + r.Get(".json", swift.EnumeratePackageVersions) + }, swift.CheckAcceptMediaType(swift.AcceptJSON)) + r.Group("/{version}", func() { + r.Get("/Package.swift", swift.CheckAcceptMediaType(swift.AcceptSwift), swift.DownloadManifest) + r.Put("", reqPackageAccess(perm.AccessModeWrite), swift.CheckAcceptMediaType(swift.AcceptJSON), enforcePackagesQuota(), swift.UploadPackageFile) + r.Get("", func(ctx *context.Context) { + // Can't use normal routes here: https://github.com/go-chi/chi/issues/781 - version := ctx.Params("version") - if strings.HasSuffix(version, ".zip") { - swift.CheckAcceptMediaType(swift.AcceptZip)(ctx) - if ctx.Written() { - return - } - ctx.SetParams("version", version[:len(version)-4]) - swift.DownloadPackageFile(ctx) - } else { - swift.CheckAcceptMediaType(swift.AcceptJSON)(ctx) - if ctx.Written() { - return - } - if strings.HasSuffix(version, ".json") { - ctx.SetParams("version", version[:len(version)-5]) - } - swift.PackageVersionMetadata(ctx) + version := ctx.Params("version") + if strings.HasSuffix(version, ".zip") { + swift.CheckAcceptMediaType(swift.AcceptZip)(ctx) + if ctx.Written() { + return } - }) + ctx.SetParams("version", version[:len(version)-4]) + swift.DownloadPackageFile(ctx) + } else { + swift.CheckAcceptMediaType(swift.AcceptJSON)(ctx) + if ctx.Written() { + return + } + if strings.HasSuffix(version, ".json") { + ctx.SetParams("version", version[:len(version)-5]) + } + swift.PackageVersionMetadata(ctx) + } }) }) - r.Get("/identifiers", swift.CheckAcceptMediaType(swift.AcceptJSON), swift.LookupPackageIdentifiers) - }, reqPackageAccess(perm.AccessModeRead)) - }) + }) + r.Get("/identifiers", swift.CheckAcceptMediaType(swift.AcceptJSON), swift.LookupPackageIdentifiers) + }, reqPackageAccess(perm.AccessModeRead)) r.Group("/vagrant", func() { r.Group("/authenticate", func() { r.Get("", vagrant.CheckAuthenticate) diff --git a/routers/api/packages/arch/arch.go b/routers/api/packages/arch/arch.go index a45f38dd08..ecd2281884 100644 --- a/routers/api/packages/arch/arch.go +++ b/routers/api/packages/arch/arch.go @@ -13,20 +13,20 @@ import ( "regexp" "strings" - packages_model "forgejo.org/models/packages" - packages_module "forgejo.org/modules/packages" - arch_module "forgejo.org/modules/packages/arch" - "forgejo.org/modules/sync" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" - arch_service "forgejo.org/services/packages/arch" + packages_model "code.gitea.io/gitea/models/packages" + packages_module "code.gitea.io/gitea/modules/packages" + arch_module "code.gitea.io/gitea/modules/packages/arch" + "code.gitea.io/gitea/modules/sync" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" + arch_service "code.gitea.io/gitea/services/packages/arch" ) var ( archPkgOrSig = regexp.MustCompile(`^.*\.pkg\.tar\.\w+(\.sig)*$`) - archDBOrSig = regexp.MustCompile(`^.*.(db|files)(\.tar\.gz)*(\.sig)*$`) + archDBOrSig = regexp.MustCompile(`^.*.db(\.tar\.gz)*(\.sig)*$`) locker = sync.NewExclusivePool() ) @@ -59,7 +59,7 @@ func GetRepositoryKey(ctx *context.Context) { } func PushPackage(ctx *context.Context) { - group := strings.Trim(ctx.Params("*"), "/") + group := ctx.Params("group") releaser := refreshLocker(ctx, group) defer releaser() upload, needToClose, err := ctx.UploadStream() @@ -115,7 +115,6 @@ func PushPackage(ctx *context.Context) { properties := map[string]string{ arch_module.PropertyDescription: p.Desc(), - arch_module.PropertyFiles: p.Files(), arch_module.PropertyArch: p.FileMetadata.Arch, arch_module.PropertyDistribution: group, } @@ -184,21 +183,11 @@ func PushPackage(ctx *context.Context) { } func GetPackageOrDB(ctx *context.Context) { - pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") - groupLen := len(pathGroups) - if groupLen < 2 { - ctx.Status(http.StatusNotFound) - return - } - var file, group, arch string - if groupLen == 2 { - arch = pathGroups[0] - file = pathGroups[1] - } else { - group = strings.Join(pathGroups[:groupLen-2], "/") - arch = pathGroups[groupLen-2] - file = pathGroups[groupLen-1] - } + var ( + file = ctx.Params("file") + group = ctx.Params("group") + arch = ctx.Params("arch") + ) if archPkgOrSig.MatchString(file) { pkg, u, pf, err := arch_service.GetPackageFile(ctx, group, file, ctx.Package.Owner.ID) if err != nil { @@ -231,23 +220,12 @@ func GetPackageOrDB(ctx *context.Context) { } func RemovePackage(ctx *context.Context) { - pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/") - groupLen := len(pathGroups) - if groupLen < 3 { - ctx.Status(http.StatusBadRequest) - return - } - var group, pkg, ver, pkgArch string - if groupLen == 3 { - pkg = pathGroups[0] - ver = pathGroups[1] - pkgArch = pathGroups[2] - } else { - group = strings.Join(pathGroups[:groupLen-3], "/") - pkg = pathGroups[groupLen-3] - ver = pathGroups[groupLen-2] - pkgArch = pathGroups[groupLen-1] - } + var ( + group = ctx.Params("group") + pkg = ctx.Params("package") + ver = ctx.Params("version") + pkgArch = ctx.Params("arch") + ) releaser := refreshLocker(ctx, group) defer releaser() pv, err := packages_model.GetVersionByNameAndVersion( diff --git a/routers/api/packages/cargo/cargo.go b/routers/api/packages/cargo/cargo.go index 50dc8d1c3d..140e532efd 100644 --- a/routers/api/packages/cargo/cargo.go +++ b/routers/api/packages/cargo/cargo.go @@ -10,20 +10,20 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - cargo_module "forgejo.org/modules/packages/cargo" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - "forgejo.org/services/convert" - packages_service "forgejo.org/services/packages" - cargo_service "forgejo.org/services/packages/cargo" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + cargo_module "code.gitea.io/gitea/modules/packages/cargo" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + packages_service "code.gitea.io/gitea/services/packages" + cargo_service "code.gitea.io/gitea/services/packages/cargo" ) // https://doc.rust-lang.org/cargo/reference/registries.html#web-api diff --git a/routers/api/packages/chef/auth.go b/routers/api/packages/chef/auth.go index fc552c1f1b..a790e9a363 100644 --- a/routers/api/packages/chef/auth.go +++ b/routers/api/packages/chef/auth.go @@ -23,10 +23,10 @@ import ( "strings" "time" - user_model "forgejo.org/models/user" - chef_module "forgejo.org/modules/packages/chef" - "forgejo.org/modules/util" - "forgejo.org/services/auth" + user_model "code.gitea.io/gitea/models/user" + chef_module "code.gitea.io/gitea/modules/packages/chef" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/auth" ) const ( diff --git a/routers/api/packages/chef/chef.go b/routers/api/packages/chef/chef.go index 909817861e..b49f4e9d0a 100644 --- a/routers/api/packages/chef/chef.go +++ b/routers/api/packages/chef/chef.go @@ -13,16 +13,16 @@ import ( "strings" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - chef_module "forgejo.org/modules/packages/chef" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + chef_module "code.gitea.io/gitea/modules/packages/chef" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/composer/api.go b/routers/api/packages/composer/api.go index dc491ea8a8..a3bcf80417 100644 --- a/routers/api/packages/composer/api.go +++ b/routers/api/packages/composer/api.go @@ -8,8 +8,8 @@ import ( "net/url" "time" - packages_model "forgejo.org/models/packages" - composer_module "forgejo.org/modules/packages/composer" + packages_model "code.gitea.io/gitea/models/packages" + composer_module "code.gitea.io/gitea/modules/packages/composer" ) // ServiceIndexResponse contains registry endpoints @@ -66,7 +66,6 @@ type PackageMetadataResponse struct { } // PackageVersionMetadata contains package metadata -// https://getcomposer.org/doc/05-repositories.md#package type PackageVersionMetadata struct { *composer_module.Metadata Name string `json:"name"` @@ -74,7 +73,6 @@ type PackageVersionMetadata struct { Type string `json:"type"` Created time.Time `json:"time"` Dist Dist `json:"dist"` - Source Source `json:"source"` } // Dist contains package download information @@ -84,13 +82,6 @@ type Dist struct { Checksum string `json:"shasum"` } -// Source contains package source information -type Source struct { - URL string `json:"url"` - Type string `json:"type"` - Reference string `json:"reference"` -} - func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *PackageMetadataResponse { versions := make([]*PackageVersionMetadata, 0, len(pds)) @@ -103,7 +94,7 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac } } - pkg := PackageVersionMetadata{ + versions = append(versions, &PackageVersionMetadata{ Name: pd.Package.Name, Version: pd.Version.Version, Type: packageType, @@ -114,16 +105,7 @@ func createPackageMetadataResponse(registryURL string, pds []*packages_model.Pac URL: fmt.Sprintf("%s/files/%s/%s/%s", registryURL, url.PathEscape(pd.Package.LowerName), url.PathEscape(pd.Version.LowerVersion), url.PathEscape(pd.Files[0].File.LowerName)), Checksum: pd.Files[0].Blob.HashSHA1, }, - } - if pd.Repository != nil { - pkg.Source = Source{ - URL: pd.Repository.HTMLURL(), - Type: "git", - Reference: pd.Version.Version, - } - } - - versions = append(versions, &pkg) + }) } return &PackageMetadataResponse{ diff --git a/routers/api/packages/composer/composer.go b/routers/api/packages/composer/composer.go index 9e67d419ec..a045da40de 100644 --- a/routers/api/packages/composer/composer.go +++ b/routers/api/packages/composer/composer.go @@ -12,17 +12,17 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - composer_module "forgejo.org/modules/packages/composer" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - "forgejo.org/services/convert" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + composer_module "code.gitea.io/gitea/modules/packages/composer" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + packages_service "code.gitea.io/gitea/services/packages" "github.com/hashicorp/go-version" ) diff --git a/routers/api/packages/conan/auth.go b/routers/api/packages/conan/auth.go index 1f5af77304..e2e1901b08 100644 --- a/routers/api/packages/conan/auth.go +++ b/routers/api/packages/conan/auth.go @@ -6,10 +6,10 @@ package conan import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/services/auth" - "forgejo.org/services/packages" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/packages" ) var _ auth.Method = &Auth{} diff --git a/routers/api/packages/conan/conan.go b/routers/api/packages/conan/conan.go index 927d131309..e07907a8b1 100644 --- a/routers/api/packages/conan/conan.go +++ b/routers/api/packages/conan/conan.go @@ -11,20 +11,20 @@ import ( "strings" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - conan_model "forgejo.org/models/packages/conan" - "forgejo.org/modules/container" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - conan_module "forgejo.org/modules/packages/conan" - "forgejo.org/modules/setting" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - notify_service "forgejo.org/services/notify" - packages_service "forgejo.org/services/packages" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + conan_model "code.gitea.io/gitea/models/packages/conan" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + conan_module "code.gitea.io/gitea/modules/packages/conan" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" ) const ( diff --git a/routers/api/packages/conan/search.go b/routers/api/packages/conan/search.go index afc94afef5..7370c702cd 100644 --- a/routers/api/packages/conan/search.go +++ b/routers/api/packages/conan/search.go @@ -7,11 +7,11 @@ import ( "net/http" "strings" - conan_model "forgejo.org/models/packages/conan" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - conan_module "forgejo.org/modules/packages/conan" - "forgejo.org/services/context" + conan_model "code.gitea.io/gitea/models/packages/conan" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + conan_module "code.gitea.io/gitea/modules/packages/conan" + "code.gitea.io/gitea/services/context" ) // SearchResult contains the found recipe names diff --git a/routers/api/packages/conda/conda.go b/routers/api/packages/conda/conda.go index 52872d2543..c7e4544d52 100644 --- a/routers/api/packages/conda/conda.go +++ b/routers/api/packages/conda/conda.go @@ -10,16 +10,16 @@ import ( "net/http" "strings" - packages_model "forgejo.org/models/packages" - conda_model "forgejo.org/models/packages/conda" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - conda_module "forgejo.org/modules/packages/conda" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + conda_model "code.gitea.io/gitea/models/packages/conda" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + conda_module "code.gitea.io/gitea/modules/packages/conda" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" "github.com/dsnet/compress/bzip2" ) diff --git a/routers/api/packages/container/auth.go b/routers/api/packages/container/auth.go index 71c237326e..a8b3ec117a 100644 --- a/routers/api/packages/container/auth.go +++ b/routers/api/packages/container/auth.go @@ -6,10 +6,10 @@ package container import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/services/auth" - "forgejo.org/services/packages" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/packages" ) var _ auth.Method = &Auth{} diff --git a/routers/api/packages/container/blob.go b/routers/api/packages/container/blob.go index 0e07b03c0c..9e3a47076c 100644 --- a/routers/api/packages/container/blob.go +++ b/routers/api/packages/container/blob.go @@ -12,14 +12,14 @@ import ( "strings" "sync" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" ) var uploadVersionMutex sync.Mutex @@ -193,7 +193,7 @@ func deleteBlob(ctx context.Context, ownerID int64, image, digest string) error } func digestFromHashSummer(h packages_module.HashSummer) string { - _, _, hashSHA256, _, _ := h.Sums() + _, _, hashSHA256, _ := h.Sums() return "sha256:" + hex.EncodeToString(hashSHA256) } diff --git a/routers/api/packages/container/container.go b/routers/api/packages/container/container.go index 5276dd5706..f376e7bc59 100644 --- a/routers/api/packages/container/container.go +++ b/routers/api/packages/container/container.go @@ -14,20 +14,20 @@ import ( "strconv" "strings" - auth_model "forgejo.org/models/auth" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" - container_service "forgejo.org/services/packages/container" + auth_model "code.gitea.io/gitea/models/auth" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" + container_service "code.gitea.io/gitea/services/packages/container" digest "github.com/opencontainers/go-digest" ) @@ -689,9 +689,7 @@ func DeleteManifest(ctx *context.Context) { } func serveBlob(ctx *context.Context, pfd *packages_model.PackageFileDescriptor) { - serveDirectReqParams := make(url.Values) - serveDirectReqParams.Set("response-content-type", pfd.Properties.GetByName(container_module.PropertyMediaType)) - s, u, _, err := packages_service.GetPackageBlobStream(ctx, pfd.File, pfd.Blob, serveDirectReqParams) + s, u, _, err := packages_service.GetPackageBlobStream(ctx, pfd.File, pfd.Blob) if err != nil { apiError(ctx, http.StatusInternalServerError, err) return diff --git a/routers/api/packages/container/manifest.go b/routers/api/packages/container/manifest.go index 428e7605a6..4a79a58f51 100644 --- a/routers/api/packages/container/manifest.go +++ b/routers/api/packages/container/manifest.go @@ -11,17 +11,17 @@ import ( "os" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" digest "github.com/opencontainers/go-digest" oci "github.com/opencontainers/image-spec/specs-go/v1" diff --git a/routers/api/packages/cran/cran.go b/routers/api/packages/cran/cran.go index f73111278f..f1d616724a 100644 --- a/routers/api/packages/cran/cran.go +++ b/routers/api/packages/cran/cran.go @@ -11,14 +11,14 @@ import ( "net/http" "strings" - packages_model "forgejo.org/models/packages" - cran_model "forgejo.org/models/packages/cran" - packages_module "forgejo.org/modules/packages" - cran_module "forgejo.org/modules/packages/cran" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + cran_model "code.gitea.io/gitea/models/packages/cran" + packages_module "code.gitea.io/gitea/modules/packages" + cran_module "code.gitea.io/gitea/modules/packages/cran" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/debian/debian.go b/routers/api/packages/debian/debian.go index fd64e35657..8c05476cbc 100644 --- a/routers/api/packages/debian/debian.go +++ b/routers/api/packages/debian/debian.go @@ -11,16 +11,16 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - packages_module "forgejo.org/modules/packages" - debian_module "forgejo.org/modules/packages/debian" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - notify_service "forgejo.org/services/notify" - packages_service "forgejo.org/services/packages" - debian_service "forgejo.org/services/packages/debian" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + packages_module "code.gitea.io/gitea/modules/packages" + debian_module "code.gitea.io/gitea/modules/packages/debian" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" + debian_service "code.gitea.io/gitea/services/packages/debian" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/generic/generic.go b/routers/api/packages/generic/generic.go index 6e116e050d..e66f3ee676 100644 --- a/routers/api/packages/generic/generic.go +++ b/routers/api/packages/generic/generic.go @@ -10,12 +10,12 @@ import ( "strings" "unicode" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) var ( diff --git a/routers/api/packages/goproxy/goproxy.go b/routers/api/packages/goproxy/goproxy.go index 488850ecbf..56a07dbd43 100644 --- a/routers/api/packages/goproxy/goproxy.go +++ b/routers/api/packages/goproxy/goproxy.go @@ -11,14 +11,14 @@ import ( "sort" "time" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - goproxy_module "forgejo.org/modules/packages/goproxy" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + goproxy_module "code.gitea.io/gitea/modules/packages/goproxy" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/helm/helm.go b/routers/api/packages/helm/helm.go index 1d8efb8d68..efdb83ec0e 100644 --- a/routers/api/packages/helm/helm.go +++ b/routers/api/packages/helm/helm.go @@ -12,17 +12,17 @@ import ( "strings" "time" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - helm_module "forgejo.org/modules/packages/helm" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + helm_module "code.gitea.io/gitea/modules/packages/helm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" "gopkg.in/yaml.v3" ) diff --git a/routers/api/packages/helper/helper.go b/routers/api/packages/helper/helper.go index 99c0867bbb..cdb64109ad 100644 --- a/routers/api/packages/helper/helper.go +++ b/routers/api/packages/helper/helper.go @@ -9,10 +9,10 @@ import ( "net/http" "net/url" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // LogAndProcessError logs an error and calls a custom callback with the processed error message. diff --git a/routers/api/packages/maven/api.go b/routers/api/packages/maven/api.go index 21d2aaa100..167fe42b56 100644 --- a/routers/api/packages/maven/api.go +++ b/routers/api/packages/maven/api.go @@ -7,8 +7,8 @@ import ( "encoding/xml" "strings" - packages_model "forgejo.org/models/packages" - maven_module "forgejo.org/modules/packages/maven" + packages_model "code.gitea.io/gitea/models/packages" + maven_module "code.gitea.io/gitea/modules/packages/maven" ) // MetadataResponse https://maven.apache.org/ref/3.2.5/maven-repository-metadata/repository-metadata.html diff --git a/routers/api/packages/maven/maven.go b/routers/api/packages/maven/maven.go index ea04a7b42e..4181577454 100644 --- a/routers/api/packages/maven/maven.go +++ b/routers/api/packages/maven/maven.go @@ -19,15 +19,14 @@ import ( "strconv" "strings" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - maven_module "forgejo.org/modules/packages/maven" - "forgejo.org/modules/sync" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + maven_module "code.gitea.io/gitea/modules/packages/maven" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) const ( @@ -218,7 +217,7 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool return } - s, u, _, err := packages_service.GetPackageBlobStream(ctx, pf, pb, nil) + s, u, _, err := packages_service.GetPackageBlobStream(ctx, pf, pb) if err != nil { apiError(ctx, http.StatusInternalServerError, err) return @@ -229,8 +228,6 @@ func servePackageFile(ctx *context.Context, params parameters, serveContent bool helper.ServePackageFile(ctx, s, u, pf, opts) } -var mavenUploadLock = sync.NewExclusivePool() - // UploadPackageFile adds a file to the package. If the package does not exist, it gets created. func UploadPackageFile(ctx *context.Context) { params, err := extractPathParameters(ctx) @@ -249,9 +246,6 @@ func UploadPackageFile(ctx *context.Context) { packageName := params.GroupID + "-" + params.ArtifactID - mavenUploadLock.CheckIn(packageName) - defer mavenUploadLock.CheckOut(packageName) - buf, err := packages_module.CreateHashedBufferFromReader(ctx.Req.Body) if err != nil { apiError(ctx, http.StatusInternalServerError, err) diff --git a/routers/api/packages/npm/api.go b/routers/api/packages/npm/api.go index e610c29b4d..b4379f3f49 100644 --- a/routers/api/packages/npm/api.go +++ b/routers/api/packages/npm/api.go @@ -10,9 +10,9 @@ import ( "net/url" "sort" - packages_model "forgejo.org/models/packages" - npm_module "forgejo.org/modules/packages/npm" - "forgejo.org/modules/setting" + packages_model "code.gitea.io/gitea/models/packages" + npm_module "code.gitea.io/gitea/modules/packages/npm" + "code.gitea.io/gitea/modules/setting" ) func createPackageMetadataResponse(registryURL string, pds []*packages_model.PackageDescriptor) *npm_module.PackageMetadata { diff --git a/routers/api/packages/npm/npm.go b/routers/api/packages/npm/npm.go index bf9d247b30..84acfffae2 100644 --- a/routers/api/packages/npm/npm.go +++ b/routers/api/packages/npm/npm.go @@ -12,19 +12,19 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - npm_module "forgejo.org/modules/packages/npm" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + 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/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + npm_module "code.gitea.io/gitea/modules/packages/npm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" "github.com/hashicorp/go-version" ) diff --git a/routers/api/packages/nuget/api_v2.go b/routers/api/packages/nuget/api_v2.go index 13c93316d5..a726065ad0 100644 --- a/routers/api/packages/nuget/api_v2.go +++ b/routers/api/packages/nuget/api_v2.go @@ -8,8 +8,8 @@ import ( "strings" "time" - packages_model "forgejo.org/models/packages" - nuget_module "forgejo.org/modules/packages/nuget" + packages_model "code.gitea.io/gitea/models/packages" + nuget_module "code.gitea.io/gitea/modules/packages/nuget" ) type AtomTitle struct { @@ -249,9 +249,6 @@ type FeedEntryProperties struct { Version string `xml:"d:Version"` NormalizedVersion string `xml:"d:NormalizedVersion"` Authors string `xml:"d:Authors"` - Owners string `xml:"d:Owners,omitempty"` - Copyright string `xml:"d:Copyright,omitempty"` - Language string `xml:"d:Language,omitempty"` Dependencies string `xml:"d:Dependencies"` Description string `xml:"d:Description"` VersionDownloadCount TypedValue[int64] `xml:"d:VersionDownloadCount"` @@ -261,15 +258,9 @@ type FeedEntryProperties struct { LastUpdated TypedValue[time.Time] `xml:"d:LastUpdated"` Published TypedValue[time.Time] `xml:"d:Published"` ProjectURL string `xml:"d:ProjectUrl,omitempty"` - LicenseURL string `xml:"d:LicenseUrl,omitempty"` - IconURL string `xml:"d:IconUrl,omitempty"` ReleaseNotes string `xml:"d:ReleaseNotes,omitempty"` RequireLicenseAcceptance TypedValue[bool] `xml:"d:RequireLicenseAcceptance"` - DevelopmentDependency TypedValue[bool] `xml:"d:DevelopmentDependency"` - Title string `xml:"d:Title,omitempty"` - MinClientVersion string `xml:"d:MinClientVersion,omitempty"` - Tags string `xml:"d:Tags,omitempty"` - ID string `xml:"d:Id,omitempty"` + Title string `xml:"d:Title"` } type FeedEntry struct { @@ -365,9 +356,6 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames Version: pd.Version.Version, NormalizedVersion: pd.Version.Version, Authors: metadata.Authors, - Owners: metadata.Owners, - Copyright: metadata.Copyright, - Language: metadata.Language, Dependencies: buildDependencyString(metadata), Description: metadata.Description, VersionDownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount}, @@ -377,15 +365,9 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames LastUpdated: createdValue, Published: createdValue, ProjectURL: metadata.ProjectURL, - LicenseURL: metadata.LicenseURL, - IconURL: metadata.IconURL, ReleaseNotes: metadata.ReleaseNotes, RequireLicenseAcceptance: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.RequireLicenseAcceptance}, - DevelopmentDependency: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.DevelopmentDependency}, - Title: metadata.Title, - MinClientVersion: metadata.MinClientVersion, - Tags: metadata.Tags, - ID: pd.Package.Name, + Title: pd.Package.Name, }, } diff --git a/routers/api/packages/nuget/api_v3.go b/routers/api/packages/nuget/api_v3.go index f1f5300523..2fe25dc0f8 100644 --- a/routers/api/packages/nuget/api_v3.go +++ b/routers/api/packages/nuget/api_v3.go @@ -7,8 +7,8 @@ import ( "sort" "time" - packages_model "forgejo.org/models/packages" - nuget_module "forgejo.org/modules/packages/nuget" + packages_model "code.gitea.io/gitea/models/packages" + nuget_module "code.gitea.io/gitea/modules/packages/nuget" "golang.org/x/text/collate" "golang.org/x/text/language" diff --git a/routers/api/packages/nuget/auth.go b/routers/api/packages/nuget/auth.go index bab08bb1b8..1bb68d059b 100644 --- a/routers/api/packages/nuget/auth.go +++ b/routers/api/packages/nuget/auth.go @@ -6,11 +6,11 @@ package nuget import ( "net/http" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - "forgejo.org/services/auth" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/services/auth" ) var _ auth.Method = &Auth{} diff --git a/routers/api/packages/nuget/nuget.go b/routers/api/packages/nuget/nuget.go index 254f4311c1..0d7212d7f7 100644 --- a/routers/api/packages/nuget/nuget.go +++ b/routers/api/packages/nuget/nuget.go @@ -14,18 +14,18 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - nuget_model "forgejo.org/models/packages/nuget" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - nuget_module "forgejo.org/modules/packages/nuget" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + nuget_model "code.gitea.io/gitea/models/packages/nuget" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + nuget_module "code.gitea.io/gitea/modules/packages/nuget" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) func apiError(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/pub/pub.go b/routers/api/packages/pub/pub.go index 1a1343083f..f87df52a29 100644 --- a/routers/api/packages/pub/pub.go +++ b/routers/api/packages/pub/pub.go @@ -13,16 +13,16 @@ import ( "strings" "time" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - pub_module "forgejo.org/modules/packages/pub" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + pub_module "code.gitea.io/gitea/modules/packages/pub" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) func jsonResponse(ctx *context.Context, status int, obj any) { diff --git a/routers/api/packages/pypi/pypi.go b/routers/api/packages/pypi/pypi.go index 360632570e..7824db1823 100644 --- a/routers/api/packages/pypi/pypi.go +++ b/routers/api/packages/pypi/pypi.go @@ -10,16 +10,15 @@ import ( "regexp" "sort" "strings" - "unicode" - packages_model "forgejo.org/models/packages" - packages_module "forgejo.org/modules/packages" - pypi_module "forgejo.org/modules/packages/pypi" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + packages_module "code.gitea.io/gitea/modules/packages" + pypi_module "code.gitea.io/gitea/modules/packages/pypi" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) // https://peps.python.org/pep-0426/#name @@ -121,7 +120,7 @@ func UploadPackageFile(ctx *context.Context) { } defer buf.Close() - _, _, hashSHA256, _, _ := buf.Sums() + _, _, hashSHA256, _ := buf.Sums() if !strings.EqualFold(ctx.Req.FormValue("sha256_digest"), hex.EncodeToString(hashSHA256)) { apiError(ctx, http.StatusBadRequest, "hash mismatch") @@ -140,30 +139,9 @@ func UploadPackageFile(ctx *context.Context) { return } - // Ensure ctx.Req.Form exists. - _ = ctx.Req.ParseForm() - - var homepageURL string - projectURLs := ctx.Req.Form["project_urls"] - for _, purl := range projectURLs { - label, url, found := strings.Cut(purl, ",") - if !found { - continue - } - if normalizeLabel(label) != "homepage" { - continue - } - homepageURL = strings.TrimSpace(url) - break - } - - if len(homepageURL) == 0 { - // TODO: Home-page is a deprecated metadata field. Remove this branch once it's no longer apart of the spec. - homepageURL = ctx.Req.FormValue("home_page") - } - - if !validation.IsValidURL(homepageURL) { - homepageURL = "" + projectURL := ctx.Req.FormValue("home_page") + if !validation.IsValidURL(projectURL) { + projectURL = "" } _, _, err = packages_service.CreatePackageOrAddFileToExisting( @@ -182,7 +160,7 @@ func UploadPackageFile(ctx *context.Context) { Description: ctx.Req.FormValue("description"), LongDescription: ctx.Req.FormValue("long_description"), Summary: ctx.Req.FormValue("summary"), - ProjectURL: homepageURL, + ProjectURL: projectURL, License: ctx.Req.FormValue("license"), RequiresPython: ctx.Req.FormValue("requires_python"), }, @@ -211,23 +189,6 @@ func UploadPackageFile(ctx *context.Context) { ctx.Status(http.StatusCreated) } -// Normalizes a Project-URL label. -// See https://packaging.python.org/en/latest/specifications/well-known-project-urls/#label-normalization. -func normalizeLabel(label string) string { - var builder strings.Builder - - // "A label is normalized by deleting all ASCII punctuation and whitespace, and then converting the result - // to lowercase." - for _, r := range label { - if unicode.IsPunct(r) || unicode.IsSpace(r) { - continue - } - builder.WriteRune(unicode.ToLower(r)) - } - - return builder.String() -} - func isValidNameAndVersion(packageName, packageVersion string) bool { return nameMatcher.MatchString(packageName) && versionMatcher.MatchString(packageVersion) } diff --git a/routers/api/packages/pypi/pypi_test.go b/routers/api/packages/pypi/pypi_test.go index 786105693f..3023692177 100644 --- a/routers/api/packages/pypi/pypi_test.go +++ b/routers/api/packages/pypi/pypi_test.go @@ -36,13 +36,3 @@ func TestIsValidNameAndVersion(t *testing.T) { assert.False(t, isValidNameAndVersion("test-name", "1.0.1aa")) assert.False(t, isValidNameAndVersion("test-name", "1.0.0-alpha.beta")) } - -func TestNormalizeLabel(t *testing.T) { - // Cases fetched from https://packaging.python.org/en/latest/specifications/well-known-project-urls/#label-normalization. - assert.Equal(t, "homepage", normalizeLabel("Homepage")) - assert.Equal(t, "homepage", normalizeLabel("Home-page")) - assert.Equal(t, "homepage", normalizeLabel("Home page")) - assert.Equal(t, "changelog", normalizeLabel("Change_Log")) - assert.Equal(t, "whatsnew", normalizeLabel("What's New?")) - assert.Equal(t, "github", normalizeLabel("github")) -} diff --git a/routers/api/packages/rpm/rpm.go b/routers/api/packages/rpm/rpm.go index cdbf893183..54fb01c854 100644 --- a/routers/api/packages/rpm/rpm.go +++ b/routers/api/packages/rpm/rpm.go @@ -11,18 +11,18 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - packages_module "forgejo.org/modules/packages" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - notify_service "forgejo.org/services/notify" - packages_service "forgejo.org/services/packages" - rpm_service "forgejo.org/services/packages/rpm" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + packages_module "code.gitea.io/gitea/modules/packages" + rpm_module "code.gitea.io/gitea/modules/packages/rpm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + notify_service "code.gitea.io/gitea/services/notify" + packages_service "code.gitea.io/gitea/services/packages" + rpm_service "code.gitea.io/gitea/services/packages/rpm" ) func apiError(ctx *context.Context, status int, obj any) { @@ -149,7 +149,7 @@ func UploadPackageFile(ctx *context.Context) { buf = signedBuf } - pck, err := rpm_module.ParsePackage(buf, "rpm") + pck, err := rpm_module.ParsePackage(buf) if err != nil { if errors.Is(err, util.ErrInvalidArgument) { apiError(ctx, http.StatusBadRequest, err) diff --git a/routers/api/packages/rubygems/rubygems.go b/routers/api/packages/rubygems/rubygems.go index eed19467ff..dfefe2c4fb 100644 --- a/routers/api/packages/rubygems/rubygems.go +++ b/routers/api/packages/rubygems/rubygems.go @@ -13,14 +13,14 @@ import ( "net/http" "strings" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - rubygems_module "forgejo.org/modules/packages/rubygems" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + rubygems_module "code.gitea.io/gitea/modules/packages/rubygems" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" ) const ( @@ -105,11 +105,9 @@ func ServePackageInfo(ctx *context.Context) { ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, packageName) if err != nil { apiError(ctx, http.StatusInternalServerError, err) - return } if len(versions) == 0 { apiError(ctx, http.StatusNotFound, fmt.Sprintf("Could not find package %s", packageName)) - return } result, err := buildInfoFileForPackage(ctx, versions) @@ -137,7 +135,6 @@ func ServeVersionsFile(ctx *context.Context) { ctx, ctx.Package.Owner.ID, packages_model.TypeRubyGems, pack.Name) if err != nil { apiError(ctx, http.StatusInternalServerError, err) - return } if len(versions) == 0 { // No versions left for this package, we should continue. @@ -147,20 +144,6 @@ func ServeVersionsFile(ctx *context.Context) { fmt.Fprintf(result, "%s ", pack.Name) for i, v := range versions { result.WriteString(v.Version) - - pd, err := packages_model.GetPackageDescriptor(ctx, v) - if err != nil { - apiError(ctx, http.StatusInternalServerError, err) - return - } - - metadata := pd.Metadata.(*rubygems_module.Metadata) - - if metadata.Platform != "ruby" { - result.WriteString("_") - result.WriteString(metadata.Platform) - } - if i != len(versions)-1 { result.WriteString(",") } @@ -169,7 +152,6 @@ func ServeVersionsFile(ctx *context.Context) { info, err := buildInfoFileForPackage(ctx, versions) if err != nil { apiError(ctx, http.StatusInternalServerError, err) - return } checksum := md5.Sum([]byte(*info)) @@ -431,11 +413,6 @@ func buildRequirementStringFromVersion(ctx *context.Context, version *packages_m additionalRequirements.WriteString(",rubygems:") writeRequirements(metadata.RequiredRubygemsVersion, additionalRequirements) } - - if metadata.Platform != "ruby" { - return fmt.Sprintf("%s-%s %s|%s", version.Version, metadata.Platform, dependencyRequirements, additionalRequirements), nil - } - return fmt.Sprintf("%s %s|%s", version.Version, dependencyRequirements, additionalRequirements), nil } diff --git a/routers/api/packages/swift/swift.go b/routers/api/packages/swift/swift.go index 304230a85e..a9da3ea9c2 100644 --- a/routers/api/packages/swift/swift.go +++ b/routers/api/packages/swift/swift.go @@ -12,22 +12,22 @@ import ( "sort" "strings" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - swift_module "forgejo.org/modules/packages/swift" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + swift_module "code.gitea.io/gitea/modules/packages/swift" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" "github.com/hashicorp/go-version" ) -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning const ( AcceptJSON = "application/vnd.swift.registry.v1+json" AcceptSwift = "application/vnd.swift.registry.v1+swift" @@ -35,9 +35,9 @@ const ( ) var ( - // https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#361-package-scope + // https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#361-package-scope scopePattern = regexp.MustCompile(`\A[a-zA-Z0-9][a-zA-Z0-9-]{0,38}\z`) - // https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#362-package-name + // https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#362-package-name namePattern = regexp.MustCompile(`\A[a-zA-Z0-9][a-zA-Z0-9-_]{0,99}\z`) ) @@ -49,7 +49,7 @@ type headers struct { Link string } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning func setResponseHeaders(resp http.ResponseWriter, h *headers) { if h.ContentType != "" { resp.Header().Set("Content-Type", h.ContentType) @@ -69,7 +69,7 @@ func setResponseHeaders(resp http.ResponseWriter, h *headers) { } } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#33-error-handling +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#33-error-handling func apiError(ctx *context.Context, status int, obj any) { // https://www.rfc-editor.org/rfc/rfc7807 type Problem struct { @@ -91,7 +91,7 @@ func apiError(ctx *context.Context, status int, obj any) { }) } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#35-api-versioning +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#35-api-versioning func CheckAcceptMediaType(requiredAcceptHeader string) func(ctx *context.Context) { return func(ctx *context.Context) { accept := ctx.Req.Header.Get("Accept") @@ -101,16 +101,6 @@ func CheckAcceptMediaType(requiredAcceptHeader string) func(ctx *context.Context } } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/PackageRegistryUsage.md#registry-authentication -func CheckAuthenticate(ctx *context.Context) { - if ctx.Doer == nil { - apiError(ctx, http.StatusUnauthorized, nil) - return - } - - ctx.Status(http.StatusOK) -} - func buildPackageID(scope, name string) string { return scope + "." + name } @@ -123,7 +113,7 @@ type EnumeratePackageVersionsResponse struct { Releases map[string]Release `json:"releases"` } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#41-list-package-releases +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#41-list-package-releases func EnumeratePackageVersions(ctx *context.Context) { packageScope := ctx.Params("scope") packageName := ctx.Params("name") @@ -180,7 +170,7 @@ type PackageVersionMetadataResponse struct { Metadata *swift_module.SoftwareSourceCode `json:"metadata"` } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-2 +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-2 func PackageVersionMetadata(ctx *context.Context) { id := buildPackageID(ctx.Params("scope"), ctx.Params("name")) @@ -238,7 +228,7 @@ func PackageVersionMetadata(ctx *context.Context) { }) } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#43-fetch-manifest-for-a-package-release +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#43-fetch-manifest-for-a-package-release func DownloadManifest(ctx *context.Context) { packageScope := ctx.Params("scope") packageName := ctx.Params("name") @@ -290,7 +280,7 @@ func DownloadManifest(ctx *context.Context) { }) } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-6 +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-6 func UploadPackageFile(ctx *context.Context) { packageScope := ctx.Params("scope") packageName := ctx.Params("name") @@ -389,7 +379,7 @@ func UploadPackageFile(ctx *context.Context) { ctx.Status(http.StatusCreated) } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-4 +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-4 func DownloadPackageFile(ctx *context.Context) { pv, err := packages_model.GetVersionByNameAndVersion(ctx, ctx.Package.Owner.ID, packages_model.TypeSwift, buildPackageID(ctx.Params("scope"), ctx.Params("name")), ctx.Params("version")) if err != nil { @@ -430,7 +420,7 @@ type LookupPackageIdentifiersResponse struct { Identifiers []string `json:"identifiers"` } -// https://github.com/swiftlang/swift-package-manager/blob/main/Documentation/PackageRegistry/Registry.md#endpoint-5 +// https://github.com/apple/swift-package-manager/blob/main/Documentation/Registry.md#endpoint-5 func LookupPackageIdentifiers(ctx *context.Context) { url := ctx.FormTrim("url") if url == "" { diff --git a/routers/api/packages/vagrant/vagrant.go b/routers/api/packages/vagrant/vagrant.go index 26131c2cf2..98a81da368 100644 --- a/routers/api/packages/vagrant/vagrant.go +++ b/routers/api/packages/vagrant/vagrant.go @@ -11,13 +11,13 @@ import ( "sort" "strings" - packages_model "forgejo.org/models/packages" - packages_module "forgejo.org/modules/packages" - vagrant_module "forgejo.org/modules/packages/vagrant" - "forgejo.org/modules/setting" - "forgejo.org/routers/api/packages/helper" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + packages_module "code.gitea.io/gitea/modules/packages" + vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/api/packages/helper" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" "github.com/hashicorp/go-version" ) diff --git a/routers/api/shared/middleware.go b/routers/api/shared/middleware.go index f56acbe1bf..e2ff004024 100644 --- a/routers/api/shared/middleware.go +++ b/routers/api/shared/middleware.go @@ -6,11 +6,13 @@ package shared import ( "net/http" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/routers/common" - "forgejo.org/services/auth" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" "github.com/go-chi/cors" ) @@ -49,6 +51,10 @@ func buildAuthGroup() *auth.Group { group.Add(&auth.ReverseProxy{}) } + if setting.IsWindows && auth_model.IsSSPIEnabled(db.DefaultContext) { + group.Add(&auth.SSPI{}) // it MUST be the last, see the comment of SSPI + } + return group } diff --git a/routers/api/v1/activitypub/actor.go b/routers/api/v1/activitypub/actor.go index 7568a2a7c8..4f128e74c4 100644 --- a/routers/api/v1/activitypub/actor.go +++ b/routers/api/v1/activitypub/actor.go @@ -7,11 +7,11 @@ package activitypub import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" diff --git a/routers/api/v1/activitypub/person.go b/routers/api/v1/activitypub/person.go index 1da7933418..995a148f0b 100644 --- a/routers/api/v1/activitypub/person.go +++ b/routers/api/v1/activitypub/person.go @@ -8,10 +8,10 @@ import ( "net/http" "strings" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" diff --git a/routers/api/v1/activitypub/repository.go b/routers/api/v1/activitypub/repository.go index c506840f1c..bc6e7905a6 100644 --- a/routers/api/v1/activitypub/repository.go +++ b/routers/api/v1/activitypub/repository.go @@ -8,12 +8,12 @@ import ( "net/http" "strings" - "forgejo.org/modules/forgefed" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/federation" + "code.gitea.io/gitea/modules/forgefed" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/federation" ap "github.com/go-ap/activitypub" ) @@ -70,8 +70,8 @@ func RepositoryInbox(ctx *context.APIContext) { repository := ctx.Repo.Repository log.Info("RepositoryInbox: repo: %v", repository) + form := web.GetForm(ctx) - // TODO: Decide between like/undo{like} activity httpStatus, title, err := federation.ProcessLikeActivity(ctx, form, repository.ID) if err != nil { ctx.Error(httpStatus, title, err) diff --git a/routers/api/v1/activitypub/repository_test.go b/routers/api/v1/activitypub/repository_test.go index 8d448a4356..acd588d99b 100644 --- a/routers/api/v1/activitypub/repository_test.go +++ b/routers/api/v1/activitypub/repository_test.go @@ -6,22 +6,22 @@ package activitypub import ( "testing" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/user" ) func Test_UserEmailValidate(t *testing.T) { sut := "ab@cd.ef" - if err := validation.ValidateEmail(sut); err != nil { + if err := user.ValidateEmail(sut); err != nil { t.Errorf("sut should be valid, %v, %v", sut, err) } sut = "83ce13c8-af0b-4112-8327-55a54e54e664@code.cartoon-aa.xyz" - if err := validation.ValidateEmail(sut); err != nil { + if err := user.ValidateEmail(sut); err != nil { t.Errorf("sut should be valid, %v, %v", sut, err) } sut = "1" - if err := validation.ValidateEmail(sut); err == nil { + if err := user.ValidateEmail(sut); err == nil { t.Errorf("sut should not be valid, %v", sut) } } diff --git a/routers/api/v1/activitypub/reqsignature.go b/routers/api/v1/activitypub/reqsignature.go index a9bb4bd868..6003f664a0 100644 --- a/routers/api/v1/activitypub/reqsignature.go +++ b/routers/api/v1/activitypub/reqsignature.go @@ -12,14 +12,14 @@ import ( "net/http" "net/url" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/httplib" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - gitea_context "forgejo.org/services/context" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + gitea_context "code.gitea.io/gitea/services/context" - "github.com/42wim/httpsig" ap "github.com/go-ap/activitypub" + "github.com/go-fed/httpsig" ) func getPublicKeyFromResponse(b []byte, keyID *url.URL) (p crypto.PublicKey, err error) { diff --git a/routers/api/v1/activitypub/response.go b/routers/api/v1/activitypub/response.go index a97f363cc2..42ef375f12 100644 --- a/routers/api/v1/activitypub/response.go +++ b/routers/api/v1/activitypub/response.go @@ -6,10 +6,10 @@ package activitypub import ( "net/http" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/forgefed" - "forgejo.org/modules/log" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/forgefed" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ap "github.com/go-ap/activitypub" "github.com/go-ap/jsonld" diff --git a/routers/api/v1/admin/adopt.go b/routers/api/v1/admin/adopt.go index 082411f2bc..a4708fe032 100644 --- a/routers/api/v1/admin/adopt.go +++ b/routers/api/v1/admin/adopt.go @@ -6,12 +6,12 @@ package admin import ( "net/http" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/util" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) // ListUnadoptedRepositories lists the unadopted repositories that match the provided names diff --git a/routers/api/v1/admin/cron.go b/routers/api/v1/admin/cron.go index 5d68ab2dce..e1ca6048c9 100644 --- a/routers/api/v1/admin/cron.go +++ b/routers/api/v1/admin/cron.go @@ -6,12 +6,12 @@ package admin import ( "net/http" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/cron" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/cron" ) // ListCronTasks api for getting cron tasks diff --git a/routers/api/v1/admin/email.go b/routers/api/v1/admin/email.go index 906780a44b..ba963e9f69 100644 --- a/routers/api/v1/admin/email.go +++ b/routers/api/v1/admin/email.go @@ -6,11 +6,11 @@ package admin import ( "net/http" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetAllEmails diff --git a/routers/api/v1/admin/hooks.go b/routers/api/v1/admin/hooks.go index b3db2eb5e3..b246cb61b1 100644 --- a/routers/api/v1/admin/hooks.go +++ b/routers/api/v1/admin/hooks.go @@ -7,14 +7,14 @@ import ( "errors" "net/http" - "forgejo.org/models/webhook" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) // ListHooks list system's webhooks diff --git a/routers/api/v1/admin/org.go b/routers/api/v1/admin/org.go index d3a5cea056..a5c299bbf0 100644 --- a/routers/api/v1/admin/org.go +++ b/routers/api/v1/admin/org.go @@ -7,14 +7,14 @@ package admin import ( "net/http" - "forgejo.org/models/db" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // CreateOrg api for create organization diff --git a/routers/api/v1/admin/quota.go b/routers/api/v1/admin/quota.go index c7da0e6398..1e7c11e007 100644 --- a/routers/api/v1/admin/quota.go +++ b/routers/api/v1/admin/quota.go @@ -6,9 +6,9 @@ package admin import ( "net/http" - quota_model "forgejo.org/models/quota" - "forgejo.org/services/context" - "forgejo.org/services/convert" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetUserQuota return information about a user's quota diff --git a/routers/api/v1/admin/quota_group.go b/routers/api/v1/admin/quota_group.go index afe33b639c..e20b361eb5 100644 --- a/routers/api/v1/admin/quota_group.go +++ b/routers/api/v1/admin/quota_group.go @@ -7,12 +7,12 @@ import ( go_context "context" "net/http" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListQuotaGroups returns all the quota groups diff --git a/routers/api/v1/admin/quota_rule.go b/routers/api/v1/admin/quota_rule.go index ea188107fa..85c05e1e9b 100644 --- a/routers/api/v1/admin/quota_rule.go +++ b/routers/api/v1/admin/quota_rule.go @@ -7,11 +7,11 @@ import ( "fmt" "net/http" - quota_model "forgejo.org/models/quota" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" + quota_model "code.gitea.io/gitea/models/quota" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func toLimitSubjects(subjStrings []string) (*quota_model.LimitSubjects, error) { diff --git a/routers/api/v1/admin/repo.go b/routers/api/v1/admin/repo.go index 9f9118e0ab..c119d5390a 100644 --- a/routers/api/v1/admin/repo.go +++ b/routers/api/v1/admin/repo.go @@ -4,10 +4,10 @@ package admin import ( - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/repo" - "forgejo.org/services/context" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/repo" + "code.gitea.io/gitea/services/context" ) // CreateRepo api for creating a repository diff --git a/routers/api/v1/admin/runners.go b/routers/api/v1/admin/runners.go index e459b947ff..329242d9f6 100644 --- a/routers/api/v1/admin/runners.go +++ b/routers/api/v1/admin/runners.go @@ -4,8 +4,8 @@ package admin import ( - "forgejo.org/routers/api/v1/shared" - "forgejo.org/services/context" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/services/context" ) // https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization @@ -24,23 +24,3 @@ func GetRegistrationToken(ctx *context.APIContext) { shared.GetRegistrationToken(ctx, 0, 0) } - -// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters -func SearchActionRunJobs(ctx *context.APIContext) { - // swagger:operation GET /admin/runners/jobs admin adminSearchRunJobs - // --- - // summary: Search action jobs according filter conditions - // produces: - // - application/json - // parameters: - // - name: labels - // in: query - // description: a comma separated list of run job labels to search for - // type: string - // responses: - // "200": - // "$ref": "#/responses/RunJobList" - // "403": - // "$ref": "#/responses/forbidden" - shared.GetActionRunJobs(ctx, 0, 0) -} diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 32e1dd414d..9ea210ee4e 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -8,28 +8,26 @@ import ( "errors" "fmt" "net/http" - "strconv" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/user" - "forgejo.org/routers/api/v1/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/mailer" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/auth/password" + "code.gitea.io/gitea/modules/log" + "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/web" + "code.gitea.io/gitea/routers/api/v1/user" + "code.gitea.io/gitea/routers/api/v1/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/mailer" + user_service "code.gitea.io/gitea/services/user" ) func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64) { @@ -140,8 +138,8 @@ func CreateUser(ctx *context.APIContext) { user_model.IsErrEmailAlreadyUsed(err) || db.IsErrNameReserved(err) || db.IsErrNameCharsNotAllowed(err) || - validation.IsErrEmailCharIsNotSupported(err) || - validation.IsErrEmailInvalid(err) || + user_model.IsErrEmailCharIsNotSupported(err) || + user_model.IsErrEmailInvalid(err) || db.IsErrNamePatternNotAllowed(err) { ctx.Error(http.StatusUnprocessableEntity, "", err) } else { @@ -150,7 +148,7 @@ func CreateUser(ctx *context.APIContext) { return } - if !validation.IsEmailDomainAllowed(u.Email) { + if !user_model.IsEmailDomainAllowed(u.Email) { ctx.Resp.Header().Add("X-Gitea-Warning", fmt.Sprintf("the domain of user email %s conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST", u.Email)) } @@ -226,7 +224,7 @@ func EditUser(ctx *context.APIContext) { if form.Email != nil { if err := user_service.AdminAddOrSetPrimaryEmailAddress(ctx, ctx.ContextUser, *form.Email); err != nil { switch { - case validation.IsErrEmailCharIsNotSupported(err), validation.IsErrEmailInvalid(err): + case user_model.IsErrEmailCharIsNotSupported(err), user_model.IsErrEmailInvalid(err): ctx.Error(http.StatusBadRequest, "EmailInvalid", err) case user_model.IsErrEmailAlreadyUsed(err): ctx.Error(http.StatusBadRequest, "EmailUsed", err) @@ -236,7 +234,7 @@ func EditUser(ctx *context.APIContext) { return } - if !validation.IsEmailDomainAllowed(*form.Email) { + if !user_model.IsEmailDomainAllowed(*form.Email) { ctx.Resp.Header().Add("X-Gitea-Warning", fmt.Sprintf("the domain of user email %s conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST", *form.Email)) } } @@ -416,11 +414,6 @@ func SearchUsers(ctx *context.APIContext) { // in: query // description: user's login name to search for // type: string - // - name: sort - // in: query - // description: sort order of results - // type: string - // enum: [oldest, newest, alphabetically, reversealphabetically, recentupdate, leastupdate] // - name: page // in: query // description: page number of results to return (1-based) @@ -437,40 +430,12 @@ func SearchUsers(ctx *context.APIContext) { listOptions := utils.GetListOptions(ctx) - sort := ctx.FormString("sort") - var orderBy db.SearchOrderBy - - switch sort { - case "oldest": - orderBy = db.SearchOrderByOldest - case "newest": - orderBy = db.SearchOrderByNewest - case "alphabetically": - orderBy = db.SearchOrderByAlphabetically - case "reversealphabetically": - orderBy = db.SearchOrderByAlphabeticallyReverse - case "recentupdate": - orderBy = db.SearchOrderByRecentUpdated - case "leastupdate": - orderBy = db.SearchOrderByLeastUpdated - default: - orderBy = db.SearchOrderByAlphabetically - } - - intSource, err := strconv.ParseInt(ctx.FormString("source_id"), 10, 64) - var sourceID optional.Option[int64] - if ctx.FormString("source_id") == "" || err != nil { - sourceID = optional.None[int64]() - } else { - sourceID = optional.Some(intSource) - } - users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ Actor: ctx.Doer, Type: user_model.UserTypeIndividual, LoginName: ctx.FormTrim("login_name"), - SourceID: sourceID, - OrderBy: orderBy, + SourceID: ctx.FormInt64("source_id"), + OrderBy: db.SearchOrderByAlphabetically, ListOptions: listOptions, }) if err != nil { @@ -523,7 +488,7 @@ func RenameUser(ctx *context.APIContext) { newName := web.GetForm(ctx).(*api.RenameUserOption).NewName // Check if user name has been changed - if err := user_service.AdminRenameUser(ctx, ctx.ContextUser, newName); err != nil { + if err := user_service.RenameUser(ctx, ctx.ContextUser, newName); err != nil { switch { case user_model.IsErrUserAlreadyExist(err): ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("form.username_been_taken")) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 2eb1ee4229..6e4a97b885 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -71,39 +71,39 @@ import ( "net/http" "strings" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/forgefed" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/shared" - "forgejo.org/routers/api/v1/activitypub" - "forgejo.org/routers/api/v1/admin" - "forgejo.org/routers/api/v1/misc" - "forgejo.org/routers/api/v1/notify" - "forgejo.org/routers/api/v1/org" - "forgejo.org/routers/api/v1/packages" - "forgejo.org/routers/api/v1/repo" - "forgejo.org/routers/api/v1/settings" - "forgejo.org/routers/api/v1/user" - "forgejo.org/services/actions" - "forgejo.org/services/auth" - "forgejo.org/services/context" - "forgejo.org/services/forms" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + 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/forgefed" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/shared" + "code.gitea.io/gitea/routers/api/v1/activitypub" + "code.gitea.io/gitea/routers/api/v1/admin" + "code.gitea.io/gitea/routers/api/v1/misc" + "code.gitea.io/gitea/routers/api/v1/notify" + "code.gitea.io/gitea/routers/api/v1/org" + "code.gitea.io/gitea/routers/api/v1/packages" + "code.gitea.io/gitea/routers/api/v1/repo" + "code.gitea.io/gitea/routers/api/v1/settings" + "code.gitea.io/gitea/routers/api/v1/user" + "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" - _ "forgejo.org/routers/api/v1/swagger" // for swagger generation + _ "code.gitea.io/gitea/routers/api/v1/swagger" // for swagger generation - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) func sudo() func(ctx *context.APIContext) { @@ -395,20 +395,12 @@ func reqToken() func(ctx *context.APIContext) { func reqExploreSignIn() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { - if (setting.Service.RequireSignInView || setting.Service.Explore.RequireSigninView) && !ctx.IsSigned { + if setting.Service.Explore.RequireSigninView && !ctx.IsSigned { ctx.Error(http.StatusUnauthorized, "reqExploreSignIn", "you must be signed in to search for users") } } } -func reqUsersExploreEnabled() func(ctx *context.APIContext) { - return func(ctx *context.APIContext) { - if setting.Service.Explore.DisableUsersPage { - ctx.NotFound() - } - } -} - func reqBasicOrRevProxyAuth() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { if ctx.IsSigned && setting.Service.EnableReverseProxyAuthAPI && ctx.Data["AuthedMethod"].(string) == auth.ReverseProxyMethodName { @@ -822,7 +814,6 @@ func Routes() *web.Route { m.Group("/runners", func() { m.Get("/registration-token", reqToken(), reqChecker, act.GetRegistrationToken) - m.Get("/jobs", reqToken(), reqChecker, act.SearchActionRunJobs) }) }) } @@ -896,7 +887,7 @@ func Routes() *web.Route { // Users (requires user scope) m.Group("/users", func() { - m.Get("/search", reqExploreSignIn(), reqUsersExploreEnabled(), user.Search) + m.Get("/search", reqExploreSignIn(), user.Search) m.Group("/{username}", func() { m.Get("", reqExploreSignIn(), user.GetInfo) @@ -908,9 +899,9 @@ func Routes() *web.Route { m.Get("/repos", tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository), reqExploreSignIn(), user.ListUserRepos) m.Group("/tokens", func() { m.Combo("").Get(user.ListAccessTokens). - Post(bind(api.CreateAccessTokenOption{}), reqBasicOrRevProxyAuth(), reqToken(), user.CreateAccessToken) - m.Combo("/{id}").Delete(reqBasicOrRevProxyAuth(), reqToken(), user.DeleteAccessToken) - }, reqSelfOrAdmin()) + Post(bind(api.CreateAccessTokenOption{}), reqToken(), user.CreateAccessToken) + m.Combo("/{id}").Delete(reqToken(), user.DeleteAccessToken) + }, reqSelfOrAdmin(), reqBasicOrRevProxyAuth()) m.Get("/activities/feeds", user.ListUserActivityFeeds) }, context.UserAssignmentAPI(), checkTokenPublicOnly(), individualPermsChecker) @@ -976,7 +967,6 @@ func Routes() *web.Route { m.Group("/runners", func() { m.Get("/registration-token", reqToken(), user.GetRegistrationToken) - m.Get("/jobs", reqToken(), user.SearchActionRunJobs) }) }) @@ -1155,7 +1145,6 @@ func Routes() *web.Route { m.Get("/*", repo.GetBranch) m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteBranch) m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateBranchRepoOption{}), context.EnforceQuotaAPI(quota_model.LimitSubjectSizeGitAll, context.QuotaTargetRepo), repo.CreateBranch) - m.Patch("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.UpdateBranchRepoOption{}), repo.UpdateBranch) }, context.ReferencesGitRepo(), reqRepoReader(unit.TypeCode)) m.Group("/branch_protections", func() { m.Get("", repo.ListBranchProtections) @@ -1319,11 +1308,7 @@ func Routes() *web.Route { m.Get("/trees/{sha}", repo.GetTree) m.Get("/blobs/{sha}", repo.GetBlob) m.Get("/tags/{sha}", repo.GetAnnotatedTag) - m.Group("/notes/{sha}", func() { - m.Get("", repo.GetNote) - m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), bind(api.NoteOptions{}), repo.SetNote) - m.Delete("", reqToken(), reqRepoWriter(unit.TypeCode), repo.RemoveNote) - }) + m.Get("/notes/{sha}", repo.GetNote) }, context.ReferencesGitRepo(true), reqRepoReader(unit.TypeCode)) m.Post("/diffpatch", reqRepoWriter(unit.TypeCode), reqToken(), bind(api.ApplyDiffPatchFileOptions{}), mustNotBeArchived, context.EnforceQuotaAPI(quota_model.LimitSubjectSizeReposAll, context.QuotaTargetRepo), repo.ApplyDiffPatch) m.Group("/contents", func() { @@ -1355,8 +1340,6 @@ func Routes() *web.Route { m.Post("", bind(api.UpdateRepoAvatarOption{}), repo.UpdateAvatar) m.Delete("", repo.DeleteAvatar) }, reqAdmin(), reqToken()) - - m.Get("/{ball_type:tarball|zipball|bundle}/*", reqRepoReader(unit.TypeCode), repo.DownloadArchive) }, repoAssignment(), checkTokenPublicOnly()) }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryRepository)) @@ -1485,19 +1468,13 @@ func Routes() *web.Route { // NOTE: these are Gitea package management API - see packages.CommonRoutes and packages.DockerContainerRoutes for endpoints that implement package manager APIs m.Group("/packages/{username}", func() { - m.Group("/{type}/{name}", func() { - m.Group("/{version}", func() { - m.Get("", packages.GetPackage) - m.Delete("", reqPackageAccess(perm.AccessModeWrite), packages.DeletePackage) - m.Get("/files", packages.ListPackageFiles) - }) - - m.Post("/-/link/{repo_name}", reqPackageAccess(perm.AccessModeWrite), packages.LinkPackage) - m.Post("/-/unlink", reqPackageAccess(perm.AccessModeWrite), packages.UnlinkPackage) + m.Group("/{type}/{name}/{version}", func() { + m.Get("", reqToken(), packages.GetPackage) + m.Delete("", reqToken(), reqPackageAccess(perm.AccessModeWrite), packages.DeletePackage) + m.Get("/files", reqToken(), packages.ListPackageFiles) }) - - m.Get("/", packages.ListPackages) - }, reqToken(), tokenRequiresScopes(auth_model.AccessTokenScopeCategoryPackage), context.UserAssignmentAPI(), context.PackageAssignmentAPI(), reqPackageAccess(perm.AccessModeRead), checkTokenPublicOnly()) + m.Get("/", reqToken(), packages.ListPackages) + }, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryPackage), context.UserAssignmentAPI(), context.PackageAssignmentAPI(), reqPackageAccess(perm.AccessModeRead), checkTokenPublicOnly()) // Organizations m.Get("/user/orgs", reqToken(), tokenRequiresScopes(auth_model.AccessTokenScopeCategoryUser, auth_model.AccessTokenScopeCategoryOrganization), org.ListMyOrgs) @@ -1511,7 +1488,6 @@ func Routes() *web.Route { m.Combo("").Get(org.Get). Patch(reqToken(), reqOrgOwnership(), bind(api.EditOrgOption{}), org.Edit). Delete(reqToken(), reqOrgOwnership(), org.Delete) - m.Post("/rename", reqToken(), reqOrgOwnership(), bind(api.RenameOrgOption{}), org.Rename) m.Combo("/repos").Get(user.ListOrgRepos). Post(reqToken(), bind(api.CreateRepoOption{}), context.EnforceQuotaAPI(quota_model.LimitSubjectSizeReposAll, context.QuotaTargetOrg), repo.CreateOrgRepo) m.Group("/members", func() { @@ -1640,7 +1616,6 @@ func Routes() *web.Route { }) m.Group("/runners", func() { m.Get("/registration-token", admin.GetRegistrationToken) - m.Get("/jobs", admin.SearchActionRunJobs) }) if setting.Quota.Enabled { m.Group("/quota", func() { diff --git a/routers/api/v1/misc/gitignore.go b/routers/api/v1/misc/gitignore.go index ec57038a9b..dffd771752 100644 --- a/routers/api/v1/misc/gitignore.go +++ b/routers/api/v1/misc/gitignore.go @@ -6,11 +6,11 @@ package misc import ( "net/http" - "forgejo.org/modules/options" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/options" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) // Shows a list of all Gitignore templates diff --git a/routers/api/v1/misc/label_templates.go b/routers/api/v1/misc/label_templates.go index dad5ee34c1..cc11f37626 100644 --- a/routers/api/v1/misc/label_templates.go +++ b/routers/api/v1/misc/label_templates.go @@ -6,10 +6,10 @@ package misc import ( "net/http" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/util" - "forgejo.org/services/context" - "forgejo.org/services/convert" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // Shows a list of all Label templates diff --git a/routers/api/v1/misc/licenses.go b/routers/api/v1/misc/licenses.go index c9b657a890..2a980f5084 100644 --- a/routers/api/v1/misc/licenses.go +++ b/routers/api/v1/misc/licenses.go @@ -8,12 +8,12 @@ import ( "net/http" "net/url" - "forgejo.org/modules/options" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/options" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) // Returns a list of all License templates diff --git a/routers/api/v1/misc/markup.go b/routers/api/v1/misc/markup.go index e9f03fdd5c..9699c79368 100644 --- a/routers/api/v1/misc/markup.go +++ b/routers/api/v1/misc/markup.go @@ -6,12 +6,12 @@ package misc import ( "net/http" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" ) // Markup render markup document to HTML @@ -41,16 +41,7 @@ func Markup(ctx *context.APIContext) { return } - re := common.Renderer{ - Mode: form.Mode, - Text: form.Text, - URLPrefix: form.Context, - FilePath: form.FilePath, - BranchPath: form.BranchPath, - IsWiki: form.Wiki, - } - - re.RenderMarkup(ctx.Base, ctx.Repo) + common.RenderMarkup(ctx.Base, ctx.Repo, form.Mode, form.Text, form.Context, form.FilePath, form.Wiki) } // Markdown render markdown document to HTML @@ -85,14 +76,7 @@ func Markdown(ctx *context.APIContext) { mode = form.Mode } - re := common.Renderer{ - Mode: mode, - Text: form.Text, - URLPrefix: form.Context, - IsWiki: form.Wiki, - } - - re.RenderMarkup(ctx.Base, ctx.Repo) + common.RenderMarkup(ctx.Base, ctx.Repo, mode, form.Text, form.Context, "", form.Wiki) } // MarkdownRaw render raw markdown HTML diff --git a/routers/api/v1/misc/markup_test.go b/routers/api/v1/misc/markup_test.go index 3335199e12..5236fd06ae 100644 --- a/routers/api/v1/misc/markup_test.go +++ b/routers/api/v1/misc/markup_test.go @@ -10,11 +10,11 @@ import ( "strings" "testing" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) @@ -76,7 +76,7 @@ func TestAPI_RenderGFM(t *testing.T) { `, // Guard wiki sidebar: special syntax @@ -112,7 +112,7 @@ Here are some links to the most important topics. You can find the full list of

      Here are some links to the most important topics. You can find the full list of pages at the sidebar.

      Configuration -

      +images/icon-bug.png

      `, } diff --git a/routers/api/v1/misc/nodeinfo.go b/routers/api/v1/misc/nodeinfo.go index 9631de7edd..9c2a0db8d2 100644 --- a/routers/api/v1/misc/nodeinfo.go +++ b/routers/api/v1/misc/nodeinfo.go @@ -7,20 +7,20 @@ import ( "net/http" "time" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/services/context" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" ) const cacheKeyNodeInfoUsage = "API_NodeInfoUsage" -// NodeInfo returns the NodeInfo for the Forgejo instance to allow for federation +// NodeInfo returns the NodeInfo for the Gitea instance to allow for federation func NodeInfo(ctx *context.APIContext) { // swagger:operation GET /nodeinfo miscellaneous getNodeInfo // --- - // summary: Returns the nodeinfo of the Forgejo application + // summary: Returns the nodeinfo of the Gitea application // produces: // - application/json // responses: diff --git a/routers/api/v1/misc/signing.go b/routers/api/v1/misc/signing.go index 945df6068f..24a46c1e70 100644 --- a/routers/api/v1/misc/signing.go +++ b/routers/api/v1/misc/signing.go @@ -7,8 +7,8 @@ import ( "fmt" "net/http" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" ) // SigningKey returns the public key of the default signing key if it exists diff --git a/routers/api/v1/misc/version.go b/routers/api/v1/misc/version.go index 5802c12462..e3b43a0e6b 100644 --- a/routers/api/v1/misc/version.go +++ b/routers/api/v1/misc/version.go @@ -6,16 +6,16 @@ package misc import ( "net/http" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" ) // Version shows the version of the Gitea server func Version(ctx *context.APIContext) { // swagger:operation GET /version miscellaneous getVersion // --- - // summary: Returns the version of the running application + // summary: Returns the version of the Gitea application // produces: // - application/json // responses: diff --git a/routers/api/v1/notify/notifications.go b/routers/api/v1/notify/notifications.go index 2e19fa0b9c..46b3c7f5e7 100644 --- a/routers/api/v1/notify/notifications.go +++ b/routers/api/v1/notify/notifications.go @@ -7,11 +7,11 @@ import ( "net/http" "strings" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" ) // NewAvailable check if unread notifications exist diff --git a/routers/api/v1/notify/repo.go b/routers/api/v1/notify/repo.go index 64a9654d48..1744426ee8 100644 --- a/routers/api/v1/notify/repo.go +++ b/routers/api/v1/notify/repo.go @@ -8,11 +8,11 @@ import ( "strings" "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func statusStringToNotificationStatus(status string) activities_model.NotificationStatus { diff --git a/routers/api/v1/notify/threads.go b/routers/api/v1/notify/threads.go index 57c78f5f15..8e12d359cb 100644 --- a/routers/api/v1/notify/threads.go +++ b/routers/api/v1/notify/threads.go @@ -7,11 +7,11 @@ import ( "fmt" "net/http" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/services/context" - "forgejo.org/services/convert" + 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/services/context" + "code.gitea.io/gitea/services/convert" ) // GetThread get notification by ID diff --git a/routers/api/v1/notify/user.go b/routers/api/v1/notify/user.go index 2b8cc8c112..879f484cce 100644 --- a/routers/api/v1/notify/user.go +++ b/routers/api/v1/notify/user.go @@ -7,11 +7,11 @@ import ( "net/http" "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListNotifications list users's notification threads diff --git a/routers/api/v1/org/action.go b/routers/api/v1/org/action.go index 0d8550a019..03a1fa8ccc 100644 --- a/routers/api/v1/org/action.go +++ b/routers/api/v1/org/action.go @@ -7,17 +7,17 @@ import ( "errors" "net/http" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - secret_model "forgejo.org/models/secret" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/shared" - "forgejo.org/routers/api/v1/utils" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" - secret_service "forgejo.org/services/secrets" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + secret_model "code.gitea.io/gitea/models/secret" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/routers/api/v1/utils" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" + secret_service "code.gitea.io/gitea/services/secrets" ) // ListActionsSecrets list an organization's actions secrets @@ -189,31 +189,6 @@ func (Action) GetRegistrationToken(ctx *context.APIContext) { shared.GetRegistrationToken(ctx, ctx.Org.Organization.ID, 0) } -// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters -func (Action) SearchActionRunJobs(ctx *context.APIContext) { - // swagger:operation GET /orgs/{org}/actions/runners/jobs organization orgSearchRunJobs - // --- - // summary: Search for organization's action jobs according filter conditions - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: name of the organization - // type: string - // required: true - // - name: labels - // in: query - // description: a comma separated list of run job labels to search for - // type: string - // responses: - // "200": - // "$ref": "#/responses/RunJobList" - // "403": - // "$ref": "#/responses/forbidden" - shared.GetActionRunJobs(ctx, ctx.Org.Organization.ID, 0) -} - // ListVariables list org-level variables func (Action) ListVariables(ctx *context.APIContext) { // swagger:operation GET /orgs/{org}/actions/variables organization getOrgVariablesList @@ -475,7 +450,7 @@ func (Action) UpdateVariable(ctx *context.APIContext) { if opt.Name == "" { opt.Name = ctx.Params("variablename") } - if _, err := actions_service.UpdateVariable(ctx, v.ID, ctx.Org.Organization.ID, 0, opt.Name, opt.Value); err != nil { + if _, err := actions_service.UpdateVariable(ctx, v.ID, opt.Name, opt.Value); err != nil { if errors.Is(err, util.ErrInvalidArgument) { ctx.Error(http.StatusBadRequest, "UpdateVariable", err) } else { diff --git a/routers/api/v1/org/avatar.go b/routers/api/v1/org/avatar.go index 824a9f3495..f11eb6c1cd 100644 --- a/routers/api/v1/org/avatar.go +++ b/routers/api/v1/org/avatar.go @@ -7,10 +7,10 @@ import ( "encoding/base64" "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) // UpdateAvatarupdates the Avatar of an Organisation diff --git a/routers/api/v1/org/hook.go b/routers/api/v1/org/hook.go index 2877acd3c7..c1dc0519ea 100644 --- a/routers/api/v1/org/hook.go +++ b/routers/api/v1/org/hook.go @@ -6,11 +6,11 @@ package org import ( "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) // ListHooks list an organziation's webhooks diff --git a/routers/api/v1/org/label.go b/routers/api/v1/org/label.go index 172d531229..b5ec54ccf4 100644 --- a/routers/api/v1/org/label.go +++ b/routers/api/v1/org/label.go @@ -8,13 +8,13 @@ import ( "strconv" "strings" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/label" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/label" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListLabels list all the labels of an organization diff --git a/routers/api/v1/org/member.go b/routers/api/v1/org/member.go index c6e67b2ab9..fb66d4c3f5 100644 --- a/routers/api/v1/org/member.go +++ b/routers/api/v1/org/member.go @@ -7,23 +7,22 @@ import ( "net/http" "net/url" - "forgejo.org/models" - "forgejo.org/models/organization" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/user" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/user" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // listMembers list an organization's members -func listMembers(ctx *context.APIContext, isMember bool) { +func listMembers(ctx *context.APIContext, publicOnly bool) { opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - IsDoerMember: isMember, - OrgID: ctx.Org.Organization.ID, - ListOptions: utils.GetListOptions(ctx), + OrgID: ctx.Org.Organization.ID, + PublicOnly: publicOnly, + ListOptions: utils.GetListOptions(ctx), } count, err := organization.CountOrgMembers(ctx, opts) @@ -74,19 +73,16 @@ func ListMembers(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - var ( - isMember bool - err error - ) - + publicOnly := true if ctx.Doer != nil { - isMember, err = ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID) + isMember, err := ctx.Org.Organization.IsOrgMember(ctx, ctx.Doer.ID) if err != nil { ctx.Error(http.StatusInternalServerError, "IsOrgMember", err) return } + publicOnly = !isMember && !ctx.Doer.IsAdmin } - listMembers(ctx, isMember) + listMembers(ctx, publicOnly) } // ListPublicMembers list an organization's public members @@ -116,7 +112,7 @@ func ListPublicMembers(ctx *context.APIContext) { // "404": // "$ref": "#/responses/notFound" - listMembers(ctx, false) + listMembers(ctx, true) } // IsMember check if a user is a member of an organization diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index fcf2c6b412..3623b85b96 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -8,21 +8,20 @@ import ( "fmt" "net/http" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - api "forgejo.org/modules/structs" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/user" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/org" - user_service "forgejo.org/services/user" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/user" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/org" + user_service "code.gitea.io/gitea/services/user" ) func listUserOrgs(ctx *context.APIContext, u *user_model.User) { @@ -320,44 +319,6 @@ func Get(ctx *context.APIContext) { ctx.JSON(http.StatusOK, org) } -func Rename(ctx *context.APIContext) { - // swagger:operation POST /orgs/{org}/rename organization renameOrg - // --- - // summary: Rename an organization - // produces: - // - application/json - // parameters: - // - name: org - // in: path - // description: existing org name - // type: string - // required: true - // - name: body - // in: body - // required: true - // schema: - // "$ref": "#/definitions/RenameOrgOption" - // responses: - // "204": - // "$ref": "#/responses/empty" - // "403": - // "$ref": "#/responses/forbidden" - // "422": - // "$ref": "#/responses/validationError" - - form := web.GetForm(ctx).(*api.RenameOrgOption) - orgUser := ctx.Org.Organization.AsUser() - if err := user_service.RenameUser(ctx, orgUser, form.NewName); err != nil { - if user_model.IsErrUserAlreadyExist(err) || db.IsErrNameReserved(err) || db.IsErrNamePatternNotAllowed(err) || db.IsErrNameCharsNotAllowed(err) { - ctx.Error(http.StatusUnprocessableEntity, "RenameOrg", err) - } else { - ctx.ServerError("RenameOrg", err) - } - return - } - ctx.Status(http.StatusNoContent) -} - // Edit change an organization's information func Edit(ctx *context.APIContext) { // swagger:operation PATCH /orgs/{org} organization orgEdit @@ -383,28 +344,13 @@ func Edit(ctx *context.APIContext) { // "$ref": "#/responses/Organization" // "404": // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/error" form := web.GetForm(ctx).(*api.EditOrgOption) - if form.Email != nil { - if *form.Email == "" { - err := user_model.DeletePrimaryEmailAddressOfUser(ctx, ctx.Org.Organization.ID) - if err != nil { - ctx.Error(http.StatusInternalServerError, "DeletePrimaryEmailAddressOfUser", err) - return - } - ctx.Org.Organization.Email = "" - } else { - if err := user_service.ReplacePrimaryEmailAddress(ctx, ctx.Org.Organization.AsUser(), *form.Email); err != nil { - if validation.IsErrEmailInvalid(err) || validation.IsErrEmailCharIsNotSupported(err) { - ctx.Error(http.StatusUnprocessableEntity, "ReplacePrimaryEmailAddress", err) - } else { - ctx.Error(http.StatusInternalServerError, "ReplacePrimaryEmailAddress", err) - } - return - } + if form.Email != "" { + if err := user_service.ReplacePrimaryEmailAddress(ctx, ctx.Org.Organization.AsUser(), form.Email); err != nil { + ctx.Error(http.StatusInternalServerError, "ReplacePrimaryEmailAddress", err) + return } } diff --git a/routers/api/v1/org/quota.go b/routers/api/v1/org/quota.go index f4f89b0aaf..57c41f5ce3 100644 --- a/routers/api/v1/org/quota.go +++ b/routers/api/v1/org/quota.go @@ -4,8 +4,8 @@ package org import ( - "forgejo.org/routers/api/v1/shared" - "forgejo.org/services/context" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/services/context" ) // GetQuota returns the quota information for a given organization diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 680cc19ce8..bf28d54c42 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -8,22 +8,22 @@ import ( "errors" "net/http" - "forgejo.org/models" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/user" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - org_service "forgejo.org/services/org" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + activities_model "code.gitea.io/gitea/models/activities" + "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" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/user" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + org_service "code.gitea.io/gitea/services/org" + repo_service "code.gitea.io/gitea/services/repository" ) // ListTeams list all the teams of an organization diff --git a/routers/api/v1/packages/package.go b/routers/api/v1/packages/package.go index 03057c4feb..b38aa13167 100644 --- a/routers/api/v1/packages/package.go +++ b/routers/api/v1/packages/package.go @@ -4,18 +4,15 @@ package packages import ( - "errors" "net/http" - "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/optional" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/optional" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + packages_service "code.gitea.io/gitea/services/packages" ) // ListPackages gets all packages of an owner @@ -216,122 +213,3 @@ func ListPackageFiles(ctx *context.APIContext) { ctx.JSON(http.StatusOK, apiPackageFiles) } - -// LinkPackage sets a repository link for a package -func LinkPackage(ctx *context.APIContext) { - // swagger:operation POST /packages/{owner}/{type}/{name}/-/link/{repo_name} package linkPackage - // --- - // summary: Link a package to a repository - // parameters: - // - name: owner - // in: path - // description: owner of the package - // type: string - // required: true - // - name: type - // in: path - // description: type of the package - // type: string - // required: true - // - name: name - // in: path - // description: name of the package - // type: string - // required: true - // - name: repo_name - // in: path - // description: name of the repository to link. - // type: string - // required: true - // responses: - // "201": - // "$ref": "#/responses/empty" - // "404": - // "$ref": "#/responses/notFound" - - pkg, err := packages.GetPackageByName(ctx, ctx.ContextUser.ID, packages.Type(ctx.PathParamRaw("type")), ctx.PathParamRaw("name")) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - ctx.Error(http.StatusNotFound, "GetPackageByName", err) - } else { - ctx.Error(http.StatusInternalServerError, "GetPackageByName", err) - } - return - } - - repo, err := repo_model.GetRepositoryByName(ctx, ctx.ContextUser.ID, ctx.PathParamRaw("repo_name")) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - ctx.Error(http.StatusNotFound, "GetRepositoryByName", err) - } else { - ctx.Error(http.StatusInternalServerError, "GetRepositoryByName", err) - } - return - } - - err = packages_service.LinkToRepository(ctx, pkg, repo, ctx.Doer) - if err != nil { - switch { - case errors.Is(err, util.ErrInvalidArgument): - ctx.Error(http.StatusBadRequest, "LinkToRepository", err) - case errors.Is(err, util.ErrPermissionDenied): - ctx.Error(http.StatusForbidden, "LinkToRepository", err) - default: - ctx.Error(http.StatusInternalServerError, "LinkToRepository", err) - } - return - } - ctx.Status(http.StatusCreated) -} - -// UnlinkPackage sets a repository link for a package -func UnlinkPackage(ctx *context.APIContext) { - // swagger:operation POST /packages/{owner}/{type}/{name}/-/unlink package unlinkPackage - // --- - // summary: Unlink a package from a repository - // parameters: - // - name: owner - // in: path - // description: owner of the package - // type: string - // required: true - // - name: type - // in: path - // description: type of the package - // type: string - // required: true - // - name: name - // in: path - // description: name of the package - // type: string - // required: true - // responses: - // "201": - // "$ref": "#/responses/empty" - // "404": - // "$ref": "#/responses/notFound" - - pkg, err := packages.GetPackageByName(ctx, ctx.ContextUser.ID, packages.Type(ctx.PathParamRaw("type")), ctx.PathParamRaw("name")) - if err != nil { - if errors.Is(err, util.ErrNotExist) { - ctx.Error(http.StatusNotFound, "GetPackageByName", err) - } else { - ctx.Error(http.StatusInternalServerError, "GetPackageByName", err) - } - return - } - - err = packages_service.UnlinkFromRepository(ctx, pkg, ctx.Doer) - if err != nil { - switch { - case errors.Is(err, util.ErrPermissionDenied): - ctx.Error(http.StatusForbidden, "UnlinkFromRepository", err) - case errors.Is(err, util.ErrInvalidArgument): - ctx.Error(http.StatusBadRequest, "UnlinkFromRepository", err) - default: - ctx.Error(http.StatusInternalServerError, "UnlinkFromRepository", err) - } - return - } - ctx.Status(http.StatusNoContent) -} diff --git a/routers/api/v1/repo/action.go b/routers/api/v1/repo/action.go index a39d4836e1..0c7506b13b 100644 --- a/routers/api/v1/repo/action.go +++ b/routers/api/v1/repo/action.go @@ -7,18 +7,18 @@ import ( "errors" "net/http" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - secret_model "forgejo.org/models/secret" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/shared" - "forgejo.org/routers/api/v1/utils" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" - "forgejo.org/services/convert" - secret_service "forgejo.org/services/secrets" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + secret_model "code.gitea.io/gitea/models/secret" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/routers/api/v1/utils" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + secret_service "code.gitea.io/gitea/services/secrets" ) // ListActionsSecrets list an repo's actions secrets @@ -414,7 +414,7 @@ func (Action) UpdateVariable(ctx *context.APIContext) { if opt.Name == "" { opt.Name = ctx.Params("variablename") } - if _, err := actions_service.UpdateVariable(ctx, v.ID, 0, ctx.Repo.Repository.ID, opt.Name, opt.Value); err != nil { + if _, err := actions_service.UpdateVariable(ctx, v.ID, opt.Name, opt.Value); err != nil { if errors.Is(err, util.ErrInvalidArgument) { ctx.Error(http.StatusBadRequest, "UpdateVariable", err) } else { @@ -507,36 +507,6 @@ func (Action) GetRegistrationToken(ctx *context.APIContext) { shared.GetRegistrationToken(ctx, 0, ctx.Repo.Repository.ID) } -// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters -func (Action) SearchActionRunJobs(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/actions/runners/jobs repository repoSearchRunJobs - // --- - // summary: Search for repository's action jobs according filter conditions - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: labels - // in: query - // description: a comma separated list of run job labels to search for - // type: string - // responses: - // "200": - // "$ref": "#/responses/RunJobList" - // "403": - // "$ref": "#/responses/forbidden" - shared.GetActionRunJobs(ctx, 0, ctx.Repo.Repository.ID) -} - var _ actions_service.API = new(Action) // Action implements actions_service.API @@ -640,8 +610,6 @@ func DispatchWorkflow(ctx *context.APIContext) { // schema: // "$ref": "#/definitions/DispatchWorkflowOption" // responses: - // "201": - // "$ref": "#/responses/DispatchWorkflowRun" // "204": // "$ref": "#/responses/empty" // "404": @@ -672,8 +640,7 @@ func DispatchWorkflow(ctx *context.APIContext) { return opt.Inputs[key] } - run, jobs, err := workflow.Dispatch(ctx, inputGetter, ctx.Repo.Repository, ctx.Doer) - if err != nil { + if err := workflow.Dispatch(ctx, inputGetter, ctx.Repo.Repository, ctx.Doer); err != nil { if actions_service.IsInputRequiredErr(err) { ctx.Error(http.StatusBadRequest, "workflow.Dispatch", err) } else { @@ -682,15 +649,5 @@ func DispatchWorkflow(ctx *context.APIContext) { return } - workflowRun := &api.DispatchWorkflowRun{ - ID: run.ID, - RunNumber: run.Index, - Jobs: jobs, - } - - if opt.ReturnRunInfo { - ctx.JSON(http.StatusCreated, workflowRun) - } else { - ctx.JSON(http.StatusNoContent, nil) - } + ctx.JSON(http.StatusNoContent, nil) } diff --git a/routers/api/v1/repo/avatar.go b/routers/api/v1/repo/avatar.go index 84aafe764d..698337ffd2 100644 --- a/routers/api/v1/repo/avatar.go +++ b/routers/api/v1/repo/avatar.go @@ -7,10 +7,10 @@ import ( "encoding/base64" "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) // UpdateVatar updates the Avatar of an Repo diff --git a/routers/api/v1/repo/blob.go b/routers/api/v1/repo/blob.go index 8ed57d4787..3b116666ea 100644 --- a/routers/api/v1/repo/blob.go +++ b/routers/api/v1/repo/blob.go @@ -6,8 +6,8 @@ package repo import ( "net/http" - "forgejo.org/services/context" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/services/context" + files_service "code.gitea.io/gitea/services/repository/files" ) // GetBlob get the blob of a repository file. diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 6263360a8e..a468fd90d0 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -9,22 +9,22 @@ import ( "fmt" "net/http" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/organization" + 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/optional" + repo_module "code.gitea.io/gitea/modules/repository" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" ) // GetBranch get a branch of a repository @@ -133,6 +133,11 @@ func DeleteBranch(ctx *context.APIContext) { branchName := ctx.Params("*") + if ctx.Repo.Repository.IsEmpty { + ctx.Error(http.StatusForbidden, "", "Git Repository is empty.") + return + } + // check whether branches of this repository has been synced totalNumOfBranches, err := db.Count[git_model.Branch](ctx, git_model.FindBranchOptions{ RepoID: ctx.Repo.Repository.ID, @@ -393,77 +398,6 @@ func ListBranches(ctx *context.APIContext) { ctx.JSON(http.StatusOK, apiBranches) } -// UpdateBranch updates a repository's branch. -func UpdateBranch(ctx *context.APIContext) { - // swagger:operation PATCH /repos/{owner}/{repo}/branches/{branch} repository repoUpdateBranch - // --- - // summary: Update a branch - // consumes: - // - application/json - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: branch - // in: path - // description: name of the branch - // type: string - // required: true - // - name: body - // in: body - // schema: - // "$ref": "#/definitions/UpdateBranchRepoOption" - // responses: - // "204": - // "$ref": "#/responses/empty" - // "403": - // "$ref": "#/responses/forbidden" - // "404": - // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - - opt := web.GetForm(ctx).(*api.UpdateBranchRepoOption) - - oldName := ctx.Params("*") - repo := ctx.Repo.Repository - - if repo.IsEmpty { - ctx.Error(http.StatusNotFound, "", "Git Repository is empty.") - return - } - - if repo.IsMirror { - ctx.Error(http.StatusForbidden, "", "Git Repository is a mirror.") - return - } - - msg, err := repo_service.RenameBranch(ctx, repo, ctx.Doer, ctx.Repo.GitRepo, oldName, opt.Name) - if err != nil { - ctx.Error(http.StatusInternalServerError, "RenameBranch", err) - return - } - if msg == "target_exist" { - ctx.Error(http.StatusUnprocessableEntity, "", "Cannot rename a branch using the same name or rename to a branch that already exists.") - return - } - if msg == "from_not_exist" { - ctx.Error(http.StatusNotFound, "", "Branch doesn't exist.") - return - } - - ctx.Status(http.StatusNoContent) -} - // GetBranchProtection gets a branch protection func GetBranchProtection(ctx *context.APIContext) { // swagger:operation GET /repos/{owner}/{repo}/branch_protections/{name} repository repoGetBranchProtection diff --git a/routers/api/v1/repo/collaborators.go b/routers/api/v1/repo/collaborators.go index 3ef7721ef5..a43a21a88e 100644 --- a/routers/api/v1/repo/collaborators.go +++ b/routers/api/v1/repo/collaborators.go @@ -8,18 +8,18 @@ import ( "errors" "net/http" - "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" - repo_module "forgejo.org/modules/repository" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - repo_service "forgejo.org/services/repository" + "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" + repo_module "code.gitea.io/gitea/modules/repository" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + repo_service "code.gitea.io/gitea/services/repository" ) // ListCollaborators list a repository's collaborators @@ -82,7 +82,6 @@ func IsCollaborator(ctx *context.APIContext) { // swagger:operation GET /repos/{owner}/{repo}/collaborators/{collaborator} repository repoCheckCollaborator // --- // summary: Check if a user is a collaborator of a repository - // description: If the user is a collaborator, return 204. If the user is not a collaborator, return 404. // produces: // - application/json // parameters: @@ -282,6 +281,11 @@ func GetRepoPermissions(ctx *context.APIContext) { // "403": // "$ref": "#/responses/forbidden" + if !ctx.Doer.IsAdmin && ctx.Doer.LoginName != ctx.Params(":collaborator") && !ctx.IsUserRepoAdmin() { + ctx.Error(http.StatusForbidden, "User", "Only admins can query all permissions, repo admins can query all repo permissions, collaborators can query only their own") + return + } + collaborator, err := user_model.GetUserByName(ctx, ctx.Params(":collaborator")) if err != nil { if user_model.IsErrUserNotExist(err) { @@ -292,15 +296,6 @@ func GetRepoPermissions(ctx *context.APIContext) { return } - // Only allow the request in any of the following situations: - // - The user is the instance admin. - // - The user is the repository admin. - // - The user is querying the permissions of themselves. - if !ctx.IsUserSiteAdmin() && ctx.Doer.ID != collaborator.ID && !ctx.IsUserRepoAdmin() { - ctx.Error(http.StatusForbidden, "User", "Only admins can query all permissions, repo admins can query all repo permissions, collaborators can query only their own") - return - } - permission, err := access_model.GetUserRepoPermission(ctx, ctx.Repo.Repository, collaborator) if err != nil { ctx.Error(http.StatusInternalServerError, "GetUserRepoPermission", err) diff --git a/routers/api/v1/repo/commits.go b/routers/api/v1/repo/commits.go index 4221e59f17..c5e8cf99eb 100644 --- a/routers/api/v1/repo/commits.go +++ b/routers/api/v1/repo/commits.go @@ -10,14 +10,14 @@ import ( "net/http" "strconv" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetSingleCommit get a commit via sha diff --git a/routers/api/v1/repo/compare.go b/routers/api/v1/repo/compare.go index 9c941ea07f..429145c714 100644 --- a/routers/api/v1/repo/compare.go +++ b/routers/api/v1/repo/compare.go @@ -7,11 +7,11 @@ import ( "net/http" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/gitrepo" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // CompareDiff compare two branches or commits @@ -77,7 +77,6 @@ func CompareDiff(ctx *context.APIContext) { files := ctx.FormString("files") == "" || ctx.FormBool("files") apiCommits := make([]*api.Commit, 0, len(ci.Commits)) - apiFiles := []*api.CommitAffectedFiles{} userCache := make(map[string]*user_model.User) for i := 0; i < len(ci.Commits); i++ { apiCommit, err := convert.ToCommit(ctx, ctx.Repo.Repository, ctx.Repo.GitRepo, ci.Commits[i], userCache, @@ -91,12 +90,10 @@ func CompareDiff(ctx *context.APIContext) { return } apiCommits = append(apiCommits, apiCommit) - apiFiles = append(apiFiles, apiCommit.Files...) } ctx.JSON(http.StatusOK, &api.Compare{ TotalCommits: len(ci.Commits), Commits: apiCommits, - Files: apiFiles, }) } diff --git a/routers/api/v1/repo/download.go b/routers/api/v1/repo/download.go deleted file mode 100644 index 86910123e6..0000000000 --- a/routers/api/v1/repo/download.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package repo - -import ( - "fmt" - "net/http" - - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/services/context" - archiver_service "forgejo.org/services/repository/archiver" -) - -func DownloadArchive(ctx *context.APIContext) { - var tp git.ArchiveType - switch ballType := ctx.Params("ball_type"); ballType { - case "tarball": - tp = git.TARGZ - case "zipball": - tp = git.ZIP - case "bundle": - tp = git.BUNDLE - default: - ctx.Error(http.StatusBadRequest, "", fmt.Sprintf("Unknown archive type: %s", ballType)) - return - } - - if ctx.Repo.GitRepo == nil { - gitRepo, err := gitrepo.OpenRepository(ctx, ctx.Repo.Repository) - if err != nil { - ctx.Error(http.StatusInternalServerError, "OpenRepository", err) - return - } - ctx.Repo.GitRepo = gitRepo - defer gitRepo.Close() - } - - r, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, ctx.Params("*"), tp) - if err != nil { - ctx.ServerError("NewRequest", err) - return - } - - archive, err := r.Await(ctx) - if err != nil { - ctx.ServerError("archive.Await", err) - return - } - - download(ctx, r.GetArchiveName(), archive) -} diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index fb71d76388..1fa44d50c4 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -11,26 +11,27 @@ import ( "fmt" "io" "net/http" + "path" "strings" "time" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/services/context" - archiver_service "forgejo.org/services/repository/archiver" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" + archiver_service "code.gitea.io/gitea/services/repository/archiver" + files_service "code.gitea.io/gitea/services/repository/files" ) const ( @@ -213,7 +214,7 @@ func GetRawFileOrLFS(ctx *context.APIContext) { if setting.LFS.Storage.MinioConfig.ServeDirect { // If we have a signed url (S3, object storage), redirect to this directly. - u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name(), nil) + u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name()) if u != nil && err == nil { ctx.Redirect(u.String()) return @@ -246,14 +247,19 @@ func getBlobForEntry(ctx *context.APIContext) (blob *git.Blob, entry *git.TreeEn return nil, nil, nil } - latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) + info, _, err := git.Entries([]*git.TreeEntry{entry}).GetCommitsInfo(ctx, ctx.Repo.Commit, path.Dir("/" + ctx.Repo.TreePath)[1:]) if err != nil { - ctx.Error(http.StatusInternalServerError, "GetTreePathLatestCommit", err) + ctx.Error(http.StatusInternalServerError, "GetCommitsInfo", err) return nil, nil, nil } - when := &latestCommit.Committer.When - return entry.Blob(), entry, when + if len(info) == 1 { + // Not Modified + lastModified = &info[0].Commit.Committer.When + } + blob = entry.Blob() + + return blob, entry, lastModified } // GetArchive get archive of a repository @@ -302,13 +308,7 @@ func GetArchive(ctx *context.APIContext) { func archiveDownload(ctx *context.APIContext) { uri := ctx.Params("*") - ext, tp, err := archiver_service.ParseFileName(uri) - if err != nil { - ctx.Error(http.StatusBadRequest, "ParseFileName", err) - return - } - - aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, uri) if err != nil { if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) { ctx.Error(http.StatusBadRequest, "unknown archive format", err) @@ -334,17 +334,14 @@ func download(ctx *context.APIContext, archiveName string, archiver *repo_model. // Add nix format link header so tarballs lock correctly: // https://github.com/nixos/nix/blob/56763ff918eb308db23080e560ed2ea3e00c80a7/doc/manual/src/protocols/tarball-fetcher.md - ctx.Resp.Header().Add("Link", fmt.Sprintf(`<%s/archive/%s.%s?rev=%s>; rel="immutable"`, + ctx.Resp.Header().Add("Link", fmt.Sprintf("<%s/archive/%s.tar.gz?rev=%s>; rel=\"immutable\"", ctx.Repo.Repository.APIURL(), - archiver.CommitID, - archiver.Type.String(), - archiver.CommitID, - )) + archiver.CommitID, archiver.CommitID)) rPath := archiver.RelativePath() if setting.RepoArchive.Storage.MinioConfig.ServeDirect { // If we have a signed url (S3, object storage), redirect to this directly. - u, err := storage.RepoArchives.URL(rPath, downloadName, nil) + u, err := storage.RepoArchives.URL(rPath, downloadName) if u != nil && err == nil { ctx.Redirect(u.String()) return diff --git a/routers/api/v1/repo/flags.go b/routers/api/v1/repo/flags.go index 46af528f0f..ac5cb2e6d6 100644 --- a/routers/api/v1/repo/flags.go +++ b/routers/api/v1/repo/flags.go @@ -6,9 +6,9 @@ package repo import ( "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" ) func ListFlags(ctx *context.APIContext) { diff --git a/routers/api/v1/repo/fork.go b/routers/api/v1/repo/fork.go index edb85cf54f..c9dc9681c9 100644 --- a/routers/api/v1/repo/fork.go +++ b/routers/api/v1/repo/fork.go @@ -9,19 +9,19 @@ import ( "fmt" "net/http" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + repo_service "code.gitea.io/gitea/services/repository" ) // ListForks list a repository's forks diff --git a/routers/api/v1/repo/git_hook.go b/routers/api/v1/repo/git_hook.go index 31957c8b4d..26ae84d08d 100644 --- a/routers/api/v1/repo/git_hook.go +++ b/routers/api/v1/repo/git_hook.go @@ -6,11 +6,11 @@ package repo import ( "net/http" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListGitHooks list all Git hooks of a repository diff --git a/routers/api/v1/repo/git_ref.go b/routers/api/v1/repo/git_ref.go index b2e52ad95d..54da5eeaa7 100644 --- a/routers/api/v1/repo/git_ref.go +++ b/routers/api/v1/repo/git_ref.go @@ -7,10 +7,10 @@ import ( "net/http" "net/url" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" ) // GetGitAllRefs get ref or an list all the refs of a repository diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index 5d277604b8..ffd2313591 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -7,19 +7,19 @@ package repo import ( "net/http" - "forgejo.org/models/db" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + webhook_service "code.gitea.io/gitea/services/webhook" ) // ListHooks list all hooks of a repository diff --git a/routers/api/v1/repo/hook_test.go b/routers/api/v1/repo/hook_test.go index 77c86388f5..a8065e4a60 100644 --- a/routers/api/v1/repo/hook_test.go +++ b/routers/api/v1/repo/hook_test.go @@ -7,9 +7,9 @@ import ( "net/http" "testing" - "forgejo.org/models/unittest" - "forgejo.org/models/webhook" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 5495c4a6ba..99cd9803c5 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -12,23 +12,23 @@ import ( "strings" "time" - "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" - issue_indexer "forgejo.org/modules/indexer/issues" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + "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" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + "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/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // SearchIssues searches for issues across the repositories that the user has access to @@ -41,93 +41,80 @@ func SearchIssues(ctx *context.APIContext) { // parameters: // - name: state // in: query - // description: State of the issue + // description: whether issue is open or closed // type: string - // enum: [open, closed, all] - // default: open // - name: labels // in: query - // description: Comma-separated list of label names. Fetch only issues that have any of these labels. Non existent labels are discarded. + // description: comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded // type: string // - name: milestones // in: query - // description: Comma-separated list of milestone names. Fetch only issues that have any of these milestones. Non existent milestones are discarded. + // description: comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded // type: string // - name: q // in: query - // description: Search string + // description: search string // type: string // - name: priority_repo_id // in: query - // description: Repository ID to prioritize in the results + // description: repository to prioritize in the results // type: integer // format: int64 // - name: type // in: query - // description: Filter by issue type + // description: filter by type (issues / pulls) if set // type: string - // enum: [issues, pulls] // - name: since // in: query - // description: Only show issues updated after the given time (RFC 3339 format) + // description: Only show notifications updated after the given time. This is a timestamp in RFC 3339 format // type: string // format: date-time + // required: false // - name: before // in: query - // description: Only show issues updated before the given time (RFC 3339 format) + // description: Only show notifications updated before the given time. This is a timestamp in RFC 3339 format // type: string // format: date-time + // required: false // - name: assigned // in: query - // description: Filter issues or pulls assigned to the authenticated user + // description: filter (issues / pulls) assigned to you, default is false // type: boolean - // default: false // - name: created // in: query - // description: Filter issues or pulls created by the authenticated user + // description: filter (issues / pulls) created by you, default is false // type: boolean - // default: false // - name: mentioned // in: query - // description: Filter issues or pulls mentioning the authenticated user + // description: filter (issues / pulls) mentioning you, default is false // type: boolean - // default: false // - name: review_requested // in: query - // description: Filter pull requests where the authenticated user's review was requested + // description: filter pulls requesting your review, default is false // type: boolean - // default: false // - name: reviewed // in: query - // description: Filter pull requests reviewed by the authenticated user + // description: filter pulls reviewed by you, default is false // type: boolean - // default: false // - name: owner // in: query - // description: Filter by repository owner + // description: filter by owner // type: string // - name: team // in: query - // description: Filter by team (requires organization owner parameter) + // description: filter by team (requires organization owner parameter to be provided) // type: string // - name: page // in: query - // description: Page number of results to return (1-based) + // description: page number of results to return (1-based) // type: integer - // minimum: 1 - // default: 1 // - name: limit // in: query - // description: Number of items per page + // description: page size of results // type: integer - // minimum: 0 // responses: // "200": // "$ref": "#/responses/IssueList" - // "400": - // "$ref": "#/responses/error" - // "422": - // "$ref": "#/responses/validationError" before, since, err := context.GetQueryBeforeSince(ctx.Base) if err != nil { @@ -397,12 +384,6 @@ func ListIssues(ctx *context.APIContext) { // in: query // description: page size of results // type: integer - // - name: sort - // in: query - // description: Type of sort - // type: string - // enum: [relevance, latest, oldest, recentupdate, leastupdate, mostcomment, leastcomment, nearduedate, farduedate] - // default: latest // responses: // "200": // "$ref": "#/responses/IssueList" @@ -516,7 +497,7 @@ func ListIssues(ctx *context.APIContext) { RepoIDs: []int64{ctx.Repo.Repository.ID}, IsPull: isPull, IsClosed: isClosed, - SortBy: issue_indexer.ParseSortBy(ctx.FormString("sort"), issue_indexer.SortByCreatedDesc), + SortBy: issue_indexer.SortByCreatedDesc, } if since != 0 { searchOpt.UpdatedAfterUnix = optional.Some(since) diff --git a/routers/api/v1/repo/issue_attachment.go b/routers/api/v1/repo/issue_attachment.go index 0cb1875af1..a972ab0374 100644 --- a/routers/api/v1/repo/issue_attachment.go +++ b/routers/api/v1/repo/issue_attachment.go @@ -7,17 +7,17 @@ import ( "net/http" "time" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/attachment" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/attachment" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // GetIssueAttachment gets a single attachment of the issue diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 1b98c154c8..1ff755c058 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -9,18 +9,18 @@ import ( "errors" "net/http" - 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/optional" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + 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/optional" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // ListIssueComments list all the comments of an issue @@ -62,10 +62,6 @@ func ListIssueComments(ctx *context.APIContext) { // "$ref": "#/responses/CommentList" // "404": // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - // "500": - // "$ref": "#/responses/internalServerError" before, since, err := context.GetQueryBeforeSince(ctx.Base) if err != nil { @@ -74,10 +70,6 @@ func ListIssueComments(ctx *context.APIContext) { } issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { - if issues_model.IsErrIssueNotExist(err) { - ctx.NotFound("IsErrIssueNotExist", err) - return - } ctx.Error(http.StatusInternalServerError, "GetRawIssueByIndex", err) return } @@ -174,10 +166,6 @@ func ListIssueCommentsAndTimeline(ctx *context.APIContext) { // "$ref": "#/responses/TimelineList" // "404": // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - // "500": - // "$ref": "#/responses/internalServerError" before, since, err := context.GetQueryBeforeSince(ctx.Base) if err != nil { @@ -186,10 +174,6 @@ func ListIssueCommentsAndTimeline(ctx *context.APIContext) { } issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { - if issues_model.IsErrIssueNotExist(err) { - ctx.NotFound("IsErrIssueNotExist", err) - return - } ctx.Error(http.StatusInternalServerError, "GetRawIssueByIndex", err) return } @@ -287,10 +271,6 @@ func ListRepoIssueComments(ctx *context.APIContext) { // "$ref": "#/responses/CommentList" // "404": // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - // "500": - // "$ref": "#/responses/internalServerError" before, since, err := context.GetQueryBeforeSince(ctx.Base) if err != nil { @@ -398,16 +378,9 @@ func CreateIssueComment(ctx *context.APIContext) { // "$ref": "#/responses/notFound" // "423": // "$ref": "#/responses/repoArchivedError" - // "500": - // "$ref": "#/responses/internalServerError" - form := web.GetForm(ctx).(*api.CreateIssueCommentOption) issue, err := issues_model.GetIssueByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { - if issues_model.IsErrIssueNotExist(err) { - ctx.NotFound("IsErrIssueNotExist", err) - return - } ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err) return } @@ -476,8 +449,6 @@ func GetIssueComment(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" // "404": // "$ref": "#/responses/notFound" - // "500": - // "$ref": "#/responses/internalServerError" comment := ctx.Comment @@ -540,9 +511,6 @@ func EditIssueComment(ctx *context.APIContext) { // "$ref": "#/responses/notFound" // "423": // "$ref": "#/responses/repoArchivedError" - // "500": - // "$ref": "#/responses/internalServerError" - form := web.GetForm(ctx).(*api.EditIssueCommentOption) editIssueComment(ctx, *form) } @@ -592,8 +560,6 @@ func EditIssueCommentDeprecated(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" // "404": // "$ref": "#/responses/notFound" - // "500": - // "$ref": "#/responses/internalServerError" form := web.GetForm(ctx).(*api.EditIssueCommentOption) editIssueComment(ctx, *form) @@ -660,8 +626,8 @@ func DeleteIssueComment(ctx *context.APIContext) { // "$ref": "#/responses/empty" // "403": // "$ref": "#/responses/forbidden" - // "500": - // "$ref": "#/responses/internalServerError" + // "404": + // "$ref": "#/responses/notFound" deleteIssueComment(ctx, issues_model.CommentTypeComment) } @@ -699,8 +665,8 @@ func DeleteIssueCommentDeprecated(ctx *context.APIContext) { // "$ref": "#/responses/empty" // "403": // "$ref": "#/responses/forbidden" - // "500": - // "$ref": "#/responses/internalServerError" + // "404": + // "$ref": "#/responses/notFound" deleteIssueComment(ctx, issues_model.CommentTypeComment) } diff --git a/routers/api/v1/repo/issue_comment_attachment.go b/routers/api/v1/repo/issue_comment_attachment.go index 9edc9a3cb1..c45e2ebe89 100644 --- a/routers/api/v1/repo/issue_comment_attachment.go +++ b/routers/api/v1/repo/issue_comment_attachment.go @@ -7,17 +7,17 @@ import ( "net/http" "time" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/attachment" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/attachment" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // GetIssueCommentAttachment gets a single attachment of the comment diff --git a/routers/api/v1/repo/issue_dependency.go b/routers/api/v1/repo/issue_dependency.go index bed1e7ecf9..c40e92c01b 100644 --- a/routers/api/v1/repo/issue_dependency.go +++ b/routers/api/v1/repo/issue_dependency.go @@ -7,15 +7,15 @@ package repo import ( "net/http" - "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/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "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/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetIssueDependencies list an issue's dependencies diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go index 85af1149ff..ae05544365 100644 --- a/routers/api/v1/repo/issue_label.go +++ b/routers/api/v1/repo/issue_label.go @@ -9,12 +9,12 @@ import ( "net/http" "reflect" - issues_model "forgejo.org/models/issues" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + issues_model "code.gitea.io/gitea/models/issues" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // ListIssueLabels list all the labels of an issue @@ -350,9 +350,6 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption) labelIDs = append(labelIDs, int64(rv.Float())) case reflect.String: labelNames = append(labelNames, rv.String()) - default: - ctx.Error(http.StatusBadRequest, "InvalidLabel", "a label must be an integer or a string") - return nil, nil, fmt.Errorf("invalid label") } } if len(labelIDs) > 0 && len(labelNames) > 0 { @@ -360,20 +357,11 @@ func prepareForReplaceOrAdd(ctx *context.APIContext, form api.IssueLabelsOption) return nil, nil, fmt.Errorf("invalid labels") } if len(labelNames) > 0 { - repoLabelIDs, err := issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames) + labelIDs, err = issues_model.GetLabelIDsInRepoByNames(ctx, ctx.Repo.Repository.ID, labelNames) if err != nil { ctx.Error(http.StatusInternalServerError, "GetLabelIDsInRepoByNames", err) return nil, nil, err } - labelIDs = append(labelIDs, repoLabelIDs...) - if ctx.Repo.Owner.IsOrganization() { - orgLabelIDs, err := issues_model.GetLabelIDsInOrgByNames(ctx, ctx.Repo.Owner.ID, labelNames) - if err != nil { - ctx.Error(http.StatusInternalServerError, "GetLabelIDsInOrgByNames", err) - return nil, nil, err - } - labelIDs = append(labelIDs, orgLabelIDs...) - } } labels, err := issues_model.GetLabelsByIDs(ctx, labelIDs, "id", "repo_id", "org_id", "name", "exclusive") diff --git a/routers/api/v1/repo/issue_pin.go b/routers/api/v1/repo/issue_pin.go index 84079ed452..af3e06332a 100644 --- a/routers/api/v1/repo/issue_pin.go +++ b/routers/api/v1/repo/issue_pin.go @@ -6,10 +6,10 @@ package repo import ( "net/http" - issues_model "forgejo.org/models/issues" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // PinIssue pins a issue diff --git a/routers/api/v1/repo/issue_reaction.go b/routers/api/v1/repo/issue_reaction.go index 2d6218bf46..c395255c13 100644 --- a/routers/api/v1/repo/issue_reaction.go +++ b/routers/api/v1/repo/issue_reaction.go @@ -7,14 +7,14 @@ import ( "errors" "net/http" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" ) // GetIssueCommentReactions list reactions of a comment from an issue diff --git a/routers/api/v1/repo/issue_stopwatch.go b/routers/api/v1/repo/issue_stopwatch.go index 83bcabbe15..dd61967ed0 100644 --- a/routers/api/v1/repo/issue_stopwatch.go +++ b/routers/api/v1/repo/issue_stopwatch.go @@ -7,10 +7,10 @@ import ( "errors" "net/http" - issues_model "forgejo.org/models/issues" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // StartIssueStopwatch creates a stopwatch for the given issue. diff --git a/routers/api/v1/repo/issue_subscription.go b/routers/api/v1/repo/issue_subscription.go index 33654dc136..6b29218575 100644 --- a/routers/api/v1/repo/issue_subscription.go +++ b/routers/api/v1/repo/issue_subscription.go @@ -7,12 +7,12 @@ import ( "fmt" "net/http" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // AddIssueSubscription Subscribe user to issue diff --git a/routers/api/v1/repo/issue_tracked_time.go b/routers/api/v1/repo/issue_tracked_time.go index 7d88b1b2cd..3d8abfa5f3 100644 --- a/routers/api/v1/repo/issue_tracked_time.go +++ b/routers/api/v1/repo/issue_tracked_time.go @@ -8,15 +8,15 @@ import ( "net/http" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListTrackedTimes list all the tracked times of an issue diff --git a/routers/api/v1/repo/key.go b/routers/api/v1/repo/key.go index 2abf95a189..88444a2625 100644 --- a/routers/api/v1/repo/key.go +++ b/routers/api/v1/repo/key.go @@ -10,18 +10,18 @@ import ( "net/http" "net/url" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/convert" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // appendPrivateInformation appends the owner and key type information to api.PublicKey diff --git a/routers/api/v1/repo/label.go b/routers/api/v1/repo/label.go index bf722ace34..b6eb51fd20 100644 --- a/routers/api/v1/repo/label.go +++ b/routers/api/v1/repo/label.go @@ -8,13 +8,13 @@ import ( "net/http" "strconv" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/label" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/label" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListLabels list all the labels of a repository diff --git a/routers/api/v1/repo/language.go b/routers/api/v1/repo/language.go index 498aac3447..f1d5bbe45f 100644 --- a/routers/api/v1/repo/language.go +++ b/routers/api/v1/repo/language.go @@ -8,9 +8,9 @@ import ( "net/http" "strconv" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/services/context" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) type languageResponse []*repo_model.LanguageStat diff --git a/routers/api/v1/repo/main_test.go b/routers/api/v1/repo/main_test.go index a3655fb76b..451f34d72f 100644 --- a/routers/api/v1/repo/main_test.go +++ b/routers/api/v1/repo/main_test.go @@ -6,9 +6,9 @@ package repo import ( "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + webhook_service "code.gitea.io/gitea/services/webhook" ) func TestMain(m *testing.M) { diff --git a/routers/api/v1/repo/migrate.go b/routers/api/v1/repo/migrate.go index 75e772dfe2..0991723d47 100644 --- a/routers/api/v1/repo/migrate.go +++ b/routers/api/v1/repo/migrate.go @@ -10,28 +10,28 @@ import ( "net/http" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/graceful" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - "forgejo.org/services/migrations" - notify_service "forgejo.org/services/notify" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "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" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/migrations" + notify_service "code.gitea.io/gitea/services/notify" + repo_service "code.gitea.io/gitea/services/repository" ) // Migrate migrate remote git repository to gitea @@ -218,17 +218,6 @@ func Migrate(ctx *context.APIContext) { return } - if opts.Releases || opts.Wiki { - repoOpt := api.EditRepoOption{ - HasReleases: &opts.Releases, - HasWiki: &opts.Wiki, - } - - if err = updateRepoUnits(ctx, repoOwner.Name, repo, repoOpt); err != nil { - log.Error("Failed to update units on %s/%s repo. %w", repoOwner.Name, form.RepoName, err) - } - } - log.Trace("Repository migrated: %s/%s", repoOwner.Name, form.RepoName) ctx.JSON(http.StatusCreated, convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm.AccessModeAdmin})) } diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 7aa9881bc4..b9534016e4 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -9,15 +9,15 @@ import ( "strconv" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/optional" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/optional" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListMilestones list milestones for a repository diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index bc48c6acb7..ae727fdbae 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -9,21 +9,21 @@ import ( "net/http" "time" - "forgejo.org/models" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" ) // MirrorSync adds a mirrored repository to the sync queue @@ -363,7 +363,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro address, err := forms.ParseRemoteAddr(mirrorOption.RemoteAddress, mirrorOption.RemoteUsername, mirrorOption.RemotePassword) if err == nil { - err = migrations.IsPushMirrorURLAllowed(address, ctx.ContextUser) + err = migrations.IsMigrateURLAllowed(address, ctx.ContextUser) } if err != nil { HandleRemoteAddressError(ctx, err) diff --git a/routers/api/v1/repo/notes.go b/routers/api/v1/repo/notes.go index 87903d9f36..a4a1d4eab7 100644 --- a/routers/api/v1/repo/notes.go +++ b/routers/api/v1/repo/notes.go @@ -7,11 +7,10 @@ import ( "fmt" "net/http" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetNote Get a note corresponding to a single commit from a repository @@ -103,107 +102,3 @@ func getNote(ctx *context.APIContext, identifier string) { apiNote := api.Note{Message: string(note.Message), Commit: cmt} ctx.JSON(http.StatusOK, apiNote) } - -// SetNote Sets a note corresponding to a single commit from a repository -func SetNote(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/git/notes/{sha} repository repoSetNote - // --- - // summary: Set a note corresponding to a single commit from a repository - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: sha - // in: path - // description: a git ref or commit sha - // type: string - // required: true - // - name: body - // in: body - // schema: - // "$ref": "#/definitions/NoteOptions" - // responses: - // "200": - // "$ref": "#/responses/Note" - // "404": - // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - sha := ctx.Params(":sha") - if !git.IsValidRefPattern(sha) { - ctx.Error(http.StatusUnprocessableEntity, "no valid ref or sha", fmt.Sprintf("no valid ref or sha: %s", sha)) - return - } - - form := web.GetForm(ctx).(*api.NoteOptions) - - err := git.SetNote(ctx, ctx.Repo.GitRepo, sha, form.Message, ctx.Doer.Name, ctx.Doer.GetEmail()) - if err != nil { - if git.IsErrNotExist(err) { - ctx.NotFound(sha) - } else { - ctx.Error(http.StatusInternalServerError, "SetNote", err) - } - return - } - - getNote(ctx, sha) -} - -// RemoveNote Removes a note corresponding to a single commit from a repository -func RemoveNote(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{owner}/{repo}/git/notes/{sha} repository repoRemoveNote - // --- - // summary: Removes a note corresponding to a single commit from a repository - // produces: - // - application/json - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true - // - name: sha - // in: path - // description: a git ref or commit sha - // type: string - // required: true - // responses: - // "204": - // "$ref": "#/responses/empty" - // "404": - // "$ref": "#/responses/notFound" - // "422": - // "$ref": "#/responses/validationError" - sha := ctx.Params(":sha") - if !git.IsValidRefPattern(sha) { - ctx.Error(http.StatusUnprocessableEntity, "no valid ref or sha", fmt.Sprintf("no valid ref or sha: %s", sha)) - return - } - - err := git.RemoveNote(ctx, ctx.Repo.GitRepo, sha) - if err != nil { - if git.IsErrNotExist(err) { - ctx.NotFound(sha) - } else { - ctx.Error(http.StatusInternalServerError, "RemoveNote", err) - } - return - } - - ctx.Status(http.StatusNoContent) -} diff --git a/routers/api/v1/repo/patch.go b/routers/api/v1/repo/patch.go index 6f35891627..27c5c17dce 100644 --- a/routers/api/v1/repo/patch.go +++ b/routers/api/v1/repo/patch.go @@ -7,14 +7,14 @@ import ( "net/http" "time" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/repository/files" ) // ApplyDiffPatch handles API call for applying a patch diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 25c85e7531..fcca180c41 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -12,35 +12,35 @@ import ( "strings" "time" - "forgejo.org/models" - activities_model "forgejo.org/models/activities" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - pull_model "forgejo.org/models/pull" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/automerge" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - "forgejo.org/services/gitdiff" - issue_service "forgejo.org/services/issue" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + activities_model "code.gitea.io/gitea/models/activities" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + access_model "code.gitea.io/gitea/models/perm/access" + pull_model "code.gitea.io/gitea/models/pull" + 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/git" + "code.gitea.io/gitea/modules/gitrepo" + "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" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/automerge" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/gitdiff" + issue_service "code.gitea.io/gitea/services/issue" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" ) // ListPullRequests returns a list of all PRs @@ -53,79 +53,56 @@ func ListPullRequests(ctx *context.APIContext) { // parameters: // - name: owner // in: path - // description: Owner of the repo + // description: owner of the repo // type: string // required: true // - name: repo // in: path - // description: Name of the repo + // description: name of the repo // type: string // required: true // - name: state // in: query - // description: State of pull request + // description: "State of pull request: open or closed (optional)" // type: string - // enum: [open, closed, all] - // default: open + // enum: [closed, open, all] // - name: sort // in: query - // description: Type of sort + // description: "Type of sort" // type: string // enum: [oldest, recentupdate, leastupdate, mostcomment, leastcomment, priority] // - name: milestone // in: query - // description: ID of the milestone + // description: "ID of the milestone" // type: integer // format: int64 // - name: labels // in: query - // description: Label IDs + // description: "Label IDs" // type: array // collectionFormat: multi // items: // type: integer // format: int64 - // - name: poster - // in: query - // description: Filter by pull request author - // type: string // - name: page // in: query - // description: Page number of results to return (1-based) + // description: page number of results to return (1-based) // type: integer - // minimum: 1 - // default: 1 // - name: limit // in: query - // description: Page size of results + // description: page size of results // type: integer - // minimum: 0 // responses: // "200": // "$ref": "#/responses/PullRequestList" // "404": // "$ref": "#/responses/notFound" - // "500": - // "$ref": "#/responses/error" labelIDs, err := base.StringsToInt64s(ctx.FormStrings("labels")) if err != nil { ctx.Error(http.StatusInternalServerError, "PullRequests", err) return } - var posterID int64 - if posterStr := ctx.FormString("poster"); posterStr != "" { - poster, err := user_model.GetUserByName(ctx, posterStr) - if err != nil { - if user_model.IsErrUserNotExist(err) { - ctx.Error(http.StatusBadRequest, "Poster not found", err) - } else { - ctx.Error(http.StatusInternalServerError, "GetUserByName", err) - } - return - } - posterID = poster.ID - } listOptions := utils.GetListOptions(ctx) prs, maxResults, err := issues_model.PullRequests(ctx, ctx.Repo.Repository.ID, &issues_model.PullRequestsOptions{ ListOptions: listOptions, @@ -133,7 +110,6 @@ func ListPullRequests(ctx *context.APIContext) { SortType: ctx.FormTrim("sort"), Labels: labelIDs, MilestoneID: ctx.FormInt64("milestone"), - PosterID: posterID, }) if err != nil { ctx.Error(http.StatusInternalServerError, "PullRequests", err) @@ -989,7 +965,7 @@ func MergePullRequest(ctx *context.APIContext) { } if form.MergeWhenChecksSucceed { - scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) + scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) if err != nil { if pull_model.IsErrAlreadyScheduledToAutoMerge(err) { ctx.Error(http.StatusConflict, "ScheduleAutoMerge", err) diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index aa4c7318a2..8fba085ff7 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -8,18 +8,18 @@ import ( "net/http" "strings" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/gitrepo" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" ) // ListPullReviews lists all reviews of a pull request diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go index 68254a530a..5ea4dc8cfc 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -7,18 +7,18 @@ import ( "fmt" "net/http" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - release_service "forgejo.org/services/release" + "code.gitea.io/gitea/models" + "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" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + release_service "code.gitea.io/gitea/services/release" ) // GetRelease get a single release of a repository @@ -136,10 +136,6 @@ func ListReleases(ctx *context.APIContext) { // in: query // description: filter (exclude / include) pre-releases // type: boolean - // - name: q - // in: query - // description: Search string - // type: string // - name: page // in: query // description: page number of results to return (1-based) @@ -162,7 +158,6 @@ func ListReleases(ctx *context.APIContext) { IsDraft: ctx.FormOptionalBool("draft"), IsPreRelease: ctx.FormOptionalBool("pre-release"), RepoID: ctx.Repo.Repository.ID, - Keyword: ctx.FormTrim("q"), } releases, err := db.Find[repo_model.Release](ctx, opts) diff --git a/routers/api/v1/repo/release_attachment.go b/routers/api/v1/repo/release_attachment.go index ba273a8d2a..d569f6e928 100644 --- a/routers/api/v1/repo/release_attachment.go +++ b/routers/api/v1/repo/release_attachment.go @@ -11,15 +11,15 @@ import ( "path" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/attachment" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/convert" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/attachment" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/convert" ) func checkReleaseMatchRepo(ctx *context.APIContext, releaseID int64) bool { diff --git a/routers/api/v1/repo/release_tags.go b/routers/api/v1/repo/release_tags.go index b27f8584bc..f845fad53b 100644 --- a/routers/api/v1/repo/release_tags.go +++ b/routers/api/v1/repo/release_tags.go @@ -6,11 +6,11 @@ package repo import ( "net/http" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - "forgejo.org/services/context" - "forgejo.org/services/convert" - releaseservice "forgejo.org/services/release" + "code.gitea.io/gitea/models" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + releaseservice "code.gitea.io/gitea/services/release" ) // GetReleaseByTag get a single release of a repository by tag name diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index e8c3965ff3..f39e58231b 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -11,32 +11,33 @@ import ( "strings" "time" - actions_model "forgejo.org/models/actions" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/label" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/issue" - repo_service "forgejo.org/services/repository" - wiki_service "forgejo.org/services/wiki" + actions_model "code.gitea.io/gitea/models/actions" + activities_model "code.gitea.io/gitea/models/activities" + "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" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/gitrepo" + "code.gitea.io/gitea/modules/label" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/issue" + repo_service "code.gitea.io/gitea/services/repository" + wiki_service "code.gitea.io/gitea/services/wiki" ) // Search repositories via options @@ -85,7 +86,7 @@ func Search(ctx *context.APIContext) { // type: boolean // - name: is_private // in: query - // description: show only public, private or all repositories (defaults to all) + // description: show only pubic, private or all repositories (defaults to all) // type: boolean // - name: template // in: query @@ -202,6 +203,7 @@ func Search(ctx *context.APIContext) { } } + var err error repos, count, err := repo_model.SearchRepository(ctx, opts) if err != nil { ctx.JSON(http.StatusInternalServerError, api.SearchError{ @@ -647,7 +649,7 @@ func Edit(ctx *context.APIContext) { return } - if err := updateRepoUnits(ctx, ctx.Repo.Owner.Name, ctx.Repo.Repository, opts); err != nil { + if err := updateRepoUnits(ctx, opts); err != nil { return } @@ -750,8 +752,10 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) { if !repo.IsEmpty { if err := gitrepo.SetDefaultBranch(ctx, ctx.Repo.Repository, *opts.DefaultBranch); err != nil { - ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err) - return err + if !git.IsErrUnsupportedVersion(err) { + ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err) + return err + } } } repo.DefaultBranch = *opts.DefaultBranch @@ -779,7 +783,10 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err } // updateRepoUnits updates repo units: Issue settings, Wiki settings, PR settings -func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Repository, opts api.EditRepoOption) error { +func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error { + owner := ctx.Repo.Owner + repo := ctx.Repo.Repository + var units []repo_model.RepoUnit var deleteUnitTypes []unit_model.Type @@ -934,7 +941,6 @@ func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Rep AllowRebaseUpdate: true, DefaultDeleteBranchAfterMerge: false, DefaultMergeStyle: repo_model.MergeStyleMerge, - DefaultUpdateStyle: repo_model.UpdateStyleMerge, DefaultAllowMaintainerEdit: false, } } else { @@ -974,9 +980,6 @@ func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Rep if opts.DefaultMergeStyle != nil { config.DefaultMergeStyle = repo_model.MergeStyle(*opts.DefaultMergeStyle) } - if opts.DefaultUpdateStyle != nil { - config.DefaultUpdateStyle = repo_model.UpdateStyle(*opts.DefaultUpdateStyle) - } if opts.DefaultAllowMaintainerEdit != nil { config.DefaultAllowMaintainerEdit = *opts.DefaultAllowMaintainerEdit } @@ -1042,7 +1045,7 @@ func updateRepoUnits(ctx *context.APIContext, owner string, repo *repo_model.Rep } } - log.Trace("Repository advanced settings updated: %s/%s", owner, repo.Name) + log.Trace("Repository advanced settings updated: %s/%s", owner.Name, repo.Name) return nil } diff --git a/routers/api/v1/repo/repo_test.go b/routers/api/v1/repo/repo_test.go index 69eeb1cfdf..8d6ca9e3b5 100644 --- a/routers/api/v1/repo/repo_test.go +++ b/routers/api/v1/repo/repo_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/api/v1/repo/star.go b/routers/api/v1/repo/star.go index 7a836cd506..99676de119 100644 --- a/routers/api/v1/repo/star.go +++ b/routers/api/v1/repo/star.go @@ -6,11 +6,11 @@ package repo import ( "net/http" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListStargazers list a repository's stargazers diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go index f02150f881..9e36ea0aed 100644 --- a/routers/api/v1/repo/status.go +++ b/routers/api/v1/repo/status.go @@ -7,14 +7,14 @@ import ( "fmt" "net/http" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - commitstatus_service "forgejo.org/services/repository/commitstatus" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" ) // NewCommitStatus creates a new CommitStatus diff --git a/routers/api/v1/repo/subscriber.go b/routers/api/v1/repo/subscriber.go index 37a2bef85c..8584182857 100644 --- a/routers/api/v1/repo/subscriber.go +++ b/routers/api/v1/repo/subscriber.go @@ -6,11 +6,11 @@ package repo import ( "net/http" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListSubscribers list a repo's subscribers (i.e. watchers) diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go index f53a6da811..7dbdd1fcbd 100644 --- a/routers/api/v1/repo/tag.go +++ b/routers/api/v1/repo/tag.go @@ -9,17 +9,17 @@ import ( "net/http" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - releaseservice "forgejo.org/services/release" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + releaseservice "code.gitea.io/gitea/services/release" ) // ListTags list all the tags of a repository diff --git a/routers/api/v1/repo/teams.go b/routers/api/v1/repo/teams.go index 4e9d3c40a9..0ecf3a39d8 100644 --- a/routers/api/v1/repo/teams.go +++ b/routers/api/v1/repo/teams.go @@ -7,11 +7,11 @@ import ( "fmt" "net/http" - "forgejo.org/models/organization" - "forgejo.org/services/context" - "forgejo.org/services/convert" - org_service "forgejo.org/services/org" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + org_service "code.gitea.io/gitea/services/org" + repo_service "code.gitea.io/gitea/services/repository" ) // ListTeams list a repository's teams diff --git a/routers/api/v1/repo/topic.go b/routers/api/v1/repo/topic.go index daa637936e..1d8e675bde 100644 --- a/routers/api/v1/repo/topic.go +++ b/routers/api/v1/repo/topic.go @@ -7,13 +7,13 @@ import ( "net/http" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListTopics returns list of current topics for repo diff --git a/routers/api/v1/repo/transfer.go b/routers/api/v1/repo/transfer.go index 3b6cb4d3f2..0715aed064 100644 --- a/routers/api/v1/repo/transfer.go +++ b/routers/api/v1/repo/transfer.go @@ -8,19 +8,19 @@ import ( "fmt" "net/http" - "forgejo.org/models" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + repo_service "code.gitea.io/gitea/services/repository" ) // Transfer transfers the ownership of a repository diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go index af92170abb..353a996d5b 100644 --- a/routers/api/v1/repo/tree.go +++ b/routers/api/v1/repo/tree.go @@ -6,8 +6,8 @@ package repo import ( "net/http" - "forgejo.org/services/context" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/services/context" + files_service "code.gitea.io/gitea/services/repository/files" ) // GetTree get the tree of a repository. diff --git a/routers/api/v1/repo/wiki.go b/routers/api/v1/repo/wiki.go index bb4cf0f211..12aaa8edf8 100644 --- a/routers/api/v1/repo/wiki.go +++ b/routers/api/v1/repo/wiki.go @@ -9,17 +9,17 @@ import ( "net/http" "net/url" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - notify_service "forgejo.org/services/notify" - wiki_service "forgejo.org/services/wiki" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + notify_service "code.gitea.io/gitea/services/notify" + wiki_service "code.gitea.io/gitea/services/wiki" ) // NewWikiPage response for wiki create request diff --git a/routers/api/v1/settings/settings.go b/routers/api/v1/settings/settings.go index 32ef50423c..c422315b22 100644 --- a/routers/api/v1/settings/settings.go +++ b/routers/api/v1/settings/settings.go @@ -6,9 +6,9 @@ package settings import ( "net/http" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" ) // GetGeneralUISettings returns instance's global settings for ui diff --git a/routers/api/v1/shared/quota.go b/routers/api/v1/shared/quota.go index ceba9fea57..b892df4b2f 100644 --- a/routers/api/v1/shared/quota.go +++ b/routers/api/v1/shared/quota.go @@ -6,10 +6,10 @@ package shared import ( "net/http" - quota_model "forgejo.org/models/quota" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func GetQuota(ctx *context.APIContext, userID int64) { diff --git a/routers/api/v1/shared/runners.go b/routers/api/v1/shared/runners.go index a7811a95b5..f184786d7d 100644 --- a/routers/api/v1/shared/runners.go +++ b/routers/api/v1/shared/runners.go @@ -6,13 +6,10 @@ package shared import ( "errors" "net/http" - "strings" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) // RegistrationToken is a string used to register a runner with a server @@ -33,40 +30,3 @@ func GetRegistrationToken(ctx *context.APIContext, ownerID, repoID int64) { ctx.JSON(http.StatusOK, RegistrationToken{Token: token.Token}) } - -func GetActionRunJobs(ctx *context.APIContext, ownerID, repoID int64) { - labels := strings.Split(ctx.FormTrim("labels"), ",") - - total, err := db.Find[actions_model.ActionRunJob](ctx, &actions_model.FindTaskOptions{ - Status: []actions_model.Status{actions_model.StatusWaiting, actions_model.StatusRunning}, - OwnerID: ownerID, - RepoID: repoID, - }) - if err != nil { - ctx.Error(http.StatusInternalServerError, "CountWaitingActionRunJobs", err) - return - } - - res := fromRunJobModelToResponse(total, labels) - - ctx.JSON(http.StatusOK, res) -} - -func fromRunJobModelToResponse(job []*actions_model.ActionRunJob, labels []string) []*structs.ActionRunJob { - var res []*structs.ActionRunJob - for i := range job { - if job[i].ItRunsOn(labels) { - res = append(res, &structs.ActionRunJob{ - ID: job[i].ID, - RepoID: job[i].RepoID, - OwnerID: job[i].OwnerID, - Name: job[i].Name, - Needs: job[i].Needs, - RunsOn: job[i].RunsOn, - TaskID: job[i].TaskID, - Status: job[i].Status.String(), - }) - } - } - return res -} diff --git a/routers/api/v1/swagger/action.go b/routers/api/v1/swagger/action.go index 6fc58abd76..665f4d0b85 100644 --- a/routers/api/v1/swagger/action.go +++ b/routers/api/v1/swagger/action.go @@ -3,7 +3,7 @@ package swagger -import api "forgejo.org/modules/structs" +import api "code.gitea.io/gitea/modules/structs" // SecretList // swagger:response SecretList @@ -32,17 +32,3 @@ type swaggerResponseVariableList struct { // in:body Body []api.ActionVariable `json:"body"` } - -// RunJobList is a list of action run jobs -// swagger:response RunJobList -type swaggerRunJobList struct { - // in:body - Body []*api.ActionRunJob `json:"body"` -} - -// DispatchWorkflowRun is a Workflow Run after dispatching -// swagger:response DispatchWorkflowRun -type swaggerDispatchWorkflowRun struct { - // in:body - Body *api.DispatchWorkflowRun `json:"body"` -} diff --git a/routers/api/v1/swagger/activity.go b/routers/api/v1/swagger/activity.go index 64466e5e7b..95e1ba9035 100644 --- a/routers/api/v1/swagger/activity.go +++ b/routers/api/v1/swagger/activity.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // ActivityFeedsList diff --git a/routers/api/v1/swagger/activitypub.go b/routers/api/v1/swagger/activitypub.go index 6235009572..91341669da 100644 --- a/routers/api/v1/swagger/activitypub.go +++ b/routers/api/v1/swagger/activitypub.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // ActivityPub diff --git a/routers/api/v1/swagger/app.go b/routers/api/v1/swagger/app.go index 7d62b6d494..6a08b11874 100644 --- a/routers/api/v1/swagger/app.go +++ b/routers/api/v1/swagger/app.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // OAuth2Application diff --git a/routers/api/v1/swagger/cron.go b/routers/api/v1/swagger/cron.go index 2c26b22441..00cfbe0adb 100644 --- a/routers/api/v1/swagger/cron.go +++ b/routers/api/v1/swagger/cron.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // CronList diff --git a/routers/api/v1/swagger/issue.go b/routers/api/v1/swagger/issue.go index b2b5de2228..62458a3424 100644 --- a/routers/api/v1/swagger/issue.go +++ b/routers/api/v1/swagger/issue.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // Issue diff --git a/routers/api/v1/swagger/key.go b/routers/api/v1/swagger/key.go index 27aa72458d..8390833589 100644 --- a/routers/api/v1/swagger/key.go +++ b/routers/api/v1/swagger/key.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // PublicKey diff --git a/routers/api/v1/swagger/misc.go b/routers/api/v1/swagger/misc.go index df95a94571..0553eac2a9 100644 --- a/routers/api/v1/swagger/misc.go +++ b/routers/api/v1/swagger/misc.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // ServerVersion diff --git a/routers/api/v1/swagger/nodeinfo.go b/routers/api/v1/swagger/nodeinfo.go index 227db61648..8650dfa092 100644 --- a/routers/api/v1/swagger/nodeinfo.go +++ b/routers/api/v1/swagger/nodeinfo.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // NodeInfo diff --git a/routers/api/v1/swagger/notify.go b/routers/api/v1/swagger/notify.go index cd60ef2bcb..743d807a0a 100644 --- a/routers/api/v1/swagger/notify.go +++ b/routers/api/v1/swagger/notify.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // NotificationThread diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index 4860f10c98..3034b09ce3 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -5,9 +5,9 @@ package swagger import ( - ffed "forgejo.org/modules/forgefed" - api "forgejo.org/modules/structs" - "forgejo.org/services/forms" + ffed "code.gitea.io/gitea/modules/forgefed" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/forms" ) // not actually a response, just a hack to get go-swagger to include definitions @@ -101,8 +101,6 @@ type swaggerParameterBodies struct { // in:body EditRepoOption api.EditRepoOption // in:body - UpdateBranchRepoOption api.UpdateBranchRepoOption - // in:body TransferRepoOption api.TransferRepoOption // in:body CreateForkOption api.CreateForkOption @@ -216,9 +214,6 @@ type swaggerParameterBodies struct { // in:body CreateVariableOption api.CreateVariableOption - // in:body - RenameOrgOption api.RenameOrgOption - // in:body UpdateVariableOption api.UpdateVariableOption @@ -236,7 +231,4 @@ type swaggerParameterBodies struct { // in:body SetUserQuotaGroupsOptions api.SetUserQuotaGroupsOptions - - // in:body - NoteOptions api.NoteOptions } diff --git a/routers/api/v1/swagger/org.go b/routers/api/v1/swagger/org.go index 2d081708a8..0105446b00 100644 --- a/routers/api/v1/swagger/org.go +++ b/routers/api/v1/swagger/org.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // Organization diff --git a/routers/api/v1/swagger/package.go b/routers/api/v1/swagger/package.go index dd1b45e9aa..eada12d1ea 100644 --- a/routers/api/v1/swagger/package.go +++ b/routers/api/v1/swagger/package.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // Package diff --git a/routers/api/v1/swagger/quota.go b/routers/api/v1/swagger/quota.go index b2ea59fb31..35e633c39d 100644 --- a/routers/api/v1/swagger/quota.go +++ b/routers/api/v1/swagger/quota.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // QuotaInfo diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go index 445e3417fb..ca214b4900 100644 --- a/routers/api/v1/swagger/repo.go +++ b/routers/api/v1/swagger/repo.go @@ -4,7 +4,7 @@ package swagger import ( - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" ) // Repository diff --git a/routers/api/v1/swagger/settings.go b/routers/api/v1/swagger/settings.go index 3a07eaf2e0..a9466699df 100644 --- a/routers/api/v1/swagger/settings.go +++ b/routers/api/v1/swagger/settings.go @@ -3,7 +3,7 @@ package swagger -import api "forgejo.org/modules/structs" +import api "code.gitea.io/gitea/modules/structs" // GeneralRepoSettings // swagger:response GeneralRepoSettings diff --git a/routers/api/v1/swagger/user.go b/routers/api/v1/swagger/user.go index 805cfe3df4..37e28664fb 100644 --- a/routers/api/v1/swagger/user.go +++ b/routers/api/v1/swagger/user.go @@ -4,8 +4,8 @@ package swagger import ( - activities_model "forgejo.org/models/activities" - api "forgejo.org/modules/structs" + activities_model "code.gitea.io/gitea/models/activities" + api "code.gitea.io/gitea/modules/structs" ) // User diff --git a/routers/api/v1/user/action.go b/routers/api/v1/user/action.go index dd816cb7ae..ec5289fdb0 100644 --- a/routers/api/v1/user/action.go +++ b/routers/api/v1/user/action.go @@ -7,15 +7,15 @@ import ( "errors" "net/http" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" - secret_service "forgejo.org/services/secrets" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" + secret_service "code.gitea.io/gitea/services/secrets" ) // create or update one secret of the user scope @@ -228,7 +228,7 @@ func UpdateVariable(ctx *context.APIContext) { if opt.Name == "" { opt.Name = ctx.Params("variablename") } - if _, err := actions_service.UpdateVariable(ctx, v.ID, ctx.Doer.ID, 0, opt.Name, opt.Value); err != nil { + if _, err := actions_service.UpdateVariable(ctx, v.ID, opt.Name, opt.Value); err != nil { if errors.Is(err, util.ErrInvalidArgument) { ctx.Error(http.StatusBadRequest, "UpdateVariable", err) } else { diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index 138ad5a1d2..c4fb2ea38d 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -11,13 +11,13 @@ import ( "strconv" "strings" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // ListAccessTokens list all the access tokens diff --git a/routers/api/v1/user/avatar.go b/routers/api/v1/user/avatar.go index 453682a37b..d3833a32bb 100644 --- a/routers/api/v1/user/avatar.go +++ b/routers/api/v1/user/avatar.go @@ -7,10 +7,10 @@ import ( "encoding/base64" "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) // UpdateAvatar updates the Avatar of an User diff --git a/routers/api/v1/user/email.go b/routers/api/v1/user/email.go index 7b18ea97b0..af5d355ecd 100644 --- a/routers/api/v1/user/email.go +++ b/routers/api/v1/user/email.go @@ -7,13 +7,12 @@ import ( "fmt" "net/http" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - user_service "forgejo.org/services/user" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + user_service "code.gitea.io/gitea/services/user" ) // ListEmails list all of the authenticated user's email addresses @@ -75,12 +74,12 @@ func AddEmail(ctx *context.APIContext) { if err := user_service.AddEmailAddresses(ctx, ctx.Doer, form.Emails); err != nil { if user_model.IsErrEmailAlreadyUsed(err) { ctx.Error(http.StatusUnprocessableEntity, "", "Email address has been used: "+err.(user_model.ErrEmailAlreadyUsed).Email) - } else if validation.IsErrEmailCharIsNotSupported(err) || validation.IsErrEmailInvalid(err) { + } else if user_model.IsErrEmailCharIsNotSupported(err) || user_model.IsErrEmailInvalid(err) { email := "" - if typedError, ok := err.(validation.ErrEmailInvalid); ok { + if typedError, ok := err.(user_model.ErrEmailInvalid); ok { email = typedError.Email } - if typedError, ok := err.(validation.ErrEmailCharIsNotSupported); ok { + if typedError, ok := err.(user_model.ErrEmailCharIsNotSupported); ok { email = typedError.Email } diff --git a/routers/api/v1/user/follower.go b/routers/api/v1/user/follower.go index 643ad49b80..784e2325a3 100644 --- a/routers/api/v1/user/follower.go +++ b/routers/api/v1/user/follower.go @@ -8,11 +8,11 @@ import ( "errors" "net/http" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func responseAPIUsers(ctx *context.APIContext, users []*user_model.User) { diff --git a/routers/api/v1/user/gpg_key.go b/routers/api/v1/user/gpg_key.go index 1581358b66..2fe4eb8e78 100644 --- a/routers/api/v1/user/gpg_key.go +++ b/routers/api/v1/user/gpg_key.go @@ -8,15 +8,15 @@ import ( "net/http" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func listGPGKeys(ctx *context.APIContext, uid int64, listOptions db.ListOptions) { @@ -303,7 +303,11 @@ func DeleteGPGKey(ctx *context.APIContext) { } if err := asymkey_model.DeleteGPGKey(ctx, ctx.Doer, ctx.ParamsInt64(":id")); err != nil { - ctx.Error(http.StatusInternalServerError, "DeleteGPGKey", err) + if asymkey_model.IsErrGPGKeyAccessDenied(err) { + ctx.Error(http.StatusForbidden, "", "You do not have access to this key") + } else { + ctx.Error(http.StatusInternalServerError, "DeleteGPGKey", err) + } return } @@ -313,6 +317,8 @@ func DeleteGPGKey(ctx *context.APIContext) { // HandleAddGPGKeyError handle add GPGKey error func HandleAddGPGKeyError(ctx *context.APIContext, err error, token string) { switch { + case asymkey_model.IsErrGPGKeyAccessDenied(err): + ctx.Error(http.StatusUnprocessableEntity, "GPGKeyAccessDenied", "You do not have access to this GPG key") case asymkey_model.IsErrGPGKeyIDAlreadyUsed(err): ctx.Error(http.StatusUnprocessableEntity, "GPGKeyIDAlreadyUsed", "A key with the same id already exists") case asymkey_model.IsErrGPGKeyParsing(err): diff --git a/routers/api/v1/user/helper.go b/routers/api/v1/user/helper.go index fe0943091f..8b5c64e291 100644 --- a/routers/api/v1/user/helper.go +++ b/routers/api/v1/user/helper.go @@ -6,8 +6,8 @@ package user import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/services/context" ) // GetUserByParamsName get user by name diff --git a/routers/api/v1/user/hook.go b/routers/api/v1/user/hook.go index c8cdf5040d..47b6498d85 100644 --- a/routers/api/v1/user/hook.go +++ b/routers/api/v1/user/hook.go @@ -6,11 +6,11 @@ package user import ( "net/http" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) // ListHooks list the authenticated user's webhooks diff --git a/routers/api/v1/user/key.go b/routers/api/v1/user/key.go index 3aecf5fc3a..1b4ba0a40f 100644 --- a/routers/api/v1/user/key.go +++ b/routers/api/v1/user/key.go @@ -8,18 +8,18 @@ import ( "fmt" "net/http" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/api/v1/repo" - "forgejo.org/routers/api/v1/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/convert" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/repo" + "code.gitea.io/gitea/routers/api/v1/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // appendPrivateInformation appends the owner and key type information to api.PublicKey diff --git a/routers/api/v1/user/quota.go b/routers/api/v1/user/quota.go index 40c8ee43e9..ab2881b355 100644 --- a/routers/api/v1/user/quota.go +++ b/routers/api/v1/user/quota.go @@ -4,8 +4,8 @@ package user import ( - "forgejo.org/routers/api/v1/shared" - "forgejo.org/services/context" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/services/context" ) // GetQuota returns the quota information for the authenticated user diff --git a/routers/api/v1/user/repo.go b/routers/api/v1/user/repo.go index 7b326812a7..f2e11e4562 100644 --- a/routers/api/v1/user/repo.go +++ b/routers/api/v1/user/repo.go @@ -6,13 +6,13 @@ package user import ( "net/http" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + 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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // listUserRepos - List the repositories owned by the given user. @@ -101,9 +101,8 @@ func ListMyRepos(ctx *context.APIContext) { // type: integer // - name: order_by // in: query - // description: order the repositories + // description: order the repositories by name (default), id, or size // type: string - // enum: [name, id, newest, oldest, recentupdate, leastupdate, reversealphabetically, alphabetically, reversesize, size, reversegitsize, gitsize, reverselfssize, lfssize, moststars, feweststars, mostforks, fewestforks] // responses: // "200": // "$ref": "#/responses/RepositoryList" @@ -125,17 +124,17 @@ func ListMyRepos(ctx *context.APIContext) { switch orderBy { case "name": opts.OrderBy = "name ASC" + case "size": + opts.OrderBy = "size DESC" case "id": opts.OrderBy = "id ASC" + case "": default: - if orderBy, ok := repo_model.OrderByFlatMap[orderBy]; ok { - opts.OrderBy = orderBy - } else if orderBy != "" { - ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by") - return - } + ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by") + return } + var err error repos, count, err := repo_model.SearchRepository(ctx, opts) if err != nil { ctx.Error(http.StatusInternalServerError, "SearchRepository", err) diff --git a/routers/api/v1/user/runners.go b/routers/api/v1/user/runners.go index 579e3eb932..dc4c187ffe 100644 --- a/routers/api/v1/user/runners.go +++ b/routers/api/v1/user/runners.go @@ -4,8 +4,8 @@ package user import ( - "forgejo.org/routers/api/v1/shared" - "forgejo.org/services/context" + "code.gitea.io/gitea/routers/api/v1/shared" + "code.gitea.io/gitea/services/context" ) // https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#create-a-registration-token-for-an-organization @@ -28,25 +28,3 @@ func GetRegistrationToken(ctx *context.APIContext) { shared.GetRegistrationToken(ctx, ctx.Doer.ID, 0) } - -// SearchActionRunJobs return a list of actions jobs filtered by the provided parameters -func SearchActionRunJobs(ctx *context.APIContext) { - // swagger:operation GET /user/actions/runners/jobs user userSearchRunJobs - // --- - // summary: Search for user's action jobs according filter conditions - // produces: - // - application/json - // parameters: - // - name: labels - // in: query - // description: a comma separated list of run job labels to search for - // type: string - // responses: - // "200": - // "$ref": "#/responses/RunJobList" - // "401": - // "$ref": "#/responses/unauthorized" - // "403": - // "$ref": "#/responses/forbidden" - shared.GetActionRunJobs(ctx, ctx.Doer.ID, 0) -} diff --git a/routers/api/v1/user/settings.go b/routers/api/v1/user/settings.go index 134b448718..173f06e474 100644 --- a/routers/api/v1/user/settings.go +++ b/routers/api/v1/user/settings.go @@ -6,12 +6,12 @@ package user import ( "net/http" - "forgejo.org/modules/optional" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/modules/optional" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + user_service "code.gitea.io/gitea/services/user" ) // GetUserSettings returns user settings @@ -63,7 +63,6 @@ func UpdateUserSettings(ctx *context.APIContext) { Theme: optional.FromPtr(form.Theme), DiffViewStyle: optional.FromPtr(form.DiffViewStyle), KeepEmailPrivate: optional.FromPtr(form.HideEmail), - KeepPronounsPrivate: optional.FromPtr(form.HidePronouns), KeepActivityPrivate: optional.FromPtr(form.HideActivity), EnableRepoUnitHints: optional.FromPtr(form.EnableRepoUnitHints), } diff --git a/routers/api/v1/user/star.go b/routers/api/v1/user/star.go index 19fa49f2ad..be84b13204 100644 --- a/routers/api/v1/user/star.go +++ b/routers/api/v1/user/star.go @@ -9,15 +9,15 @@ import ( std_context "context" "net/http" - "forgejo.org/models/db" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/repository" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/repository" ) // getStarredRepos returns the repos that the user with the specified userID has diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 5bdd56c892..6c8cde71d3 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -8,12 +8,12 @@ import ( "fmt" "net/http" - activities_model "forgejo.org/models/activities" - user_model "forgejo.org/models/user" - "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + activities_model "code.gitea.io/gitea/models/activities" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // Search search users @@ -74,13 +74,12 @@ func Search(ctx *context.APIContext) { visible = []structs.VisibleType{structs.VisibleTypePublic} } users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ - Actor: ctx.Doer, - Keyword: ctx.FormTrim("q"), - UID: uid, - Type: user_model.UserTypeIndividual, - SearchByEmail: true, - Visible: visible, - ListOptions: listOptions, + Actor: ctx.Doer, + Keyword: ctx.FormTrim("q"), + UID: uid, + Type: user_model.UserTypeIndividual, + Visible: visible, + ListOptions: listOptions, }) if err != nil { ctx.JSON(http.StatusInternalServerError, map[string]any{ diff --git a/routers/api/v1/user/watch.go b/routers/api/v1/user/watch.go index 1358a63f51..dc27a38a03 100644 --- a/routers/api/v1/user/watch.go +++ b/routers/api/v1/user/watch.go @@ -7,14 +7,14 @@ import ( std_context "context" "net/http" - "forgejo.org/models/db" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/routers/api/v1/utils" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/v1/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // getWatchedRepos returns the repos that the user with the specified userID is watching diff --git a/routers/api/v1/utils/block.go b/routers/api/v1/utils/block.go index a1f044d1ef..34fad96034 100644 --- a/routers/api/v1/utils/block.go +++ b/routers/api/v1/utils/block.go @@ -6,10 +6,10 @@ package utils import ( "net/http" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) // ListUserBlockedUsers lists the blocked users of the provided doer. diff --git a/routers/api/v1/utils/git.go b/routers/api/v1/utils/git.go index 5359a54899..4e25137817 100644 --- a/routers/api/v1/utils/git.go +++ b/routers/api/v1/utils/git.go @@ -8,10 +8,10 @@ import ( "fmt" "net/http" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) // ResolveRefOrSha resolve ref to sha if exist diff --git a/routers/api/v1/utils/hook.go b/routers/api/v1/utils/hook.go index d882845008..f1abd49a7d 100644 --- a/routers/api/v1/utils/hook.go +++ b/routers/api/v1/utils/hook.go @@ -9,16 +9,16 @@ import ( "strconv" "strings" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) // ListOwnerHooks lists the webhooks of the provided owner diff --git a/routers/api/v1/utils/page.go b/routers/api/v1/utils/page.go index 4ab141ca64..024ba7b8d9 100644 --- a/routers/api/v1/utils/page.go +++ b/routers/api/v1/utils/page.go @@ -4,9 +4,9 @@ package utils import ( - "forgejo.org/models/db" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetListOptions returns list options using the page and limit parameters diff --git a/routers/common/auth.go b/routers/common/auth.go index d4b3b1fea7..115d65ed10 100644 --- a/routers/common/auth.go +++ b/routers/common/auth.go @@ -4,10 +4,10 @@ package common import ( - user_model "forgejo.org/models/user" - "forgejo.org/modules/web/middleware" - auth_service "forgejo.org/services/auth" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/web/middleware" + auth_service "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" ) type AuthResult struct { @@ -31,7 +31,6 @@ func AuthShared(ctx *context.Base, sessionStore auth_service.SessionStore, authM ctx.Data["SignedUserID"] = ar.Doer.ID ctx.Data["IsAdmin"] = ar.Doer.IsAdmin } else { - ctx.Data["IsSigned"] = false ctx.Data["SignedUserID"] = int64(0) } return ar, nil diff --git a/routers/common/compare.go b/routers/common/compare.go index 9c158814d1..4d1cc2f0d8 100644 --- a/routers/common/compare.go +++ b/routers/common/compare.go @@ -4,9 +4,9 @@ package common import ( - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" ) // CompareInfo represents the collected results from ParseCompareInfo diff --git a/routers/common/db.go b/routers/common/db.go index 0646071264..d7dcfa0122 100644 --- a/routers/common/db.go +++ b/routers/common/db.go @@ -8,12 +8,12 @@ import ( "fmt" "time" - "forgejo.org/models/db" - "forgejo.org/models/migrations" - system_model "forgejo.org/models/system" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/setting/config" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/migrations" + system_model "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/setting/config" "xorm.io/xorm" ) @@ -51,7 +51,7 @@ func migrateWithSetting(x *xorm.Engine) error { } else if current < 0 { // execute migrations when the database isn't initialized even if AutoMigration is false return migrations.Migrate(x) - } else if expected := migrations.ExpectedDBVersion(); current != expected { + } else if expected := migrations.ExpectedVersion(); current != expected { log.Fatal(`"database.AUTO_MIGRATION" is disabled, but current database version %d is not equal to the expected version %d.`+ `You can set "database.AUTO_MIGRATION" to true or migrate manually by running "forgejo [--config /path/to/app.ini] migrate"`, current, expected) } diff --git a/routers/common/errpage.go b/routers/common/errpage.go index 907c278ab1..402ca44c12 100644 --- a/routers/common/errpage.go +++ b/routers/common/errpage.go @@ -7,15 +7,15 @@ import ( "fmt" "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/web/middleware" - "forgejo.org/modules/web/routing" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/modules/web/routing" + "code.gitea.io/gitea/services/context" ) const tplStatus500 base.TplName = "status/500" diff --git a/routers/common/errpage_test.go b/routers/common/errpage_test.go index 3a492ea304..4fd63ba49e 100644 --- a/routers/common/errpage_test.go +++ b/routers/common/errpage_test.go @@ -4,15 +4,16 @@ package common import ( + "context" "errors" "net/http" "net/http/httptest" "net/url" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/test" - "forgejo.org/modules/web/middleware" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/web/middleware" "github.com/stretchr/testify/assert" ) @@ -20,7 +21,7 @@ import ( func TestRenderPanicErrorPage(t *testing.T) { w := httptest.NewRecorder() req := &http.Request{URL: &url.URL{}} - req = req.WithContext(middleware.WithContextData(t.Context())) + req = req.WithContext(middleware.WithContextData(context.Background())) RenderPanicErrorPage(w, req, errors.New("fake panic error (for test only)")) respContent := w.Body.String() assert.Contains(t, respContent, `class="page-content status-page-500"`) diff --git a/routers/common/markup.go b/routers/common/markup.go index 715d7d883f..2d5638ef61 100644 --- a/routers/common/markup.go +++ b/routers/common/markup.go @@ -9,40 +9,35 @@ import ( "net/http" "strings" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" "mvdan.cc/xurls/v2" ) -type Renderer struct { - Mode, Text, URLPrefix, FilePath, BranchPath string - IsWiki bool -} - // RenderMarkup renders markup text for the /markup and /markdown endpoints -func (re *Renderer) RenderMarkup(ctx *context.Base, repo *context.Repository) { +func RenderMarkup(ctx *context.Base, repo *context.Repository, mode, text, urlPrefix, filePath string, wiki bool) { var markupType string relativePath := "" - if len(re.Text) == 0 { + if len(text) == 0 { _, _ = ctx.Write([]byte("")) return } - switch re.Mode { + switch mode { case "markdown": // Raw markdown if err := markdown.RenderRaw(&markup.RenderContext{ Ctx: ctx, Links: markup.Links{ AbsolutePrefix: true, - Base: re.URLPrefix, + Base: urlPrefix, }, - }, strings.NewReader(re.Text), ctx.Resp); err != nil { + }, strings.NewReader(text), ctx.Resp); err != nil { ctx.Error(http.StatusInternalServerError, err.Error()) } return @@ -55,30 +50,30 @@ func (re *Renderer) RenderMarkup(ctx *context.Base, repo *context.Repository) { case "file": // File as document based on file extension markupType = "" - relativePath = re.FilePath + relativePath = filePath default: - ctx.Error(http.StatusUnprocessableEntity, fmt.Sprintf("Unknown mode: %s", re.Mode)) + ctx.Error(http.StatusUnprocessableEntity, fmt.Sprintf("Unknown mode: %s", mode)) return } - if !strings.HasPrefix(setting.AppSubURL+"/", re.URLPrefix) { + if !strings.HasPrefix(setting.AppSubURL+"/", urlPrefix) { // check if urlPrefix is already set to a URL linkRegex, _ := xurls.StrictMatchingScheme("https?://") - m := linkRegex.FindStringIndex(re.URLPrefix) + m := linkRegex.FindStringIndex(urlPrefix) if m == nil { - re.URLPrefix = util.URLJoin(setting.AppURL, re.URLPrefix) + urlPrefix = util.URLJoin(setting.AppURL, urlPrefix) } } meta := map[string]string{} if repo != nil && repo.Repository != nil { - if re.Mode == "comment" { + if mode == "comment" { meta = repo.Repository.ComposeMetas(ctx) } else { meta = repo.Repository.ComposeDocumentMetas(ctx) } } - if re.Mode != "comment" { + if mode != "comment" { meta["mode"] = "document" } @@ -86,14 +81,13 @@ func (re *Renderer) RenderMarkup(ctx *context.Base, repo *context.Repository) { Ctx: ctx, Links: markup.Links{ AbsolutePrefix: true, - Base: re.URLPrefix, - BranchPath: re.BranchPath, + Base: urlPrefix, }, Metas: meta, - IsWiki: re.IsWiki, + IsWiki: wiki, Type: markupType, RelativePath: relativePath, - }, strings.NewReader(re.Text), ctx.Resp); err != nil { + }, strings.NewReader(text), ctx.Resp); err != nil { if markup.IsErrUnsupportedRenderExtension(err) { ctx.Error(http.StatusUnprocessableEntity, err.Error()) } else { diff --git a/routers/common/middleware.go b/routers/common/middleware.go index d44f046a1e..59e59b8d3f 100644 --- a/routers/common/middleware.go +++ b/routers/common/middleware.go @@ -6,15 +6,14 @@ package common import ( "fmt" "net/http" - "runtime/trace" "strings" - "forgejo.org/modules/cache" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/modules/web/middleware" - "forgejo.org/modules/web/routing" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/modules/web/routing" + "code.gitea.io/gitea/services/context" "code.forgejo.org/go-chi/session" "github.com/chi-middleware/proxy" @@ -44,8 +43,6 @@ func ProtocolMiddlewares() (handlers []any) { return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { ctx, _, finished := process.GetManager().AddTypedContext(req.Context(), fmt.Sprintf("%s: %s", req.Method, req.RequestURI), process.RequestProcessType, true) defer finished() - trace.Log(ctx, "method", req.Method) - trace.Log(ctx, "url", req.RequestURI) next.ServeHTTP(context.WrapResponseWriter(resp), req.WithContext(cache.WithCacheContext(ctx))) }) }) @@ -77,27 +74,28 @@ func ProtocolMiddlewares() (handlers []any) { func stripSlashesMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { - // Ensure that URL.RawPath is always set. + // First of all escape the URL RawPath to ensure that all routing is done using a correctly escaped URL req.URL.RawPath = req.URL.EscapedPath() - sanitize := func(path string) string { - sanitizedPath := &strings.Builder{} - prevWasSlash := false - for _, chr := range strings.TrimRight(path, "/") { - if chr != '/' || !prevWasSlash { - sanitizedPath.WriteRune(chr) - } - prevWasSlash = chr == '/' - } - return sanitizedPath.String() + urlPath := req.URL.RawPath + rctx := chi.RouteContext(req.Context()) + if rctx != nil && rctx.RoutePath != "" { + urlPath = rctx.RoutePath } - // Sanitize the unescaped path for application logic. - req.URL.Path = sanitize(req.URL.Path) - rctx := chi.RouteContext(req.Context()) - if rctx != nil { - // Sanitize the escaped path for routing. - rctx.RoutePath = sanitize(req.URL.RawPath) + sanitizedPath := &strings.Builder{} + prevWasSlash := false + for _, chr := range strings.TrimRight(urlPath, "/") { + if chr != '/' || !prevWasSlash { + sanitizedPath.WriteRune(chr) + } + prevWasSlash = chr == '/' + } + + if rctx == nil { + req.URL.Path = sanitizedPath.String() + } else { + rctx.RoutePath = sanitizedPath.String() } next.ServeHTTP(resp, req) }) diff --git a/routers/common/middleware_test.go b/routers/common/middleware_test.go index b9c1b226e8..f16b9374ec 100644 --- a/routers/common/middleware_test.go +++ b/routers/common/middleware_test.go @@ -7,18 +7,14 @@ import ( "net/http/httptest" "testing" - "forgejo.org/modules/web" - - chi "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" ) func TestStripSlashesMiddleware(t *testing.T) { type test struct { - name string - expectedPath string - expectedNormalPath string - inputPath string + name string + expectedPath string + inputPath string } tests := []test{ @@ -47,51 +43,28 @@ func TestStripSlashesMiddleware(t *testing.T) { inputPath: "/user2//repo1/", expectedPath: "/user2/repo1", }, - { - name: "path with slashes in the beginning", - inputPath: "https://codeberg.org//user2/repo1/", - expectedPath: "/user2/repo1", - }, { name: "path with slashes and query params", inputPath: "/repo//migrate?service_type=3", expectedPath: "/repo/migrate", }, { - name: "path with encoded slash", - inputPath: "/user2/%2F%2Frepo1", - expectedPath: "/user2/%2F%2Frepo1", - expectedNormalPath: "/user2/repo1", - }, - { - name: "path with space", - inputPath: "/assets/css/theme%20cappuccino.css", - expectedPath: "/assets/css/theme%20cappuccino.css", - expectedNormalPath: "/assets/css/theme cappuccino.css", + name: "path with encoded slash", + inputPath: "/user2/%2F%2Frepo1", + expectedPath: "/user2/%2F%2Frepo1", }, } for _, tt := range tests { - r := web.NewRoute() - r.Use(stripSlashesMiddleware) - - called := false - r.Get("*", func(w http.ResponseWriter, r *http.Request) { - if tt.expectedNormalPath != "" { - assert.Equal(t, tt.expectedNormalPath, r.URL.Path) - } else { - assert.Equal(t, tt.expectedPath, r.URL.Path) - } - - rctx := chi.RouteContext(r.Context()) - assert.Equal(t, tt.expectedPath, rctx.RoutePath) - - called = true + testMiddleware := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, tt.expectedPath, r.URL.Path) }) + // pass the test middleware to validate the changes + handlerToTest := stripSlashesMiddleware(testMiddleware) // create a mock request to use req := httptest.NewRequest("GET", tt.inputPath, nil) - r.ServeHTTP(httptest.NewRecorder(), req) - assert.True(t, called) + // call the handler using a mock response recorder + handlerToTest.ServeHTTP(httptest.NewRecorder(), req) } } diff --git a/routers/common/redirect.go b/routers/common/redirect.go index 8c13911a9c..9bf2025e19 100644 --- a/routers/common/redirect.go +++ b/routers/common/redirect.go @@ -6,7 +6,7 @@ package common import ( "net/http" - "forgejo.org/modules/httplib" + "code.gitea.io/gitea/modules/httplib" ) // FetchRedirectDelegate helps the "fetch" requests to redirect to the correct location diff --git a/routers/common/serve.go b/routers/common/serve.go index 9d017ec5a1..446908db75 100644 --- a/routers/common/serve.go +++ b/routers/common/serve.go @@ -7,11 +7,11 @@ import ( "io" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/httplib" - "forgejo.org/modules/log" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) // ServeBlob download a git.Blob diff --git a/routers/init.go b/routers/init.go index 5f9dbbb4dd..821a0ef38c 100644 --- a/routers/init.go +++ b/routers/init.go @@ -8,51 +8,50 @@ import ( "reflect" "runtime" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - authmodel "forgejo.org/models/auth" - "forgejo.org/modules/annex" - "forgejo.org/modules/cache" - "forgejo.org/modules/eventsource" - "forgejo.org/modules/git" - "forgejo.org/modules/highlight" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/external" - "forgejo.org/modules/setting" - "forgejo.org/modules/ssh" - "forgejo.org/modules/storage" - "forgejo.org/modules/svg" - "forgejo.org/modules/system" - "forgejo.org/modules/templates" - "forgejo.org/modules/translation" - "forgejo.org/modules/web" - actions_router "forgejo.org/routers/api/actions" - forgejo "forgejo.org/routers/api/forgejo/v1" - packages_router "forgejo.org/routers/api/packages" - apiv1 "forgejo.org/routers/api/v1" - "forgejo.org/routers/common" - "forgejo.org/routers/private" - web_routers "forgejo.org/routers/web" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/automerge" - "forgejo.org/services/cron" - feed_service "forgejo.org/services/feed" - indexer_service "forgejo.org/services/indexer" - "forgejo.org/services/mailer" - mailer_incoming "forgejo.org/services/mailer/incoming" - markup_service "forgejo.org/services/markup" - repo_migrations "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" - pull_service "forgejo.org/services/pull" - release_service "forgejo.org/services/release" - repo_service "forgejo.org/services/repository" - "forgejo.org/services/repository/archiver" - "forgejo.org/services/task" - "forgejo.org/services/uinotification" - "forgejo.org/services/webhook" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + authmodel "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/eventsource" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/highlight" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/external" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/ssh" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/svg" + "code.gitea.io/gitea/modules/system" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/web" + actions_router "code.gitea.io/gitea/routers/api/actions" + forgejo "code.gitea.io/gitea/routers/api/forgejo/v1" + packages_router "code.gitea.io/gitea/routers/api/packages" + apiv1 "code.gitea.io/gitea/routers/api/v1" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/routers/private" + web_routers "code.gitea.io/gitea/routers/web" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/automerge" + "code.gitea.io/gitea/services/cron" + feed_service "code.gitea.io/gitea/services/feed" + indexer_service "code.gitea.io/gitea/services/indexer" + "code.gitea.io/gitea/services/mailer" + mailer_incoming "code.gitea.io/gitea/services/mailer/incoming" + markup_service "code.gitea.io/gitea/services/markup" + repo_migrations "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" + pull_service "code.gitea.io/gitea/services/pull" + release_service "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/services/repository/archiver" + "code.gitea.io/gitea/services/task" + "code.gitea.io/gitea/services/uinotification" + "code.gitea.io/gitea/services/webhook" ) func mustInit(fn func() error) { @@ -168,8 +167,6 @@ func InitWebInstalled(ctx context.Context) { actions_service.Init() - mustInit(annex.Init) - // Finally start up the cron cron.NewContext(ctx) } diff --git a/routers/install/install.go b/routers/install/install.go index b9333a9e16..24db25f459 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -15,25 +15,26 @@ import ( "strings" "time" - "forgejo.org/models/db" - db_install "forgejo.org/models/db/install" - "forgejo.org/models/migrations" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password/hash" - "forgejo.org/modules/base" - "forgejo.org/modules/generate" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/translation" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - "forgejo.org/routers/common" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/db" + db_install "code.gitea.io/gitea/models/db/install" + "code.gitea.io/gitea/models/migrations" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/password/hash" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/generate" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/user" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" "code.forgejo.org/go-chi/session" ) @@ -118,7 +119,15 @@ func Install(ctx *context.Context) { form.AppSlogan = "Beyond coding. We Forge." form.RepoRootPath = setting.RepoRootPath form.LFSRootPath = setting.LFS.Storage.Path - form.RunUser = setting.RunUser + + // Note(unknown): it's hard for Windows users change a running user, + // so just use current one if config says default. + if setting.IsWindows && setting.RunUser == "git" { + form.RunUser = user.CurrentUsername() + } else { + form.RunUser = setting.RunUser + } + form.Domain = setting.Domain form.SSHPort = setting.SSH.Port form.HTTPPort = setting.HTTPPort diff --git a/routers/install/routes.go b/routers/install/routes.go index f7fb40f688..06c9d389a6 100644 --- a/routers/install/routes.go +++ b/routers/install/routes.go @@ -8,12 +8,12 @@ import ( "html" "net/http" - "forgejo.org/modules/public" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/routers/web/healthcheck" - "forgejo.org/services/forms" + "code.gitea.io/gitea/modules/public" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/routers/web/healthcheck" + "code.gitea.io/gitea/services/forms" ) // Routes registers the installation routes diff --git a/routers/install/routes_test.go b/routers/install/routes_test.go index a504cf1baa..2aa7f5d7b7 100644 --- a/routers/install/routes_test.go +++ b/routers/install/routes_test.go @@ -7,7 +7,7 @@ import ( "net/http/httptest" "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" ) diff --git a/routers/private/actions.go b/routers/private/actions.go index 441fb881ed..425c480b3e 100644 --- a/routers/private/actions.go +++ b/routers/private/actions.go @@ -10,14 +10,14 @@ import ( "net/http" "strings" - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/util" - "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + 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/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) // GenerateActionsRunnerToken generates a new runner token for a given scope diff --git a/routers/private/default_branch.go b/routers/private/default_branch.go index da185e1ab1..33890be6a9 100644 --- a/routers/private/default_branch.go +++ b/routers/private/default_branch.go @@ -7,10 +7,11 @@ import ( "fmt" "net/http" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/private" - gitea_context "forgejo.org/services/context" + 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/private" + gitea_context "code.gitea.io/gitea/services/context" ) // SetDefaultBranch updates the default branch @@ -21,10 +22,12 @@ func SetDefaultBranch(ctx *gitea_context.PrivateContext) { ctx.Repo.Repository.DefaultBranch = branch if err := gitrepo.SetDefaultBranch(ctx, ctx.Repo.Repository, ctx.Repo.Repository.DefaultBranch); err != nil { - ctx.JSON(http.StatusInternalServerError, private.Response{ - Err: fmt.Sprintf("Unable to set default branch on repository: %s/%s Error: %v", ownerName, repoName, err), - }) - return + if !git.IsErrUnsupportedVersion(err) { + ctx.JSON(http.StatusInternalServerError, private.Response{ + Err: fmt.Sprintf("Unable to set default branch on repository: %s/%s Error: %v", ownerName, repoName, err), + }) + return + } } if err := repo_model.UpdateDefaultBranch(ctx, ctx.Repo.Repository); err != nil { diff --git a/routers/private/hook_post_receive.go b/routers/private/hook_post_receive.go index c7748b01c8..11d1161e85 100644 --- a/routers/private/hook_post_receive.go +++ b/routers/private/hook_post_receive.go @@ -10,25 +10,25 @@ import ( "strconv" "time" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - pull_model "forgejo.org/models/pull" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/git/pushoptions" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - timeutil "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - gitea_context "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + 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/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pushoptions" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + timeutil "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + gitea_context "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) // HookPostReceive updates services and users diff --git a/routers/private/hook_post_receive_test.go b/routers/private/hook_post_receive_test.go index bbd0c45769..bfd647e365 100644 --- a/routers/private/hook_post_receive_test.go +++ b/routers/private/hook_post_receive_test.go @@ -6,15 +6,15 @@ package private import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - pull_model "forgejo.org/models/pull" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/private" - repo_module "forgejo.org/modules/repository" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + pull_model "code.gitea.io/gitea/models/pull" + 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/private" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -28,7 +28,7 @@ func TestHandlePullRequestMerging(t *testing.T) { user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - err = pull_model.ScheduleAutoMerge(db.DefaultContext, user1, pr.ID, repo_model.MergeStyleSquash, "squash merge a pr", false) + err = pull_model.ScheduleAutoMerge(db.DefaultContext, user1, pr.ID, repo_model.MergeStyleSquash, "squash merge a pr") require.NoError(t, err) autoMerge := unittest.AssertExistsAndLoadBean(t, &pull_model.AutoMerge{PullID: pr.ID}) diff --git a/routers/private/hook_pre_receive.go b/routers/private/hook_pre_receive.go index 191273209e..4b8439d2da 100644 --- a/routers/private/hook_pre_receive.go +++ b/routers/private/hook_pre_receive.go @@ -9,22 +9,22 @@ import ( "net/http" "os" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - perm_model "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - gitea_context "forgejo.org/services/context" - pull_service "forgejo.org/services/pull" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + perm_model "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + "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/private" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + gitea_context "code.gitea.io/gitea/services/context" + pull_service "code.gitea.io/gitea/services/pull" ) type preReceiveContext struct { diff --git a/routers/private/hook_proc_receive.go b/routers/private/hook_proc_receive.go index cd45794261..e4aabd858c 100644 --- a/routers/private/hook_proc_receive.go +++ b/routers/private/hook_proc_receive.go @@ -6,13 +6,13 @@ package private import ( "net/http" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/web" - "forgejo.org/services/agit" - gitea_context "forgejo.org/services/context" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/agit" + gitea_context "code.gitea.io/gitea/services/context" ) // HookProcReceive proc-receive hook - only handles agit Proc-Receive requests at present diff --git a/routers/private/hook_verification.go b/routers/private/hook_verification.go index e9a1967bd2..764c976fa9 100644 --- a/routers/private/hook_verification.go +++ b/routers/private/hook_verification.go @@ -10,9 +10,9 @@ import ( "io" "os" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) // This file contains commit verification functions for refs passed across in hooks diff --git a/routers/private/hook_verification_test.go b/routers/private/hook_verification_test.go index 35458f672e..5f0d1d0f4f 100644 --- a/routers/private/hook_verification_test.go +++ b/routers/private/hook_verification_test.go @@ -4,10 +4,11 @@ package private import ( + "context" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/git" "github.com/stretchr/testify/require" ) @@ -17,7 +18,7 @@ var testReposDir = "tests/repos/" func TestVerifyCommits(t *testing.T) { unittest.PrepareTestEnv(t) - gitRepo, err := git.OpenRepository(t.Context(), testReposDir+"repo1_hook_verification") + gitRepo, err := git.OpenRepository(context.Background(), testReposDir+"repo1_hook_verification") defer gitRepo.Close() require.NoError(t, err) diff --git a/routers/private/internal.go b/routers/private/internal.go index 5e8d51d970..311f59b60e 100644 --- a/routers/private/internal.go +++ b/routers/private/internal.go @@ -9,13 +9,13 @@ import ( "net/http" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" chi_middleware "github.com/go-chi/chi/v5/middleware" ) diff --git a/routers/private/internal_repo.go b/routers/private/internal_repo.go index f237d2c676..e8ee8ba8ac 100644 --- a/routers/private/internal_repo.go +++ b/routers/private/internal_repo.go @@ -8,11 +8,11 @@ import ( "fmt" "net/http" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - gitea_context "forgejo.org/services/context" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + gitea_context "code.gitea.io/gitea/services/context" ) // This file contains common functions relating to setting the Repository for the internal routes diff --git a/routers/private/key.go b/routers/private/key.go index 2d77c9c5be..5b8f238a83 100644 --- a/routers/private/key.go +++ b/routers/private/key.go @@ -6,10 +6,10 @@ package private import ( "net/http" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/modules/private" - "forgejo.org/modules/timeutil" - "forgejo.org/services/context" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/services/context" ) // UpdatePublicKeyInRepo update public key and deploy key updates diff --git a/routers/private/mail.go b/routers/private/mail.go index 2b96ce910e..cf3abb31c6 100644 --- a/routers/private/mail.go +++ b/routers/private/mail.go @@ -9,14 +9,14 @@ import ( "net/http" "strconv" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - "forgejo.org/services/mailer" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/mailer" ) // SendEmail pushes messages to mail queue diff --git a/routers/private/main_test.go b/routers/private/main_test.go index 1b7f00f439..a6bec72b41 100644 --- a/routers/private/main_test.go +++ b/routers/private/main_test.go @@ -6,7 +6,7 @@ package private import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/private/manager.go b/routers/private/manager.go index 7ab198f71b..a6aa03e4ec 100644 --- a/routers/private/manager.go +++ b/routers/private/manager.go @@ -7,16 +7,16 @@ import ( "fmt" "net/http" - "forgejo.org/models/db" - "forgejo.org/modules/graceful" - "forgejo.org/modules/graceful/releasereopen" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/web" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/graceful/releasereopen" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" ) // ReloadTemplates reloads all the templates diff --git a/routers/private/manager_process.go b/routers/private/manager_process.go index 87447da2be..9a0298a37c 100644 --- a/routers/private/manager_process.go +++ b/routers/private/manager_process.go @@ -11,10 +11,10 @@ import ( "runtime" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - process_module "forgejo.org/modules/process" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + process_module "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/services/context" ) // Processes prints out the processes diff --git a/routers/private/manager_unix.go b/routers/private/manager_unix.go index c831b44036..0c63ebc918 100644 --- a/routers/private/manager_unix.go +++ b/routers/private/manager_unix.go @@ -1,13 +1,15 @@ // Copyright 2020 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT +//go:build !windows + package private import ( "net/http" - "forgejo.org/modules/graceful" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/services/context" ) // Restart causes the server to perform a graceful restart diff --git a/routers/private/manager_windows.go b/routers/private/manager_windows.go new file mode 100644 index 0000000000..f1b9365f52 --- /dev/null +++ b/routers/private/manager_windows.go @@ -0,0 +1,27 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build windows + +package private + +import ( + "net/http" + + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/services/context" +) + +// Restart is not implemented for Windows based servers as they can't fork +func Restart(ctx *context.PrivateContext) { + ctx.JSON(http.StatusNotImplemented, private.Response{ + UserMsg: "windows servers cannot be gracefully restarted - shutdown and restart manually", + }) +} + +// Shutdown causes the server to perform a graceful shutdown +func Shutdown(ctx *context.PrivateContext) { + graceful.GetManager().DoGracefulShutdown() + ctx.PlainText(http.StatusOK, "success") +} diff --git a/routers/private/restore_repo.go b/routers/private/restore_repo.go index 6586c9bb2b..4e95d3071d 100644 --- a/routers/private/restore_repo.go +++ b/routers/private/restore_repo.go @@ -7,10 +7,10 @@ import ( "io" "net/http" - "forgejo.org/modules/json" - "forgejo.org/modules/private" - myCtx "forgejo.org/services/context" - "forgejo.org/services/migrations" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/private" + myCtx "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/migrations" ) // RestoreRepo restore a repository from data diff --git a/routers/private/serv.go b/routers/private/serv.go index b554afa146..a3a0c6961a 100644 --- a/routers/private/serv.go +++ b/routers/private/serv.go @@ -8,19 +8,19 @@ import ( "net/http" "strings" - asymkey_model "forgejo.org/models/asymkey" - "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/git" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" - wiki_service "forgejo.org/services/wiki" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" + wiki_service "code.gitea.io/gitea/services/wiki" ) // ServNoCommand returns information about the provided keyid @@ -300,14 +300,8 @@ func ServCommand(ctx *context.PrivateContext) { return } } else { - // We don't know yet which references the Git client wants to write to, - // but for AGit flow we have to degrade this check to a read permission. - // So if we support proc-receive (needed for AGit flow) and the unit type - // is code and we know the Git client wants to write to us, then degrade - // the permission check to read. The pre-receive hook will do another - // permission check which ensure for non AGit flow references the write - // permission is checked. - if git.SupportProcReceive && unitType == unit.TypeCode && ctx.FormString("verb") == "git-receive-pack" { + // Because of the special ref "refs/for" we will need to delay write permission check + if git.SupportProcReceive && unitType == unit.TypeCode { mode = perm.AccessModeRead } diff --git a/routers/private/ssh_log.go b/routers/private/ssh_log.go index f6974967c0..5bec632ead 100644 --- a/routers/private/ssh_log.go +++ b/routers/private/ssh_log.go @@ -6,11 +6,11 @@ package private import ( "net/http" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" ) // SSHLog hook to response ssh log diff --git a/routers/web/admin/admin.go b/routers/web/admin/admin.go index 96a714376b..067203b28b 100644 --- a/routers/web/admin/admin.go +++ b/routers/web/admin/admin.go @@ -11,20 +11,20 @@ import ( "runtime" "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/cache" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/updatechecker" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/cron" - "forgejo.org/services/forms" - release_service "forgejo.org/services/release" - repo_service "forgejo.org/services/repository" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/updatechecker" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/cron" + "code.gitea.io/gitea/services/forms" + release_service "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/admin/admin_test.go b/routers/web/admin/admin_test.go index d0c3c2b56f..3518869ede 100644 --- a/routers/web/admin/admin_test.go +++ b/routers/web/admin/admin_test.go @@ -6,11 +6,11 @@ package admin import ( "testing" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/services/contexttest" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/admin/applications.go b/routers/web/admin/applications.go index ba15e0a000..8583398074 100644 --- a/routers/web/admin/applications.go +++ b/routers/web/admin/applications.go @@ -7,12 +7,12 @@ import ( "fmt" "net/http" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - user_setting "forgejo.org/routers/web/user/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + user_setting "code.gitea.io/gitea/routers/web/user/setting" + "code.gitea.io/gitea/services/context" ) var ( diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go index 2c6dc76305..799b7e8a84 100644 --- a/routers/web/admin/auths.go +++ b/routers/web/admin/auths.go @@ -4,26 +4,30 @@ package admin import ( + "errors" "fmt" "net/http" "net/url" + "regexp" "strconv" "strings" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/auth/pam" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - auth_service "forgejo.org/services/auth" - "forgejo.org/services/auth/source/ldap" - "forgejo.org/services/auth/source/oauth2" - pam_service "forgejo.org/services/auth/source/pam" - "forgejo.org/services/auth/source/smtp" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/auth/pam" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + auth_service "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/ldap" + "code.gitea.io/gitea/services/auth/source/oauth2" + pam_service "code.gitea.io/gitea/services/auth/source/pam" + "code.gitea.io/gitea/services/auth/source/smtp" + "code.gitea.io/gitea/services/auth/source/sspi" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" "xorm.io/xorm/convert" ) @@ -34,6 +38,11 @@ const ( tplAuthEdit base.TplName = "admin/auth/edit" ) +var ( + separatorAntiPattern = regexp.MustCompile(`[^\w-\.]`) + langCodePattern = regexp.MustCompile(`^[a-z]{2}-[A-Z]{2}$`) +) + // Authentications show authentication config page func Authentications(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("admin.authentication") @@ -61,6 +70,7 @@ var ( {auth.DLDAP.String(), auth.DLDAP}, {auth.SMTP.String(), auth.SMTP}, {auth.OAuth2.String(), auth.OAuth2}, + {auth.SSPI.String(), auth.SSPI}, } if pam.Supported { items = append(items, dropdownItem{auth.Names[auth.PAM], auth.PAM}) @@ -92,6 +102,12 @@ func NewAuthSource(ctx *context.Context) { oauth2providers := oauth2.GetSupportedOAuth2Providers() ctx.Data["OAuth2Providers"] = oauth2providers + ctx.Data["SSPIAutoCreateUsers"] = true + ctx.Data["SSPIAutoActivateUsers"] = true + ctx.Data["SSPIStripDomainNames"] = true + ctx.Data["SSPISeparatorReplacement"] = "_" + ctx.Data["SSPIDefaultLanguage"] = "" + // only the first as default ctx.Data["oauth2_provider"] = oauth2providers[0].Name() @@ -181,7 +197,6 @@ func parseOAuth2Config(form forms.AuthenticationForm) *oauth2.Source { CustomURLMapping: customURLMapping, IconURL: form.Oauth2IconURL, Scopes: scopes, - AttributeSSHPublicKey: form.Oauth2AttributeSSHPublicKey, RequiredClaimName: form.Oauth2RequiredClaimName, RequiredClaimValue: form.Oauth2RequiredClaimValue, SkipLocalTwoFA: form.SkipLocalTwoFA, @@ -193,6 +208,30 @@ func parseOAuth2Config(form forms.AuthenticationForm) *oauth2.Source { } } +func parseSSPIConfig(ctx *context.Context, form forms.AuthenticationForm) (*sspi.Source, error) { + if util.IsEmptyString(form.SSPISeparatorReplacement) { + ctx.Data["Err_SSPISeparatorReplacement"] = true + return nil, errors.New(ctx.Locale.TrString("form.SSPISeparatorReplacement") + ctx.Locale.TrString("form.require_error")) + } + if separatorAntiPattern.MatchString(form.SSPISeparatorReplacement) { + ctx.Data["Err_SSPISeparatorReplacement"] = true + return nil, errors.New(ctx.Locale.TrString("form.SSPISeparatorReplacement") + ctx.Locale.TrString("form.alpha_dash_dot_error")) + } + + if form.SSPIDefaultLanguage != "" && !langCodePattern.MatchString(form.SSPIDefaultLanguage) { + ctx.Data["Err_SSPIDefaultLanguage"] = true + return nil, errors.New(ctx.Locale.TrString("form.lang_select_error")) + } + + return &sspi.Source{ + AutoCreateUsers: form.SSPIAutoCreateUsers, + AutoActivateUsers: form.SSPIAutoActivateUsers, + StripDomainNames: form.SSPIStripDomainNames, + SeparatorReplacement: form.SSPISeparatorReplacement, + DefaultLanguage: form.SSPIDefaultLanguage, + }, nil +} + // NewAuthSourcePost response for adding an auth source func NewAuthSourcePost(ctx *context.Context) { form := *web.GetForm(ctx).(*forms.AuthenticationForm) @@ -207,6 +246,12 @@ func NewAuthSourcePost(ctx *context.Context) { oauth2providers := oauth2.GetSupportedOAuth2Providers() ctx.Data["OAuth2Providers"] = oauth2providers + ctx.Data["SSPIAutoCreateUsers"] = true + ctx.Data["SSPIAutoActivateUsers"] = true + ctx.Data["SSPIStripDomainNames"] = true + ctx.Data["SSPISeparatorReplacement"] = "_" + ctx.Data["SSPIDefaultLanguage"] = "" + hasTLS := false var config convert.Conversion switch auth.Type(form.Type) { @@ -233,6 +278,19 @@ func NewAuthSourcePost(ctx *context.Context) { return } } + case auth.SSPI: + var err error + config, err = parseSSPIConfig(ctx, form) + if err != nil { + ctx.RenderWithErr(err.Error(), tplAuthNew, form) + return + } + existing, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{LoginType: auth.SSPI}) + if err != nil || len(existing) > 0 { + ctx.Data["Err_Type"] = true + ctx.RenderWithErr(ctx.Tr("admin.auths.login_source_of_type_exist"), tplAuthNew, form) + return + } default: ctx.Error(http.StatusBadRequest) return @@ -349,6 +407,12 @@ func EditAuthSourcePost(ctx *context.Context) { return } } + case auth.SSPI: + config, err = parseSSPIConfig(ctx, form) + if err != nil { + ctx.RenderWithErr(err.Error(), tplAuthEdit, form) + return + } default: ctx.Error(http.StatusBadRequest) return diff --git a/routers/web/admin/config.go b/routers/web/admin/config.go index f99a193960..06d0ea60fb 100644 --- a/routers/web/admin/config.go +++ b/routers/web/admin/config.go @@ -10,17 +10,17 @@ import ( "strconv" "strings" - system_model "forgejo.org/models/system" - "forgejo.org/modules/base" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/setting/config" - "forgejo.org/modules/util" - "forgejo.org/services/context" - "forgejo.org/services/mailer" + system_model "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/setting/config" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/mailer" "code.forgejo.org/go-chi/session" ) diff --git a/routers/web/admin/diagnosis.go b/routers/web/admin/diagnosis.go index 8b0ec45214..020554a35a 100644 --- a/routers/web/admin/diagnosis.go +++ b/routers/web/admin/diagnosis.go @@ -5,26 +5,27 @@ package admin import ( "archive/zip" - "bytes" "fmt" - "io" - "runtime" "runtime/pprof" - "runtime/trace" "time" - "forgejo.org/modules/httplib" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/services/context" ) func MonitorDiagnosis(ctx *context.Context) { seconds := ctx.FormInt64("seconds") - seconds = max(5, min(300, seconds)) + if seconds <= 5 { + seconds = 5 + } + if seconds > 300 { + seconds = 300 + } httplib.ServeSetHeaders(ctx.Resp, &httplib.ServeHeaderOptions{ ContentType: "application/zip", Disposition: "attachment", - Filename: fmt.Sprintf("forgejo-diagnosis-%s.zip", time.Now().Format("20060102-150405")), + Filename: fmt.Sprintf("gitea-diagnosis-%s.zip", time.Now().Format("20060102-150405")), }) zipWriter := zip.NewWriter(ctx.Resp) @@ -43,33 +44,14 @@ func MonitorDiagnosis(ctx *context.Context) { return } - if err := pprof.StartCPUProfile(f); err != nil { + err = pprof.StartCPUProfile(f) + if err == nil { + time.Sleep(time.Duration(seconds) * time.Second) + pprof.StopCPUProfile() + } else { _, _ = f.Write([]byte(err.Error())) } - traceBuf := &bytes.Buffer{} - if err := trace.Start(traceBuf); err != nil { - _, _ = traceBuf.Write([]byte(err.Error())) - } - - select { - case <-time.After(time.Duration(seconds) * time.Second): - case <-ctx.Done(): - } - pprof.StopCPUProfile() - trace.Stop() - - f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "trace.dat", Method: zip.Deflate, Modified: time.Now()}) - if err != nil { - ctx.ServerError("Failed to create zip file", err) - return - } - - if _, err := io.Copy(f, traceBuf); err != nil { - ctx.ServerError("Failed to create zip file", err) - return - } - f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "goroutine-after.txt", Method: zip.Deflate, Modified: time.Now()}) if err != nil { ctx.ServerError("Failed to create zip file", err) @@ -82,8 +64,5 @@ func MonitorDiagnosis(ctx *context.Context) { ctx.ServerError("Failed to create zip file", err) return } - // To avoid showing memory that actually can be cleaned, run the garbage - // collector. - runtime.GC() _ = pprof.Lookup("heap").WriteTo(f, 0) } diff --git a/routers/web/admin/emails.go b/routers/web/admin/emails.go index a4421cf495..f0d8555070 100644 --- a/routers/web/admin/emails.go +++ b/routers/web/admin/emails.go @@ -8,14 +8,14 @@ import ( "net/http" "net/url" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - "forgejo.org/services/user" + "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" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/user" ) const ( diff --git a/routers/web/admin/hooks.go b/routers/web/admin/hooks.go index aeceffe848..cdca0a5c2d 100644 --- a/routers/web/admin/hooks.go +++ b/routers/web/admin/hooks.go @@ -6,11 +6,11 @@ package admin import ( "net/http" - "forgejo.org/models/webhook" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) const ( diff --git a/routers/web/admin/main_test.go b/routers/web/admin/main_test.go index bccb0d7058..e1294ddbb4 100644 --- a/routers/web/admin/main_test.go +++ b/routers/web/admin/main_test.go @@ -6,7 +6,7 @@ package admin import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/admin/notice.go b/routers/web/admin/notice.go index 8bcaadf915..36303cbc06 100644 --- a/routers/web/admin/notice.go +++ b/routers/web/admin/notice.go @@ -8,12 +8,12 @@ import ( "net/http" "strconv" - "forgejo.org/models/db" - system_model "forgejo.org/models/system" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + system_model "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/admin/orgs.go b/routers/web/admin/orgs.go index 6ece35dcaf..cea28f8220 100644 --- a/routers/web/admin/orgs.go +++ b/routers/web/admin/orgs.go @@ -5,13 +5,13 @@ package admin import ( - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/routers/web/explore" - "forgejo.org/services/context" + "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/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/web/explore" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/admin/packages.go b/routers/web/admin/packages.go index 5c80a1eada..39f064a1be 100644 --- a/routers/web/admin/packages.go +++ b/routers/web/admin/packages.go @@ -8,14 +8,14 @@ import ( "net/url" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/modules/base" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - packages_service "forgejo.org/services/packages" - packages_cleanup_service "forgejo.org/services/packages/cleanup" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + packages_service "code.gitea.io/gitea/services/packages" + packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup" ) const ( diff --git a/routers/web/admin/queue.go b/routers/web/admin/queue.go index 03bbfe5af4..246ab379b5 100644 --- a/routers/web/admin/queue.go +++ b/routers/web/admin/queue.go @@ -7,9 +7,9 @@ import ( "net/http" "strconv" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) func Queues(ctx *context.Context) { diff --git a/routers/web/admin/queue_tester.go b/routers/web/admin/queue_tester.go index 831947fe41..8f713b3bb1 100644 --- a/routers/web/admin/queue_tester.go +++ b/routers/web/admin/queue_tester.go @@ -8,11 +8,11 @@ import ( "sync" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" ) var testQueueOnce sync.Once diff --git a/routers/web/admin/repos.go b/routers/web/admin/repos.go index a94b9bb5c3..d0339fdd93 100644 --- a/routers/web/admin/repos.go +++ b/routers/web/admin/repos.go @@ -8,16 +8,16 @@ import ( "net/url" "strings" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/web/explore" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + "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/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/web/explore" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/admin/runners.go b/routers/web/admin/runners.go index c6451a9329..d73290a8db 100644 --- a/routers/web/admin/runners.go +++ b/routers/web/admin/runners.go @@ -4,8 +4,8 @@ package admin import ( - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) func RedirectToDefaultSetting(ctx *context.Context) { diff --git a/routers/web/admin/stacktrace.go b/routers/web/admin/stacktrace.go index 7c6cd98a56..d6def94bb4 100644 --- a/routers/web/admin/stacktrace.go +++ b/routers/web/admin/stacktrace.go @@ -7,9 +7,9 @@ import ( "net/http" "runtime" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // Stacktrace show admin monitor goroutines page diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index f6d214d24c..25fef5fa2e 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -11,26 +11,25 @@ import ( "strconv" "strings" - "forgejo.org/models" - "forgejo.org/models/auth" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/routers/web/explore" - user_setting "forgejo.org/routers/web/user/setting" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + org_model "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/auth/password" + "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/web" + "code.gitea.io/gitea/routers/web/explore" + user_setting "code.gitea.io/gitea/routers/web/user/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" + user_service "code.gitea.io/gitea/services/user" ) const ( @@ -83,7 +82,6 @@ func Users(ctx *context.Context) { IsTwoFactorEnabled: util.OptionalBoolParse(statusFilterMap["is_2fa_enabled"]), IsProhibitLogin: util.OptionalBoolParse(statusFilterMap["is_prohibit_login"]), IncludeReserved: true, // administrator needs to list all accounts include reserved, bot, remote ones - Load2FAStatus: true, ExtraParamStrings: extraParamStrings, }, tplUsers) } @@ -187,7 +185,7 @@ func NewUserPost(ctx *context.Context) { case user_model.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserNew, &form) - case validation.IsErrEmailInvalid(err), validation.IsErrEmailCharIsNotSupported(err): + case user_model.IsErrEmailInvalid(err), user_model.IsErrEmailCharIsNotSupported(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplUserNew, &form) case db.IsErrNameReserved(err): @@ -205,7 +203,7 @@ func NewUserPost(ctx *context.Context) { return } - if !validation.IsEmailDomainAllowed(u.Email) { + if !user_model.IsEmailDomainAllowed(u.Email) { ctx.Flash.Warning(ctx.Tr("form.email_domain_is_not_allowed", u.Email)) } @@ -249,7 +247,7 @@ func prepareUserInfo(ctx *context.Context) *user_model.User { } ctx.Data["Sources"] = sources - hasTOTP, err := auth.HasTOTPByUID(ctx, u.ID) + hasTOTP, err := auth.HasTwoFactorByUID(ctx, u.ID) if err != nil { ctx.ServerError("auth.HasTwoFactorByUID", err) return nil @@ -350,7 +348,7 @@ func EditUserPost(ctx *context.Context) { } if form.UserName != "" { - if err := user_service.AdminRenameUser(ctx, u, form.UserName); err != nil { + if err := user_service.RenameUser(ctx, u, form.UserName); err != nil { switch { case user_model.IsErrUserIsNotLocal(err): ctx.Data["Err_UserName"] = true @@ -416,7 +414,7 @@ func EditUserPost(ctx *context.Context) { if form.Email != "" { if err := user_service.AdminAddOrSetPrimaryEmailAddress(ctx, u, form.Email); err != nil { switch { - case validation.IsErrEmailCharIsNotSupported(err), validation.IsErrEmailInvalid(err): + case user_model.IsErrEmailCharIsNotSupported(err), user_model.IsErrEmailInvalid(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplUserEdit, &form) case user_model.IsErrEmailAlreadyUsed(err): @@ -427,7 +425,7 @@ func EditUserPost(ctx *context.Context) { } return } - if !validation.IsEmailDomainAllowed(form.Email) { + if !user_model.IsEmailDomainAllowed(form.Email) { ctx.Flash.Warning(ctx.Tr("form.email_domain_is_not_allowed", form.Email)) } } diff --git a/routers/web/admin/users_test.go b/routers/web/admin/users_test.go index c8e6f8cb86..ae3b130101 100644 --- a/routers/web/admin/users_test.go +++ b/routers/web/admin/users_test.go @@ -6,13 +6,13 @@ package admin import ( "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/routers/web/auth/2fa.go b/routers/web/auth/2fa.go index 7acf9a87d3..f93177bf96 100644 --- a/routers/web/auth/2fa.go +++ b/routers/web/auth/2fa.go @@ -7,14 +7,14 @@ import ( "errors" "net/http" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/externalaccount" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/externalaccount" + "code.gitea.io/gitea/services/forms" ) var ( diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 64006eeae8..9649dddbd1 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -9,32 +9,30 @@ import ( "fmt" "net/http" "strings" - "time" - "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password" - "forgejo.org/modules/base" - "forgejo.org/modules/eventsource" - "forgejo.org/modules/httplib" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/session" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - auth_service "forgejo.org/services/auth" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/context" - "forgejo.org/services/externalaccount" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" - notify_service "forgejo.org/services/notify" - user_service "forgejo.org/services/user" + "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/auth/password" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/eventsource" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/session" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + auth_service "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/externalaccount" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" + notify_service "code.gitea.io/gitea/services/notify" + user_service "code.gitea.io/gitea/services/user" "github.com/markbates/goth" ) @@ -62,7 +60,7 @@ func autoSignIn(ctx *context.Context) (bool, error) { return false, nil } - u, _, err := user_model.VerifyUserAuthorizationToken(ctx, authCookie, auth.LongTermAuthorization) + u, err := user_model.VerifyUserAuthorizationToken(ctx, authCookie, auth.LongTermAuthorization, false) if err != nil { return false, fmt.Errorf("VerifyUserAuthorizationToken: %w", err) } @@ -164,14 +162,12 @@ func SignIn(ctx *context.Context) { ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" ctx.Data["PageIsSignIn"] = true ctx.Data["PageIsLogin"] = true - ctx.Data["EnableInternalSignIn"] = setting.Service.EnableInternalSignIn + ctx.Data["EnableSSPI"] = auth.IsSSPIEnabled(ctx) if setting.Service.EnableCaptcha && setting.Service.RequireCaptchaForLogin { context.SetCaptchaData(ctx) } - ctx.Data["DisablePassword"] = !setting.Service.EnableInternalSignIn - ctx.HTML(http.StatusOK, tplSignIn) } @@ -189,14 +185,7 @@ func SignInPost(ctx *context.Context) { ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" ctx.Data["PageIsSignIn"] = true ctx.Data["PageIsLogin"] = true - ctx.Data["EnableInternalSignIn"] = setting.Service.EnableInternalSignIn - ctx.Data["DisablePassword"] = !setting.Service.EnableInternalSignIn - - // Permission denied if EnableInternalSignIn is false - if !setting.Service.EnableInternalSignIn { - ctx.Error(http.StatusForbidden) - return - } + ctx.Data["EnableSSPI"] = auth.IsSSPIEnabled(ctx) if ctx.HasError() { ctx.HTML(http.StatusOK, tplSignIn) @@ -226,6 +215,15 @@ func SignInPost(ctx *context.Context) { log.Warn("Failed authentication attempt for %s from %s: %v", form.UserName, ctx.RemoteAddr(), err) ctx.Data["Title"] = ctx.Tr("auth.prohibit_login") ctx.HTML(http.StatusOK, "user/auth/prohibit_login") + } else if user_model.IsErrUserInactive(err) { + if setting.Service.RegisterEmailConfirm { + ctx.Data["Title"] = ctx.Tr("auth.active_your_account") + ctx.HTML(http.StatusOK, TplActivate) + } else { + log.Warn("Failed authentication attempt for %s from %s: %v", form.UserName, ctx.RemoteAddr(), err) + ctx.Data["Title"] = ctx.Tr("auth.prohibit_login") + ctx.HTML(http.StatusOK, "user/auth/prohibit_login") + } } else { ctx.ServerError("UserSignIn", err) } @@ -242,7 +240,7 @@ func SignInPost(ctx *context.Context) { // If this user is enrolled in 2FA TOTP, we can't sign the user in just yet. // Instead, redirect them to the 2FA authentication page. - hasTOTPtwofa, err := auth.HasTOTPByUID(ctx, u.ID) + hasTOTPtwofa, err := auth.HasTwoFactorByUID(ctx, u.ID) if err != nil { ctx.ServerError("UserSignIn", err) return @@ -548,13 +546,10 @@ func createUserInContext(ctx *context.Context, tpl base.TplName, form any, u *us case user_model.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tpl, form) - case user_model.IsErrCooldownPeriod(err): - ctx.Data["Err_UserName"] = true - ctx.RenderWithErr(ctx.Locale.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z)), tpl, form) - case validation.IsErrEmailCharIsNotSupported(err): + case user_model.IsErrEmailCharIsNotSupported(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tpl, form) - case validation.IsErrEmailInvalid(err): + case user_model.IsErrEmailInvalid(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tpl, form) case db.IsErrNameReserved(err): @@ -670,7 +665,7 @@ func Activate(ctx *context.Context) { return } - user, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation) + user, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation, false) if err != nil { ctx.ServerError("VerifyUserAuthorizationToken", err) return @@ -691,11 +686,6 @@ func Activate(ctx *context.Context) { return } - if err := deleteToken(); err != nil { - ctx.ServerError("deleteToken", err) - return - } - handleAccountActivation(ctx, user) } @@ -744,7 +734,7 @@ func ActivatePost(ctx *context.Context) { return } - user, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation) + user, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.UserActivation, true) if err != nil { ctx.ServerError("VerifyUserAuthorizationToken", err) return @@ -773,11 +763,6 @@ func ActivatePost(ctx *context.Context) { } } - if err := deleteToken(); err != nil { - ctx.ServerError("deleteToken", err) - return - } - handleAccountActivation(ctx, user) } @@ -838,7 +823,7 @@ func ActivateEmail(ctx *context.Context) { code := ctx.FormString("code") emailStr := ctx.FormString("email") - u, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.EmailActivation(emailStr)) + u, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.EmailActivation(emailStr), true) if err != nil { ctx.ServerError("VerifyUserAuthorizationToken", err) return @@ -848,11 +833,6 @@ func ActivateEmail(ctx *context.Context) { return } - if err := deleteToken(); err != nil { - ctx.ServerError("deleteToken", err) - return - } - email, err := user_model.GetEmailAddressOfUser(ctx, emailStr, u.ID) if err != nil { ctx.ServerError("GetEmailAddressOfUser", err) diff --git a/routers/web/auth/auth_test.go b/routers/web/auth/auth_test.go index 7a33a3841c..c6afbf877c 100644 --- a/routers/web/auth/auth_test.go +++ b/routers/web/auth/auth_test.go @@ -8,8 +8,8 @@ import ( "net/url" "testing" - "forgejo.org/modules/test" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/auth/linkaccount.go b/routers/web/auth/linkaccount.go index fbf03ca475..9b0141c14e 100644 --- a/routers/web/auth/linkaccount.go +++ b/routers/web/auth/linkaccount.go @@ -9,18 +9,18 @@ import ( "net/http" "strings" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - auth_service "forgejo.org/services/auth" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/context" - "forgejo.org/services/externalaccount" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + auth_service "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/externalaccount" + "code.gitea.io/gitea/services/forms" "github.com/markbates/goth" ) @@ -44,7 +44,6 @@ func LinkAccount(ctx *context.Context) { ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration ctx.Data["ShowRegistrationButton"] = false - ctx.Data["EnableInternalSignIn"] = true // use this to set the right link into the signIn and signUp templates in the link_account template ctx.Data["SignInLink"] = setting.AppSubURL + "/user/link_account_signin" @@ -100,6 +99,16 @@ func handleSignInError(ctx *context.Context, userName string, ptrForm any, tmpl log.Info("Failed authentication attempt for %s from %s: %v", userName, ctx.RemoteAddr(), err) ctx.Data["Title"] = ctx.Tr("auth.prohibit_login") ctx.HTML(http.StatusOK, "user/auth/prohibit_login") + } else if user_model.IsErrUserInactive(err) { + ctx.Data["user_exists"] = true + if setting.Service.RegisterEmailConfirm { + ctx.Data["Title"] = ctx.Tr("auth.active_your_account") + ctx.HTML(http.StatusOK, TplActivate) + } else { + log.Info("Failed authentication attempt for %s from %s: %v", userName, ctx.RemoteAddr(), err) + ctx.Data["Title"] = ctx.Tr("auth.prohibit_login") + ctx.HTML(http.StatusOK, "user/auth/prohibit_login") + } } else { ctx.ServerError(invoker, err) } @@ -123,7 +132,6 @@ func LinkAccountPostSignIn(ctx *context.Context) { ctx.Data["CfTurnstileSitekey"] = setting.Service.CfTurnstileSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false - ctx.Data["EnableInternalSignIn"] = true // use this to set the right link into the signIn and signUp templates in the link_account template ctx.Data["SignInLink"] = setting.AppSubURL + "/user/link_account_signin" @@ -155,14 +163,15 @@ func linkAccount(ctx *context.Context, u *user_model.User, gothUser goth.User, r // If this user is enrolled in 2FA, we can't sign the user in just yet. // Instead, redirect them to the 2FA authentication page. // We deliberately ignore the skip local 2fa setting here because we are linking to a previous user here - hasTwoFactor, err := auth.HasTwoFactorByUID(ctx, u.ID) + _, err := auth.GetTwoFactorByUID(ctx, u.ID) if err != nil { - ctx.ServerError("UserLinkAccount", err) - return - } + if !auth.IsErrTwoFactorNotEnrolled(err) { + ctx.ServerError("UserLinkAccount", err) + return + } - if !hasTwoFactor { - if err := externalaccount.LinkAccountToUser(ctx, u, gothUser); err != nil { + err = externalaccount.LinkAccountToUser(ctx, u, gothUser) + if err != nil { ctx.ServerError("UserLinkAccount", err) return } diff --git a/routers/web/auth/main_test.go b/routers/web/auth/main_test.go index a8a32b71f2..b438e5d518 100644 --- a/routers/web/auth/main_test.go +++ b/routers/web/auth/main_test.go @@ -6,7 +6,7 @@ package auth import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index aa599bd252..8705d1b205 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -17,31 +17,30 @@ import ( "sort" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - org_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - auth_module "forgejo.org/modules/auth" - "forgejo.org/modules/base" - "forgejo.org/modules/container" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - auth_service "forgejo.org/services/auth" - source_service "forgejo.org/services/auth/source" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/context" - "forgejo.org/services/externalaccount" - "forgejo.org/services/forms" - remote_service "forgejo.org/services/remote" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models/auth" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" + auth_module "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/json" + "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" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + auth_service "code.gitea.io/gitea/services/auth" + source_service "code.gitea.io/gitea/services/auth/source" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/externalaccount" + "code.gitea.io/gitea/services/forms" + remote_service "code.gitea.io/gitea/services/remote" + user_service "code.gitea.io/gitea/services/user" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" "github.com/golang-jwt/jwt/v5" "github.com/markbates/goth" "github.com/markbates/goth/gothic" @@ -232,7 +231,7 @@ func newAccessTokenResponse(ctx go_context.Context, grant *auth.OAuth2Grant, ser Nonce: grant.Nonce, } if grant.ScopeContains("profile") { - idToken.Name = user.DisplayName() + idToken.Name = user.GetDisplayName() idToken.PreferredUsername = user.Name idToken.Profile = user.HTMLURL() idToken.Picture = user.AvatarLink(ctx) @@ -306,7 +305,7 @@ func InfoOAuth(ctx *context.Context) { response := &userInfoResponse{ Sub: fmt.Sprint(ctx.Doer.ID), - Name: ctx.Doer.DisplayName(), + Name: ctx.Doer.FullName, Username: ctx.Doer.Name, Email: ctx.Doer.Email, Picture: ctx.Doer.AvatarLink(ctx), @@ -1079,7 +1078,7 @@ func SignInOAuthCallback(ctx *context.Context) { isAdmin, isRestricted := getUserAdminAndRestrictedFromGroupClaims(source, &gothUser) u.IsAdmin = isAdmin.ValueOrDefault(false) - u.IsRestricted = isRestricted.ValueOrDefault(setting.Service.DefaultUserIsRestricted) + u.IsRestricted = isRestricted.ValueOrDefault(false) if !createAndHandleCreatedUser(ctx, base.TplName(""), nil, u, overwriteDefault, &gothUser, setting.OAuth2Client.AccountLinking != setting.OAuth2AccountLinkingDisabled) { // error already handled @@ -1184,70 +1183,17 @@ func updateAvatarIfNeed(ctx *context.Context, url string, u *user_model.User) { } } -func getSSHKeys(source *oauth2.Source, gothUser *goth.User) ([]string, error) { - key := source.AttributeSSHPublicKey - value, exists := gothUser.RawData[key] - if !exists { - return []string{}, nil - } - - rawSlice, ok := value.([]any) - if !ok { - return nil, fmt.Errorf("unexpected type for SSH public key, expected []interface{} but got %T", value) - } - - sshKeys := make([]string, 0, len(rawSlice)) - for i, v := range rawSlice { - str, ok := v.(string) - if !ok { - return nil, fmt.Errorf("unexpected element type at index %d in SSH public key array, expected string but got %T", i, v) - } - sshKeys = append(sshKeys, str) - } - - return sshKeys, nil -} - -func updateSSHPubIfNeed( - ctx *context.Context, - authSource *auth.Source, - fetchedUser *goth.User, - user *user_model.User, -) error { - oauth2Source := authSource.Cfg.(*oauth2.Source) - - if oauth2Source.ProvidesSSHKeys() { - sshKeys, err := getSSHKeys(oauth2Source, fetchedUser) - if err != nil { - return err - } - - if asymkey_model.SynchronizePublicKeys(ctx, user, authSource, sshKeys) { - err = asymkey_model.RewriteAllPublicKeys(ctx) - if err != nil { - return err - } - } - } - - return nil -} - func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model.User, gothUser goth.User) { updateAvatarIfNeed(ctx, gothUser.AvatarURL, u) - err := updateSSHPubIfNeed(ctx, source, &gothUser, u) - if err != nil { - ctx.ServerError("updateSSHPubIfNeed", err) - return - } needs2FA := false if !source.Cfg.(*oauth2.Source).SkipLocalTwoFA { - needs2FA, err = auth.HasTwoFactorByUID(ctx, u.ID) - if err != nil { + _, err := auth.GetTwoFactorByUID(ctx, u.ID) + if err != nil && !auth.IsErrTwoFactorNotEnrolled(err) { ctx.ServerError("UserSignIn", err) return } + needs2FA = err == nil } oauth2Source := source.Cfg.(*oauth2.Source) diff --git a/routers/web/auth/oauth_test.go b/routers/web/auth/oauth_test.go index 6275d63382..5a4a646577 100644 --- a/routers/web/auth/oauth_test.go +++ b/routers/web/auth/oauth_test.go @@ -6,12 +6,12 @@ package auth import ( "testing" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - "forgejo.org/services/auth/source/oauth2" + "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/setting" + "code.gitea.io/gitea/services/auth/source/oauth2" "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/assert" @@ -67,14 +67,32 @@ func TestNewAccessTokenResponse_OIDCToken(t *testing.T) { // Scopes: openid profile email oidcToken = createAndParseToken(t, grants[0]) - assert.Equal(t, "User Five", oidcToken.Name) - assert.Equal(t, "user5", oidcToken.PreferredUsername) - assert.Equal(t, "https://try.gitea.io/user5", oidcToken.Profile) - assert.Equal(t, "https://try.gitea.io/assets/img/avatar_default.png", oidcToken.Picture) - assert.Equal(t, "", oidcToken.Website) - assert.Equal(t, timeutil.TimeStamp(0), oidcToken.UpdatedAt) - assert.Equal(t, "user5@example.com", oidcToken.Email) - assert.True(t, oidcToken.EmailVerified) + assert.Equal(t, user.Name, oidcToken.Name) + assert.Equal(t, user.Name, oidcToken.PreferredUsername) + assert.Equal(t, user.HTMLURL(), oidcToken.Profile) + assert.Equal(t, user.AvatarLink(db.DefaultContext), oidcToken.Picture) + assert.Equal(t, user.Website, oidcToken.Website) + assert.Equal(t, user.UpdatedUnix, oidcToken.UpdatedAt) + assert.Equal(t, user.Email, oidcToken.Email) + assert.Equal(t, user.IsActive, oidcToken.EmailVerified) + + // set DefaultShowFullName to true + oldDefaultShowFullName := setting.UI.DefaultShowFullName + setting.UI.DefaultShowFullName = true + defer func() { + setting.UI.DefaultShowFullName = oldDefaultShowFullName + }() + + // Scopes: openid profile email + oidcToken = createAndParseToken(t, grants[0]) + assert.Equal(t, user.FullName, oidcToken.Name) + assert.Equal(t, user.Name, oidcToken.PreferredUsername) + assert.Equal(t, user.HTMLURL(), oidcToken.Profile) + assert.Equal(t, user.AvatarLink(db.DefaultContext), oidcToken.Picture) + assert.Equal(t, user.Website, oidcToken.Website) + assert.Equal(t, user.UpdatedUnix, oidcToken.UpdatedAt) + assert.Equal(t, user.Email, oidcToken.Email) + assert.Equal(t, user.IsActive, oidcToken.EmailVerified) } func TestEncodeCodeChallenge(t *testing.T) { diff --git a/routers/web/auth/openid.go b/routers/web/auth/openid.go index b12dea84ea..83268faacb 100644 --- a/routers/web/auth/openid.go +++ b/routers/web/auth/openid.go @@ -8,16 +8,16 @@ import ( "net/http" "net/url" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/openid" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/auth" - "forgejo.org/services/context" - "forgejo.org/services/forms" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/openid" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( diff --git a/routers/web/auth/password.go b/routers/web/auth/password.go index 82c2d4e9d3..363c01c6a8 100644 --- a/routers/web/auth/password.go +++ b/routers/web/auth/password.go @@ -8,20 +8,20 @@ import ( "fmt" "net/http" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/password" + "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/timeutil" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" + user_service "code.gitea.io/gitea/services/user" ) var ( @@ -116,7 +116,7 @@ func commonResetPassword(ctx *context.Context, shouldDeleteToken bool) (*user_mo } // Fail early, don't frustrate the user - u, deleteToken, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.PasswordReset) + u, err := user_model.VerifyUserAuthorizationToken(ctx, code, auth.PasswordReset, shouldDeleteToken) if err != nil { ctx.ServerError("VerifyUserAuthorizationToken", err) return nil, nil @@ -127,13 +127,6 @@ func commonResetPassword(ctx *context.Context, shouldDeleteToken bool) (*user_mo return nil, nil } - if shouldDeleteToken { - if err := deleteToken(); err != nil { - ctx.ServerError("deleteToken", err) - return nil, nil - } - } - twofa, err := auth.GetTwoFactorByUID(ctx, u.ID) if err != nil { if !auth.IsErrTwoFactorNotEnrolled(err) { diff --git a/routers/web/auth/webauthn.go b/routers/web/auth/webauthn.go index 3da6199b6e..5c93c1410e 100644 --- a/routers/web/auth/webauthn.go +++ b/routers/web/auth/webauthn.go @@ -7,14 +7,14 @@ import ( "errors" "net/http" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - wa "forgejo.org/modules/auth/webauthn" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - "forgejo.org/services/externalaccount" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + wa "code.gitea.io/gitea/modules/auth/webauthn" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/externalaccount" "github.com/go-webauthn/webauthn/protocol" "github.com/go-webauthn/webauthn/webauthn" @@ -36,7 +36,7 @@ func WebAuthn(ctx *context.Context) { return } - hasTwoFactor, err := auth.HasTOTPByUID(ctx, ctx.Session.Get("twofaUid").(int64)) + hasTwoFactor, err := auth.HasTwoFactorByUID(ctx, ctx.Session.Get("twofaUid").(int64)) if err != nil { ctx.ServerError("HasTwoFactorByUID", err) return diff --git a/routers/web/base.go b/routers/web/base.go index c1bc7fef5e..78dde57fa6 100644 --- a/routers/web/base.go +++ b/routers/web/base.go @@ -11,12 +11,12 @@ import ( "path" "strings" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/modules/web/routing" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web/routing" ) func storageHandler(storageSetting *setting.Storage, prefix string, objStore storage.ObjectStorage) http.HandlerFunc { @@ -39,7 +39,7 @@ func storageHandler(storageSetting *setting.Storage, prefix string, objStore sto rPath := strings.TrimPrefix(req.URL.Path, "/"+prefix+"/") rPath = util.PathJoinRelX(rPath) - u, err := objStore.URL(rPath, path.Base(rPath), nil) + u, err := objStore.URL(rPath, path.Base(rPath)) if err != nil { if os.IsNotExist(err) || errors.Is(err, os.ErrNotExist) { log.Warn("Unable to find %s %s", prefix, rPath) diff --git a/routers/web/devtest/devtest.go b/routers/web/devtest/devtest.go index 37496ca117..dd20663f94 100644 --- a/routers/web/devtest/devtest.go +++ b/routers/web/devtest/devtest.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "forgejo.org/modules/base" - "forgejo.org/modules/templates" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/services/context" ) // List all devtest templates, they will be used for e2e tests for the UI components diff --git a/routers/web/events/events.go b/routers/web/events/events.go index 1672f12bda..52f20e07dc 100644 --- a/routers/web/events/events.go +++ b/routers/web/events/events.go @@ -7,11 +7,11 @@ import ( "net/http" "time" - "forgejo.org/modules/eventsource" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/routers/web/auth" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/eventsource" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/routers/web/auth" + "code.gitea.io/gitea/services/context" ) // Events listens for events diff --git a/routers/web/explore/code.go b/routers/web/explore/code.go index f0b12e9142..f61b832572 100644 --- a/routers/web/explore/code.go +++ b/routers/web/explore/code.go @@ -6,12 +6,12 @@ package explore import ( "net/http" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/base" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/base" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const ( @@ -21,13 +21,12 @@ const ( // Code render explore code page func Code(ctx *context.Context) { - if !setting.Indexer.RepoIndexerEnabled || setting.Service.Explore.DisableCodePage { + if !setting.Indexer.RepoIndexerEnabled { ctx.Redirect(setting.AppSubURL + "/explore") return } - ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage - ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage + ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true @@ -35,19 +34,12 @@ func Code(ctx *context.Context) { language := ctx.FormTrim("l") keyword := ctx.FormTrim("q") - path := ctx.FormTrim("path") - mode := code_indexer.SearchModeExact - if m := ctx.FormTrim("mode"); m == "union" || - m == "fuzzy" || - ctx.FormBool("fuzzy") { - mode = code_indexer.SearchModeUnion - } + isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) ctx.Data["Keyword"] = keyword ctx.Data["Language"] = language - ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions - ctx.Data["CodeSearchMode"] = mode.String() + ctx.Data["IsFuzzy"] = isFuzzy ctx.Data["PageIsViewCode"] = true if keyword == "" { @@ -86,11 +78,10 @@ func Code(ctx *context.Context) { if (len(repoIDs) > 0) || isAdmin { total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{ - RepoIDs: repoIDs, - Keyword: keyword, - Mode: mode, - Language: language, - Filename: path, + RepoIDs: repoIDs, + Keyword: keyword, + IsKeywordFuzzy: isFuzzy, + Language: language, Paginator: &db.ListOptions{ Page: page, PageSize: setting.UI.RepoSearchPagingNum, diff --git a/routers/web/explore/org.go b/routers/web/explore/org.go index 6c9293e959..f8fd6ec38e 100644 --- a/routers/web/explore/org.go +++ b/routers/web/explore/org.go @@ -4,23 +4,17 @@ package explore import ( - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/services/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/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" ) // Organizations render explore organizations page func Organizations(ctx *context.Context) { - if setting.Service.Explore.DisableOrganizationsPage { - ctx.Redirect(setting.AppSubURL + "/explore") - return - } - - ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage - ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage + ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreOrganizations"] = true @@ -39,11 +33,7 @@ func Organizations(ctx *context.Context) { ) sortOrder := ctx.FormString("sort") if sortOrder == "" { - if supportedSortOrders.Contains(setting.UI.ExploreDefaultSort) { - sortOrder = setting.UI.ExploreDefaultSort - } else { - sortOrder = "newest" - } + sortOrder = "newest" ctx.SetFormString("sort", sortOrder) } diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 0707420a8d..116b983b3a 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -7,13 +7,13 @@ import ( "fmt" "net/http" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/sitemap" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/sitemap" + "code.gitea.io/gitea/services/context" ) const ( @@ -165,9 +165,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { // Repos render explore repositories page func Repos(ctx *context.Context) { - ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage - ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage - ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage + ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreRepositories"] = true diff --git a/routers/web/explore/topic.go b/routers/web/explore/topic.go index 3b67bd48b1..95fecfe2b8 100644 --- a/routers/web/explore/topic.go +++ b/routers/web/explore/topic.go @@ -6,11 +6,11 @@ package explore import ( "net/http" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // TopicSearch search for creating topic diff --git a/routers/web/explore/user.go b/routers/web/explore/user.go index e349bb1e92..b79a79fb2c 100644 --- a/routers/web/explore/user.go +++ b/routers/web/explore/user.go @@ -7,16 +7,16 @@ import ( "bytes" "net/http" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/sitemap" - "forgejo.org/modules/structs" - "forgejo.org/services/context" + "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/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/sitemap" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" ) const ( @@ -114,9 +114,7 @@ func RenderUserSearch(ctx *context.Context, opts *user_model.SearchUserOptions, ctx.Data["Keyword"] = opts.Keyword ctx.Data["Total"] = count ctx.Data["Users"] = users - if opts.Load2FAStatus { - ctx.Data["UsersTwoFaStatus"] = user_model.UserList(users).GetTwoFaStatus(ctx) - } + ctx.Data["UsersTwoFaStatus"] = user_model.UserList(users).GetTwoFaStatus(ctx) ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled @@ -133,11 +131,9 @@ func RenderUserSearch(ctx *context.Context, opts *user_model.SearchUserOptions, // Users render explore users page func Users(ctx *context.Context) { if setting.Service.Explore.DisableUsersPage { - ctx.Redirect(setting.AppSubURL + "/explore") + ctx.Redirect(setting.AppSubURL + "/explore/repos") return } - ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage - ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreUsers"] = true @@ -151,11 +147,7 @@ func Users(ctx *context.Context) { ) sortOrder := ctx.FormString("sort") if sortOrder == "" { - if supportedSortOrders.Contains(setting.UI.ExploreDefaultSort) { - sortOrder = setting.UI.ExploreDefaultSort - } else { - sortOrder = "newest" - } + sortOrder = "newest" ctx.SetFormString("sort", sortOrder) } diff --git a/routers/web/feed/branch.go b/routers/web/feed/branch.go index 2337b43d4c..80ce2ad198 100644 --- a/routers/web/feed/branch.go +++ b/routers/web/feed/branch.go @@ -8,8 +8,8 @@ import ( "strings" "time" - "forgejo.org/models/repo" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" ) @@ -43,7 +43,6 @@ func ShowBranchFeed(ctx *context.Context, repo *repo.Repository, formatType stri }, Description: commit.Message(), Content: commit.Message(), - Created: commit.Committer.When, }) } diff --git a/routers/web/feed/convert.go b/routers/web/feed/convert.go index 24532334ea..d3d01a87e0 100644 --- a/routers/web/feed/convert.go +++ b/routers/web/feed/convert.go @@ -12,16 +12,16 @@ import ( "strconv" "strings" - activities_model "forgejo.org/models/activities" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/util" - "forgejo.org/services/context" + activities_model "code.gitea.io/gitea/models/activities" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + "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/templates" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" "github.com/jaytaylor/html2text" @@ -298,14 +298,14 @@ func GetFeedType(name string, req *http.Request) (bool, string, string) { return false, name, "" } -// feedActionsToFeedItems convert repository releases into feed items. -func releasesToFeedItems(ctx *context.Context, releases repo_model.ReleaseList) (items []*feeds.Item, err error) { - if err := releases.LoadAttributes(ctx); err != nil { - return nil, err - } - - composeCache := make(map[int64]map[string]string) +// feedActionsToFeedItems convert gitea's Repo's Releases to feeds Item +func releasesToFeedItems(ctx *context.Context, releases []*repo_model.Release) (items []*feeds.Item, err error) { for _, rel := range releases { + err := rel.LoadAttributes(ctx) + if err != nil { + return nil, err + } + var title string var content template.HTML @@ -315,19 +315,13 @@ func releasesToFeedItems(ctx *context.Context, releases repo_model.ReleaseList) title = rel.Title } - metas, ok := composeCache[rel.RepoID] - if !ok { - metas = rel.Repo.ComposeMetas(ctx) - composeCache[rel.RepoID] = metas - } - link := &feeds.Link{Href: rel.HTMLURL()} content, err = markdown.RenderString(&markup.RenderContext{ Ctx: ctx, Links: markup.Links{ Base: rel.Repo.Link(), }, - Metas: metas, + Metas: rel.Repo.ComposeMetas(ctx), }, rel.Note) if err != nil { return nil, err diff --git a/routers/web/feed/file.go b/routers/web/feed/file.go index 45ceedac12..1ab768ff27 100644 --- a/routers/web/feed/file.go +++ b/routers/web/feed/file.go @@ -8,10 +8,10 @@ import ( "strings" "time" - "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" ) @@ -55,7 +55,6 @@ func ShowFileFeed(ctx *context.Context, repo *repo.Repository, formatType string }, Description: commit.Message(), Content: commit.Message(), - Created: commit.Committer.When, }) } diff --git a/routers/web/feed/profile.go b/routers/web/feed/profile.go index dd2fec186f..08cbcd9e12 100644 --- a/routers/web/feed/profile.go +++ b/routers/web/feed/profile.go @@ -6,10 +6,10 @@ package feed import ( "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/services/context" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" ) diff --git a/routers/web/feed/release.go b/routers/web/feed/release.go index 646241c021..fb6e3add65 100644 --- a/routers/web/feed/release.go +++ b/routers/web/feed/release.go @@ -6,9 +6,9 @@ package feed import ( "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" ) diff --git a/routers/web/feed/render.go b/routers/web/feed/render.go index 79681dd0fb..dc99fb49ed 100644 --- a/routers/web/feed/render.go +++ b/routers/web/feed/render.go @@ -4,7 +4,7 @@ package feed import ( - "forgejo.org/services/context" + "code.gitea.io/gitea/services/context" ) // RenderBranchFeed render format for branch or file diff --git a/routers/web/feed/repo.go b/routers/web/feed/repo.go index 0d105dc3a7..a0033c7d45 100644 --- a/routers/web/feed/repo.go +++ b/routers/web/feed/repo.go @@ -6,9 +6,9 @@ package feed import ( "time" - activities_model "forgejo.org/models/activities" - repo_model "forgejo.org/models/repo" - "forgejo.org/services/context" + activities_model "code.gitea.io/gitea/models/activities" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/services/context" "github.com/gorilla/feeds" ) diff --git a/routers/web/githttp.go b/routers/web/githttp.go index e5ed806f2e..5f1dedce76 100644 --- a/routers/web/githttp.go +++ b/routers/web/githttp.go @@ -6,10 +6,10 @@ package web import ( "net/http" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/routers/web/repo" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/services/context" ) func requireSignIn(ctx *context.Context) { diff --git a/routers/web/goget.go b/routers/web/goget.go index 0fcd755ca1..8d5612ebfe 100644 --- a/routers/web/goget.go +++ b/routers/web/goget.go @@ -11,10 +11,10 @@ import ( "path" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/services/context" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) func goGet(ctx *context.Context) { diff --git a/routers/web/healthcheck/check.go b/routers/web/healthcheck/check.go index f0b51aa515..83dfe62537 100644 --- a/routers/web/healthcheck/check.go +++ b/routers/web/healthcheck/check.go @@ -9,11 +9,11 @@ import ( "os" "time" - "forgejo.org/models/db" - "forgejo.org/modules/cache" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) type status string diff --git a/routers/web/home.go b/routers/web/home.go index e0a466a81c..d4be0931e8 100644 --- a/routers/web/home.go +++ b/routers/web/home.go @@ -8,19 +8,19 @@ import ( "net/http" "strconv" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/sitemap" - "forgejo.org/modules/structs" - "forgejo.org/modules/web/middleware" - "forgejo.org/routers/web/auth" - "forgejo.org/routers/web/user" - "forgejo.org/services/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/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/sitemap" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/routers/web/auth" + "code.gitea.io/gitea/routers/web/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -61,9 +61,6 @@ func Home(ctx *context.Context) { ctx.Data["PageIsHome"] = true ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled - - ctx.Data["OpenGraphDescription"] = setting.UI.Meta.Description - ctx.HTML(http.StatusOK, tplHome) } diff --git a/routers/web/metrics.go b/routers/web/metrics.go index 8c188e206e..46c13f0a24 100644 --- a/routers/web/metrics.go +++ b/routers/web/metrics.go @@ -7,7 +7,7 @@ import ( "crypto/subtle" "net/http" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/prometheus/client_golang/prometheus/promhttp" ) diff --git a/routers/web/misc/markup.go b/routers/web/misc/markup.go index d2b67f88c8..2dbbd6fc09 100644 --- a/routers/web/misc/markup.go +++ b/routers/web/misc/markup.go @@ -5,24 +5,14 @@ package misc import ( - api "forgejo.org/modules/structs" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/services/context" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" ) // Markup render markup document to HTML func Markup(ctx *context.Context) { form := web.GetForm(ctx).(*api.MarkupOption) - - re := common.Renderer{ - Mode: form.Mode, - Text: form.Text, - URLPrefix: form.Context, - FilePath: form.FilePath, - BranchPath: form.BranchPath, - IsWiki: form.Wiki, - } - - re.RenderMarkup(ctx.Base, ctx.Repo) + common.RenderMarkup(ctx.Base, ctx.Repo, form.Mode, form.Text, form.Context, form.FilePath, form.Wiki) } diff --git a/routers/web/misc/misc.go b/routers/web/misc/misc.go index 306b15e3d5..54c93763f6 100644 --- a/routers/web/misc/misc.go +++ b/routers/web/misc/misc.go @@ -7,11 +7,11 @@ import ( "net/http" "path" - "forgejo.org/modules/git" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) func SSHInfo(rw http.ResponseWriter, req *http.Request) { diff --git a/routers/web/misc/swagger-forgejo.go b/routers/web/misc/swagger-forgejo.go index 17e3814712..e3aff02c5f 100644 --- a/routers/web/misc/swagger-forgejo.go +++ b/routers/web/misc/swagger-forgejo.go @@ -6,8 +6,8 @@ package misc import ( "net/http" - "forgejo.org/modules/base" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" ) // tplSwagger swagger page template diff --git a/routers/web/misc/swagger.go b/routers/web/misc/swagger.go index 226dddaff2..5fddfa8885 100644 --- a/routers/web/misc/swagger.go +++ b/routers/web/misc/swagger.go @@ -6,8 +6,8 @@ package misc import ( "net/http" - "forgejo.org/modules/base" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" ) // tplSwagger swagger page template diff --git a/routers/web/nodeinfo.go b/routers/web/nodeinfo.go index d8c1727479..f1cc7bf530 100644 --- a/routers/web/nodeinfo.go +++ b/routers/web/nodeinfo.go @@ -7,8 +7,8 @@ import ( "fmt" "net/http" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) type nodeInfoLinks struct { diff --git a/routers/web/org/home.go b/routers/web/org/home.go index a3823565ed..92793d95a4 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -9,18 +9,18 @@ import ( "path" "strings" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/base" + "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/util" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -47,12 +47,6 @@ func Home(ctx *context.Context) { ctx.Data["PageIsUserProfile"] = true ctx.Data["Title"] = org.DisplayName() - ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName() - ctx.Data["OpenGraphType"] = "profile" - ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx) - ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL() - ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description - var orderBy db.SearchOrderBy sortOrder := ctx.FormString("sort") if _, ok := repo_model.OrderByFlatMap[sortOrder]; !ok { @@ -116,12 +110,10 @@ func Home(ctx *context.Context) { } opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, - IsDoerMember: ctx.Org.IsMember, - ListOptions: db.ListOptions{Page: 1, PageSize: 25}, + OrgID: org.ID, + PublicOnly: ctx.Org.PublicMemberOnly, + ListOptions: db.ListOptions{Page: 1, PageSize: 25}, } - members, _, err := organization.FindOrgMembers(ctx, opts) if err != nil { ctx.ServerError("FindOrgMembers", err) diff --git a/routers/web/org/main_test.go b/routers/web/org/main_test.go index d1d4e89120..92237d6e88 100644 --- a/routers/web/org/main_test.go +++ b/routers/web/org/main_test.go @@ -6,7 +6,7 @@ package org_test import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/org/members.go b/routers/web/org/members.go index 51ac566e1a..9a3d60e122 100644 --- a/routers/web/org/members.go +++ b/routers/web/org/members.go @@ -7,13 +7,13 @@ package org import ( "net/http" - "forgejo.org/models" - "forgejo.org/models/organization" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -33,8 +33,8 @@ func Members(ctx *context.Context) { } opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, + OrgID: org.ID, + PublicOnly: true, } if ctx.Doer != nil { @@ -43,9 +43,9 @@ func Members(ctx *context.Context) { ctx.Error(http.StatusInternalServerError, "IsOrgMember") return } - opts.IsDoerMember = isMember + opts.PublicOnly = !isMember && !ctx.Doer.IsAdmin } - ctx.Data["PublicOnly"] = opts.PublicOnly() + ctx.Data["PublicOnly"] = opts.PublicOnly total, err := organization.CountOrgMembers(ctx, opts) if err != nil { diff --git a/routers/web/org/org.go b/routers/web/org/org.go index e9907c04af..dd3aab458b 100644 --- a/routers/web/org/org.go +++ b/routers/web/org/org.go @@ -8,15 +8,15 @@ import ( "errors" "net/http" - "forgejo.org/models/db" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "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/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( diff --git a/routers/web/org/org_labels.go b/routers/web/org/org_labels.go index dc18c55aa3..02eae8052e 100644 --- a/routers/web/org/org_labels.go +++ b/routers/web/org/org_labels.go @@ -6,13 +6,13 @@ package org import ( "net/http" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/label" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/label" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // RetrieveLabels find all the labels of an organization diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go index 96bd0f1ee2..64d233fc45 100644 --- a/routers/web/org/projects.go +++ b/routers/web/org/projects.go @@ -9,20 +9,20 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - project_model "forgejo.org/models/project" - attachment_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/json" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/web" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + project_model "code.gitea.io/gitea/models/project" + attachment_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/web" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( @@ -126,19 +126,6 @@ func Projects(ctx *context.Context) { ctx.Data["PageIsViewProjects"] = true ctx.Data["SortType"] = sortType - numOpenIssues, err := issues_model.NumIssuesInProjects(ctx, projects, ctx.Doer, ctx.Org.Organization, optional.Some(false)) - if err != nil { - ctx.ServerError("NumIssuesInProjects", err) - return - } - numClosedIssues, err := issues_model.NumIssuesInProjects(ctx, projects, ctx.Doer, ctx.Org.Organization, optional.Some(true)) - if err != nil { - ctx.ServerError("NumIssuesInProjects", err) - return - } - ctx.Data["NumOpenIssuesInProject"] = numOpenIssues - ctx.Data["NumClosedIssuesInProject"] = numClosedIssues - ctx.HTML(http.StatusOK, tplProjects) } @@ -222,7 +209,7 @@ func ChangeProjectStatus(ctx *context.Context) { ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err) return } - ctx.JSONRedirect(project_model.ProjectLinkForOrg(ctx.ContextUser, id)) + ctx.JSONRedirect(fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), id)) } // DeleteProject delete a project @@ -272,7 +259,7 @@ func RenderEditProject(ctx *context.Context) { ctx.Data["redirect"] = ctx.FormString("redirect") ctx.Data["HomeLink"] = ctx.ContextUser.HomeLink() ctx.Data["card_type"] = p.CardType - ctx.Data["CancelLink"] = project_model.ProjectLinkForOrg(ctx.ContextUser, p.ID) + ctx.Data["CancelLink"] = fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), p.ID) ctx.HTML(http.StatusOK, tplProjectsNew) } @@ -286,7 +273,7 @@ func EditProjectPost(ctx *context.Context) { ctx.Data["PageIsViewProjects"] = true ctx.Data["CanWriteProjects"] = canWriteProjects(ctx) ctx.Data["CardTypes"] = project_model.GetCardConfig() - ctx.Data["CancelLink"] = project_model.ProjectLinkForOrg(ctx.ContextUser, projectID) + ctx.Data["CancelLink"] = fmt.Sprintf("%s/-/projects/%d", ctx.ContextUser.HomeLink(), projectID) shared_user.RenderUserHeader(ctx) @@ -345,7 +332,7 @@ func ViewProject(ctx *context.Context) { return } - issuesMap, err := issues_model.LoadIssuesFromColumnList(ctx, columns, ctx.Doer, ctx.Org.Organization, optional.None[bool]()) + issuesMap, err := issues_model.LoadIssuesFromColumnList(ctx, columns) if err != nil { ctx.ServerError("LoadIssuesOfColumns", err) return diff --git a/routers/web/org/projects_test.go b/routers/web/org/projects_test.go index dec78502f2..ab419cc878 100644 --- a/routers/web/org/projects_test.go +++ b/routers/web/org/projects_test.go @@ -6,9 +6,9 @@ package org_test import ( "testing" - "forgejo.org/models/unittest" - "forgejo.org/routers/web/org" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/routers/web/org" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go index 284f406413..0be734abaf 100644 --- a/routers/web/org/setting.go +++ b/routers/web/org/setting.go @@ -7,27 +7,26 @@ package org import ( "net/http" "net/url" - "time" - "forgejo.org/models" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - shared_user "forgejo.org/routers/web/shared/user" - user_setting "forgejo.org/routers/web/user/setting" - "forgejo.org/services/context" - "forgejo.org/services/forms" - org_service "forgejo.org/services/org" - repo_service "forgejo.org/services/repository" - user_service "forgejo.org/services/user" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models" + "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/models/webhook" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + user_setting "code.gitea.io/gitea/routers/web/user/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + org_service "code.gitea.io/gitea/services/org" + repo_service "code.gitea.io/gitea/services/repository" + user_service "code.gitea.io/gitea/services/user" + webhook_service "code.gitea.io/gitea/services/webhook" ) const ( @@ -49,7 +48,6 @@ func Settings(ctx *context.Context) { ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess ctx.Data["ContextUser"] = ctx.ContextUser - ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod err := shared_user.LoadHeaderCount(ctx) if err != nil { @@ -67,7 +65,6 @@ func SettingsPost(ctx *context.Context) { ctx.Data["PageIsOrgSettings"] = true ctx.Data["PageIsSettingsOptions"] = true ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility - ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod if ctx.HasError() { ctx.HTML(http.StatusOK, tplSettingsOptions) @@ -81,9 +78,6 @@ func SettingsPost(ctx *context.Context) { if user_model.IsErrUserAlreadyExist(err) { ctx.Data["Err_Name"] = true ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplSettingsOptions, &form) - } else if user_model.IsErrCooldownPeriod(err) { - ctx.Data["Err_UserName"] = true - ctx.RenderWithErr(ctx.Locale.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z)), tplSettingsOptions, form) } else if db.IsErrNameReserved(err) { ctx.Data["Err_Name"] = true ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(db.ErrNameReserved).Name), tplSettingsOptions, &form) @@ -99,13 +93,7 @@ func SettingsPost(ctx *context.Context) { ctx.Org.OrgLink = setting.AppSubURL + "/org/" + url.PathEscape(org.Name) } - if form.Email == "" { - err := user_model.DeletePrimaryEmailAddressOfUser(ctx, org.ID) - if err != nil { - ctx.ServerError("DeletePrimaryEmailAddressOfUser", err) - return - } - } else { + if form.Email != "" { if err := user_service.ReplacePrimaryEmailAddress(ctx, org.AsUser(), form.Email); err != nil { ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSettingsOptions, &form) diff --git a/routers/web/org/setting/blocked_users.go b/routers/web/org/setting/blocked_users.go index 77b2791874..0c7f245c13 100644 --- a/routers/web/org/setting/blocked_users.go +++ b/routers/web/org/setting/blocked_users.go @@ -8,11 +8,11 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) const tplBlockedUsers = "org/settings/blocked_users" @@ -53,12 +53,6 @@ func BlockedUsersBlock(ctx *context.Context) { return } - if u.ID == ctx.Doer.ID { - ctx.Flash.Error(ctx.Tr("settings.user_block_yourself")) - ctx.Redirect(ctx.Org.OrgLink + "/settings/blocked_users") - return - } - if err := user_service.BlockUser(ctx, ctx.Org.Organization.ID, u.ID); err != nil { ctx.ServerError("BlockUser", err) return diff --git a/routers/web/org/setting/runners.go b/routers/web/org/setting/runners.go index 8053ed7729..fe05709237 100644 --- a/routers/web/org/setting/runners.go +++ b/routers/web/org/setting/runners.go @@ -4,7 +4,7 @@ package setting import ( - "forgejo.org/services/context" + "code.gitea.io/gitea/services/context" ) func RedirectToDefaultSetting(ctx *context.Context) { diff --git a/routers/web/org/setting/storage_overview.go b/routers/web/org/setting/storage_overview.go deleted file mode 100644 index 5714d7ee23..0000000000 --- a/routers/web/org/setting/storage_overview.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package setting - -import ( - "forgejo.org/modules/base" - "forgejo.org/routers/web/shared" - "forgejo.org/services/context" -) - -const ( - tplSettingsStorageOverview base.TplName = "org/settings/storage_overview" -) - -// StorageOverview render a size overview of the organization, as well as relevant -// quota limits of the instance. -func StorageOverview(ctx *context.Context) { - shared.StorageOverview(ctx, ctx.Org.Organization.ID, tplSettingsStorageOverview) -} diff --git a/routers/web/org/setting_oauth2.go b/routers/web/org/setting_oauth2.go index 9c31063974..7f855795d3 100644 --- a/routers/web/org/setting_oauth2.go +++ b/routers/web/org/setting_oauth2.go @@ -7,13 +7,13 @@ import ( "fmt" "net/http" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - shared_user "forgejo.org/routers/web/shared/user" - user_setting "forgejo.org/routers/web/user/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + user_setting "code.gitea.io/gitea/routers/web/user/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/org/setting_packages.go b/routers/web/org/setting_packages.go index 4457c8fb0f..af9836e42c 100644 --- a/routers/web/org/setting_packages.go +++ b/routers/web/org/setting_packages.go @@ -7,11 +7,11 @@ import ( "fmt" "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - shared "forgejo.org/routers/web/shared/packages" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + shared "code.gitea.io/gitea/routers/web/shared/packages" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index 659bee469f..45c36743e8 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -12,24 +12,23 @@ import ( "strconv" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - org_service "forgejo.org/services/org" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + org_service "code.gitea.io/gitea/services/org" + repo_service "code.gitea.io/gitea/services/repository" ) const ( @@ -132,7 +131,7 @@ func TeamsAction(ctx *context.Context) { u, err = user_model.GetUserByName(ctx, uname) if err != nil { if user_model.IsErrUserNotExist(err) { - if setting.MailService != nil && validation.ValidateEmail(uname) == nil { + if setting.MailService != nil && user_model.ValidateEmail(uname) == nil { if err := org_service.CreateTeamInvite(ctx, ctx.Doer, ctx.Org.Team, uname); err != nil { if org_model.IsErrTeamInviteAlreadyExist(err) { ctx.Flash.Error(ctx.Tr("form.duplicate_invite_to_team")) diff --git a/routers/web/repo/action_aggregator_test.go b/routers/web/repo/action_aggregator_test.go deleted file mode 100644 index 8bade074ca..0000000000 --- a/routers/web/repo/action_aggregator_test.go +++ /dev/null @@ -1,829 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package repo - -import ( - "strings" - "testing" - - issue_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" - - "github.com/stretchr/testify/assert" -) - -// *************** Helper functions for the tests *************** - -func testComment(t int64) *issue_model.Comment { - return &issue_model.Comment{PosterID: 1, CreatedUnix: timeutil.TimeStamp(t)} -} - -func nameToID(name string) int64 { - var id int64 - for c, letter := range name { - id += int64((c+1)*1000) * int64(letter) - } - return id -} - -func createReqReviewTarget(name string) issue_model.RequestReviewTarget { - if strings.HasSuffix(name, "-team") { - team := createTeam(name) - return issue_model.RequestReviewTarget{Team: &team} - } - user := createUser(name) - return issue_model.RequestReviewTarget{User: &user} -} - -func createUser(name string) user_model.User { - return user_model.User{Name: name, ID: nameToID(name)} -} - -func createTeam(name string) organization.Team { - return organization.Team{Name: name, ID: nameToID(name)} -} - -func createLabel(name string) issue_model.Label { - return issue_model.Label{Name: name, ID: nameToID(name)} -} - -func addLabel(t int64, name string) *issue_model.Comment { - c := testComment(t) - c.Type = issue_model.CommentTypeLabel - c.Content = "1" - lbl := createLabel(name) - c.Label = &lbl - c.AddedLabels = []*issue_model.Label{&lbl} - return c -} - -func delLabel(t int64, name string) *issue_model.Comment { - c := addLabel(t, name) - c.Content = "" - c.RemovedLabels = c.AddedLabels - c.AddedLabels = nil - return c -} - -func openOrClose(t int64, close bool) *issue_model.Comment { - c := testComment(t) - if close { - c.Type = issue_model.CommentTypeClose - } else { - c.Type = issue_model.CommentTypeReopen - } - return c -} - -func reqReview(t int64, name string, delReq bool) *issue_model.Comment { - c := testComment(t) - c.Type = issue_model.CommentTypeReviewRequest - if strings.HasSuffix(name, "-team") { - team := createTeam(name) - c.AssigneeTeam = &team - c.AssigneeTeamID = team.ID - } else { - user := createUser(name) - c.Assignee = &user - c.AssigneeID = user.ID - } - c.RemovedAssignee = delReq - return c -} - -func ghostReqReview(t, id int64) *issue_model.Comment { - c := testComment(t) - c.Type = issue_model.CommentTypeReviewRequest - c.AssigneeTeam = organization.NewGhostTeam() - c.AssigneeTeamID = id - return c -} - -func reqReviewList(t int64, del bool, names ...string) *issue_model.Comment { - req := []issue_model.RequestReviewTarget{} - for _, name := range names { - req = append(req, createReqReviewTarget(name)) - } - cmnt := testComment(t) - cmnt.Type = issue_model.CommentTypeReviewRequest - if del { - cmnt.RemovedRequestReview = req - } else { - cmnt.AddedRequestReview = req - } - return cmnt -} - -func aggregatedComment(t int64, - closed bool, - addLabels []*issue_model.Label, - delLabels []*issue_model.Label, - addReqReview []issue_model.RequestReviewTarget, - delReqReview []issue_model.RequestReviewTarget, -) *issue_model.Comment { - cmnt := testComment(t) - cmnt.Type = issue_model.CommentTypeAggregator - cmnt.Aggregator = &issue_model.ActionAggregator{ - IsClosed: closed, - AddedLabels: addLabels, - RemovedLabels: delLabels, - AddedRequestReview: addReqReview, - RemovedRequestReview: delReqReview, - } - if len(addLabels) > 0 { - cmnt.AddedLabels = addLabels - } - if len(delLabels) > 0 { - cmnt.RemovedLabels = delLabels - } - if len(addReqReview) > 0 { - cmnt.AddedRequestReview = addReqReview - } - if len(delReqReview) > 0 { - cmnt.RemovedRequestReview = delReqReview - } - return cmnt -} - -func commentText(t int64, text string) *issue_model.Comment { - c := testComment(t) - c.Type = issue_model.CommentTypeComment - c.Content = text - return c -} - -// **************************************************************** - -type testCase struct { - name string - beforeCombined []*issue_model.Comment - afterCombined []*issue_model.Comment - sameAfter bool - timestampCombination int64 -} - -func (kase *testCase) doTest(t *testing.T) { - issue := issue_model.Issue{Comments: kase.beforeCombined} - - var now int64 = -9223372036854775808 - for c := 0; c < len(kase.beforeCombined); c++ { - assert.Greater(t, int64(kase.beforeCombined[c].CreatedUnix), now) - now = int64(kase.beforeCombined[c].CreatedUnix) - } - - if kase.timestampCombination != 0 { - now = kase.timestampCombination - } - - issue_model.CombineCommentsHistory(&issue, now) - - after := kase.afterCombined - if kase.sameAfter { - after = kase.beforeCombined - } - - if len(after) != len(issue.Comments) { - t.Logf("Expected %v comments, got %v", len(after), len(issue.Comments)) - t.Logf("Comments got after combination:") - for c := 0; c < len(issue.Comments); c++ { - cmt := issue.Comments[c] - t.Logf("%v %v %v\n", cmt.Type, cmt.CreatedUnix, cmt.Content) - } - assert.EqualValues(t, len(after), len(issue.Comments)) - t.Fail() - return - } - - for c := 0; c < len(after); c++ { - l := (after)[c] - r := issue.Comments[c] - - // Ignore some inner data of the aggregator to facilitate testing - if l.Type == issue_model.CommentTypeAggregator { - r.Aggregator.StartUnix = 0 - r.Aggregator.PrevClosed = false - r.Aggregator.PosterID = 0 - r.Aggregator.StartInd = 0 - r.Aggregator.EndInd = 0 - r.Aggregator.AggAge = 0 - } - - // We can safely ignore this if the rest matches - if l.Type == issue_model.CommentTypeLabel { - l.Label = nil - l.Content = "" - } else if l.Type == issue_model.CommentTypeReviewRequest { - l.Assignee = nil - l.AssigneeID = 0 - l.AssigneeTeam = nil - l.AssigneeTeamID = 0 - } - - assert.EqualValues(t, (after)[c], issue.Comments[c], - "Comment %v is not equal", c, - ) - } -} - -// **************** Start of the tests ****************** - -func TestCombineLabelComments(t *testing.T) { - var tmon int64 = 60 * 60 * 24 * 30 - var tday int64 = 60 * 60 * 24 - var thour int64 = 60 * 60 - kases := []testCase{ - // ADD single = normal label comment - { - name: "add_single_label", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - commentText(10, "I'm a salmon"), - }, - sameAfter: true, - }, - - // ADD then REMOVE = Nothing - { - name: "add_label_then_remove", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - delLabel(1, "a"), - commentText(65, "I'm a salmon"), - }, - afterCombined: []*issue_model.Comment{ - commentText(65, "I'm a salmon"), - }, - }, - - // ADD 1 then comment then REMOVE = separate comments - { - name: "add_label_then_comment_then_remove", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - commentText(10, "I'm a salmon"), - delLabel(20, "a"), - }, - sameAfter: true, - }, - - // ADD 2 = Combined labels - { - name: "combine_labels", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - addLabel(10, "b"), - commentText(20, "I'm a salmon"), - addLabel(30, "c"), - addLabel(80, "d"), - addLabel(85, "e"), - delLabel(90, "c"), - }, - afterCombined: []*issue_model.Comment{ - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(0), - AddedLabels: []*issue_model.Label{ - {Name: "a", ID: nameToID("a")}, - {Name: "b", ID: nameToID("b")}, - }, - }, - commentText(20, "I'm a salmon"), - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(30), - AddedLabels: []*issue_model.Label{ - {Name: "d", ID: nameToID("d")}, - {Name: "e", ID: nameToID("e")}, - }, - }, - }, - }, - - // ADD 1, then 1 later = 2 separate comments - { - name: "add_then_later_label", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - addLabel(60, "b"), - addLabel(121, "c"), - }, - afterCombined: []*issue_model.Comment{ - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(0), - AddedLabels: []*issue_model.Label{ - {Name: "a", ID: nameToID("a")}, - {Name: "b", ID: nameToID("b")}, - }, - }, - addLabel(121, "c"), - }, - }, - - // ADD 2 then REMOVE 1 = label - { - name: "add_2_remove_1", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - addLabel(10, "b"), - delLabel(20, "a"), - }, - afterCombined: []*issue_model.Comment{ - // The timestamp will be the one of the first aggregated comment - addLabel(0, "b"), - }, - }, - - // ADD then REMOVE multiple = nothing - { - name: "add_multiple_remove_all", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - addLabel(1, "b"), - addLabel(2, "c"), - addLabel(3, "d"), - addLabel(4, "e"), - delLabel(5, "d"), - delLabel(6, "a"), - delLabel(7, "e"), - delLabel(8, "c"), - delLabel(9, "b"), - }, - afterCombined: nil, - }, - - // ADD 2, wait, REMOVE 2 = +2 then -2 comments - { - name: "add2_wait_rm2_labels", - beforeCombined: []*issue_model.Comment{ - addLabel(0, "a"), - addLabel(1, "b"), - delLabel(120, "a"), - delLabel(121, "b"), - }, - afterCombined: []*issue_model.Comment{ - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(0), - AddedLabels: []*issue_model.Label{ - {Name: "a", ID: nameToID("a")}, - {Name: "b", ID: nameToID("b")}, - }, - }, - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(120), - RemovedLabels: []*issue_model.Label{ - {Name: "a", ID: nameToID("a")}, - {Name: "b", ID: nameToID("b")}, - }, - }, - }, - }, - - // Regression check on edge case - { - name: "regression_edgecase_finalagg", - beforeCombined: []*issue_model.Comment{ - commentText(0, "hey"), - commentText(1, "ho"), - addLabel(2, "a"), - addLabel(3, "b"), - delLabel(4, "a"), - delLabel(5, "b"), - - addLabel(120, "a"), - - addLabel(220, "c"), - addLabel(221, "d"), - addLabel(222, "e"), - delLabel(223, "d"), - - delLabel(400, "a"), - }, - afterCombined: []*issue_model.Comment{ - commentText(0, "hey"), - commentText(1, "ho"), - addLabel(120, "a"), - { - PosterID: 1, - Type: issue_model.CommentTypeLabel, - CreatedUnix: timeutil.TimeStamp(220), - AddedLabels: []*issue_model.Label{ - {Name: "c", ID: nameToID("c")}, - {Name: "e", ID: nameToID("e")}, - }, - }, - delLabel(400, "a"), - }, - }, - - { - name: "combine_label_high_timestamp_separated", - timestampCombination: tmon + 1, - beforeCombined: []*issue_model.Comment{ - // 1 month old, comments separated by 1 Day + 1 sec (not agg) - addLabel(0, "d"), - delLabel(tday+1, "d"), - - // 1 day old, comments separated by 1 hour + 1 sec (not agg) - addLabel((tmon-tday)-thour, "c"), - delLabel((tmon-tday)+1, "c"), - - // 1 hour old, comments separated by 10 mins + 1 sec (not agg) - addLabel(tmon-thour, "b"), - delLabel((tmon-(50*60))+1, "b"), - - // Else, aggregate by minute - addLabel(tmon-61, "a"), - delLabel(tmon, "a"), - }, - sameAfter: true, - }, - - // Test higher timestamp diff - { - name: "combine_label_high_timestamp_merged", - timestampCombination: tmon + 1, - beforeCombined: []*issue_model.Comment{ - // 1 month old, comments separated by 1 Day (aggregated) - addLabel(0, "d"), - delLabel(tday, "d"), - - // 1 day old, comments separated by 1 hour (aggregated) - addLabel((tmon-tday)-thour, "c"), - delLabel(tmon-tday, "c"), - - // 1 hour old, comments separated by 10 mins (aggregated) - addLabel(tmon-thour, "b"), - delLabel(tmon-(50*60), "b"), - - addLabel(tmon-60, "a"), - delLabel(tmon, "a"), - }, - }, - } - - for _, kase := range kases { - t.Run(kase.name, kase.doTest) - } -} - -func TestCombineReviewRequests(t *testing.T) { - kases := []testCase{ - // ADD single = normal request review comment - { - name: "add_single_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "toto", false), - commentText(10, "I'm a salmon"), - reqReview(20, "toto-team", false), - }, - sameAfter: true, - }, - - // ADD then REMOVE = Nothing - { - name: "add_then_remove_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "toto", false), - reqReview(5, "toto", true), - commentText(10, "I'm a salmon"), - }, - afterCombined: []*issue_model.Comment{ - commentText(10, "I'm a salmon"), - }, - }, - - // ADD 1 then comment then REMOVE = separate comments - { - name: "add_comment_del_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "toto", false), - commentText(5, "I'm a salmon"), - reqReview(10, "toto", true), - }, - sameAfter: true, - }, - - // ADD 2 = Combined request reviews - { - name: "combine_reviews", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "toto", false), - reqReview(10, "tutu-team", false), - commentText(20, "I'm a salmon"), - reqReview(30, "titi", false), - reqReview(80, "tata", false), - reqReview(85, "tyty-team", false), - reqReview(90, "titi", true), - }, - afterCombined: []*issue_model.Comment{ - reqReviewList(0, false, "toto", "tutu-team"), - commentText(20, "I'm a salmon"), - reqReviewList(30, false, "tata", "tyty-team"), - }, - }, - - // ADD 1, then 1 later = 2 separate comments - { - name: "add_then_later_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "titi", false), - reqReview(60, "toto-team", false), - reqReview(121, "tutu", false), - }, - afterCombined: []*issue_model.Comment{ - reqReviewList(0, false, "titi", "toto-team"), - reqReviewList(121, false, "tutu"), - }, - }, - - // ADD 2 then REMOVE 1 = single request review - { - name: "add_2_then_remove_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "titi-team", false), - reqReview(59, "toto", false), - reqReview(60, "titi-team", true), - }, - afterCombined: []*issue_model.Comment{ - reqReviewList(0, false, "toto"), - }, - }, - - // ADD then REMOVE multiple = nothing - { - name: "add_multiple_then_remove_all_review", - beforeCombined: []*issue_model.Comment{ - reqReview(0, "titi0-team", false), - reqReview(1, "toto1", false), - reqReview(2, "titi2", false), - reqReview(3, "titi3-team", false), - reqReview(4, "titi4", false), - reqReview(5, "titi5", false), - reqReview(6, "titi6-team", false), - reqReview(10, "titi0-team", true), - reqReview(11, "toto1", true), - reqReview(12, "titi2", true), - reqReview(13, "titi3-team", true), - reqReview(14, "titi4", true), - reqReview(15, "titi5", true), - reqReview(16, "titi6-team", true), - }, - afterCombined: nil, - }, - - // ADD 2, wait, REMOVE 2 = +2 then -2 comments - { - name: "add2_wait_rm2_requests", - beforeCombined: []*issue_model.Comment{ - reqReview(1, "titi", false), - reqReview(2, "toto-team", false), - reqReview(121, "titi", true), - reqReview(122, "toto-team", true), - }, - afterCombined: []*issue_model.Comment{ - reqReviewList(1, false, "titi", "toto-team"), - reqReviewList(121, true, "titi", "toto-team"), - }, - }, - - // Ghost. - { - name: "ghost reviews", - beforeCombined: []*issue_model.Comment{ - reqReview(1, "titi", false), - ghostReqReview(2, 50), - ghostReqReview(3, 51), - ghostReqReview(4, 50), - }, - afterCombined: []*issue_model.Comment{ - { - PosterID: 1, - Type: issue_model.CommentTypeReviewRequest, - CreatedUnix: timeutil.TimeStamp(1), - AddedRequestReview: []issue_model.RequestReviewTarget{ - createReqReviewTarget("titi"), {Team: organization.NewGhostTeam()}, - }, - }, - }, - }, - } - - for _, kase := range kases { - t.Run(kase.name, kase.doTest) - } -} - -func TestCombineOpenClose(t *testing.T) { - kases := []testCase{ - // Close then open = nullified - { - name: "close_open_nullified", - beforeCombined: []*issue_model.Comment{ - openOrClose(0, true), - openOrClose(10, false), - }, - afterCombined: nil, - }, - - // Close then open later = separate comments - { - name: "close_open_later", - beforeCombined: []*issue_model.Comment{ - openOrClose(0, true), - openOrClose(61, false), - }, - sameAfter: true, - }, - - // Close then comment then open = separate comments - { - name: "close_comment_open", - beforeCombined: []*issue_model.Comment{ - openOrClose(0, true), - commentText(1, "I'm a salmon"), - openOrClose(2, false), - }, - sameAfter: true, - }, - } - - for _, kase := range kases { - t.Run(kase.name, kase.doTest) - } -} - -func TestCombineMultipleDifferentComments(t *testing.T) { - lblA := createLabel("a") - kases := []testCase{ - // Add Label + Close + ReqReview = Combined - { - name: "label_close_reqreview_combined", - beforeCombined: []*issue_model.Comment{ - reqReview(1, "toto", false), - addLabel(2, "a"), - openOrClose(3, true), - - reqReview(101, "toto", true), - openOrClose(102, false), - delLabel(103, "a"), - }, - afterCombined: []*issue_model.Comment{ - aggregatedComment(1, - true, - []*issue_model.Label{&lblA}, - []*issue_model.Label{}, - []issue_model.RequestReviewTarget{createReqReviewTarget("toto")}, - []issue_model.RequestReviewTarget{}, - ), - aggregatedComment(101, - false, - []*issue_model.Label{}, - []*issue_model.Label{&lblA}, - []issue_model.RequestReviewTarget{}, - []issue_model.RequestReviewTarget{createReqReviewTarget("toto")}, - ), - }, - }, - - // Add Req + Add Label + Close + Del Req + Del Label = Close only - { - name: "req_label_close_dellabel_delreq", - beforeCombined: []*issue_model.Comment{ - addLabel(2, "a"), - reqReview(3, "titi", false), - openOrClose(4, true), - delLabel(5, "a"), - reqReview(6, "titi", true), - }, - afterCombined: []*issue_model.Comment{ - openOrClose(2, true), - }, - }, - - // Close + Add Req + Add Label + Del Req + Open = Label only - { - name: "close_req_label_open_delreq", - beforeCombined: []*issue_model.Comment{ - openOrClose(2, true), - reqReview(4, "titi", false), - addLabel(5, "a"), - reqReview(6, "titi", true), - openOrClose(8, false), - }, - afterCombined: []*issue_model.Comment{ - addLabel(2, "a"), - }, - }, - - // Add Label + Close + Add ReqReview + Del Label + Open = ReqReview only - { - name: "label_close_req_dellabel_open", - beforeCombined: []*issue_model.Comment{ - addLabel(1, "a"), - openOrClose(2, true), - reqReview(4, "titi", false), - openOrClose(7, false), - delLabel(8, "a"), - }, - afterCombined: []*issue_model.Comment{ - reqReviewList(1, false, "titi"), - }, - }, - - // Add Label + Close + ReqReview, then delete everything = nothing - { - name: "add_multiple_delete_everything", - beforeCombined: []*issue_model.Comment{ - addLabel(1, "a"), - openOrClose(2, true), - reqReview(4, "titi", false), - openOrClose(7, false), - delLabel(8, "a"), - reqReview(10, "titi", true), - }, - afterCombined: nil, - }, - - // Add multiple, then comment, then delete everything = separate aggregation - { - name: "add_multiple_comment_delete_everything", - beforeCombined: []*issue_model.Comment{ - addLabel(1, "a"), - openOrClose(2, true), - reqReview(4, "titi", false), - - commentText(6, "I'm a salmon"), - - openOrClose(7, false), - delLabel(8, "a"), - reqReview(10, "titi", true), - }, - afterCombined: []*issue_model.Comment{ - aggregatedComment(1, - true, - []*issue_model.Label{&lblA}, - []*issue_model.Label{}, - []issue_model.RequestReviewTarget{createReqReviewTarget("titi")}, - []issue_model.RequestReviewTarget{}, - ), - commentText(6, "I'm a salmon"), - aggregatedComment(7, - false, - []*issue_model.Label{}, - []*issue_model.Label{&lblA}, - []issue_model.RequestReviewTarget{}, - []issue_model.RequestReviewTarget{createReqReviewTarget("titi")}, - ), - }, - }, - - { - name: "regression_edgecase_finalagg", - beforeCombined: []*issue_model.Comment{ - commentText(0, "hey"), - commentText(1, "ho"), - addLabel(2, "a"), - reqReview(3, "titi", false), - delLabel(4, "a"), - reqReview(5, "titi", true), - - addLabel(120, "a"), - - openOrClose(220, true), - addLabel(221, "d"), - reqReview(222, "toto-team", false), - delLabel(223, "d"), - - delLabel(400, "a"), - }, - afterCombined: []*issue_model.Comment{ - commentText(0, "hey"), - commentText(1, "ho"), - addLabel(120, "a"), - aggregatedComment(220, - true, - []*issue_model.Label{}, - []*issue_model.Label{}, - []issue_model.RequestReviewTarget{createReqReviewTarget("toto-team")}, - []issue_model.RequestReviewTarget{}, - ), - delLabel(400, "a"), - }, - }, - } - - for _, kase := range kases { - t.Run(kase.name, kase.doTest) - } -} diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go index 0a63f566e0..ff3b16159b 100644 --- a/routers/web/repo/actions/actions.go +++ b/routers/web/repo/actions/actions.go @@ -5,27 +5,24 @@ package actions import ( "bytes" - stdCtx "context" "fmt" "net/http" "slices" "strings" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - "forgejo.org/models/unit" - "forgejo.org/modules/actions" - "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/util" - "forgejo.org/routers/web/repo" - "forgejo.org/services/context" - "forgejo.org/services/convert" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" "github.com/nektos/act/pkg/model" ) @@ -225,10 +222,6 @@ func List(ctx *context.Context) { return } - if err := loadIsRefDeleted(ctx, ctx.Repo.Repository.ID, runs); err != nil { - log.Error("LoadIsRefDeleted", err) - } - ctx.Data["Runs"] = runs ctx.Data["Repo"] = ctx.Repo @@ -240,7 +233,7 @@ func List(ctx *context.Context) { } ctx.Data["Actors"] = repo.MakeSelfOnTop(ctx.Doer, actors) - ctx.Data["StatusInfoList"] = actions_model.GetStatusInfoList(ctx, ctx.Locale) + ctx.Data["StatusInfoList"] = actions_model.GetStatusInfoList(ctx) pager := context.NewPagination(int(total), opts.PageSize, opts.Page, 5) pager.SetDefaultParams(ctx) @@ -252,31 +245,3 @@ func List(ctx *context.Context) { ctx.HTML(http.StatusOK, tplListActions) } - -// loadIsRefDeleted loads the IsRefDeleted field for each run in the list. -// TODO: move this function to models/actions/run_list.go but now it will result in a circular import. -func loadIsRefDeleted(ctx stdCtx.Context, repoID int64, runs actions_model.RunList) error { - branches := make(container.Set[string], len(runs)) - for _, run := range runs { - refName := git.RefName(run.Ref) - if refName.IsBranch() { - branches.Add(refName.ShortName()) - } - } - if len(branches) == 0 { - return nil - } - - branchInfos, err := git_model.GetBranches(ctx, repoID, branches.Values(), false) - if err != nil { - return err - } - branchSet := git_model.BranchesToNamesSet(branchInfos) - for _, run := range runs { - refName := git.RefName(run.Ref) - if refName.IsBranch() && !branchSet.Contains(refName.ShortName()) { - run.IsRefDeleted = true - } - } - return nil -} diff --git a/routers/web/repo/actions/actions_test.go b/routers/web/repo/actions/actions_test.go deleted file mode 100644 index 232aacf96b..0000000000 --- a/routers/web/repo/actions/actions_test.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "testing" - - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - unittest "forgejo.org/models/unittest" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_loadIsRefDeleted(t *testing.T) { - unittest.PrepareTestEnv(t) - - runs, total, err := db.FindAndCount[actions_model.ActionRun](db.DefaultContext, - actions_model.FindRunOptions{RepoID: 4, Ref: "refs/heads/test"}) - require.NoError(t, err) - assert.Len(t, runs, 1) - assert.EqualValues(t, 1, total) - for _, run := range runs { - assert.False(t, run.IsRefDeleted) - } - - require.NoError(t, loadIsRefDeleted(db.DefaultContext, 4, runs)) - for _, run := range runs { - assert.True(t, run.IsRefDeleted) - } -} diff --git a/routers/web/repo/actions/main_test.go b/routers/web/repo/actions/main_test.go deleted file mode 100644 index 0f82a0e7ea..0000000000 --- a/routers/web/repo/actions/main_test.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "testing" - - "forgejo.org/models/unittest" -) - -func TestMain(m *testing.M) { - unittest.MainTest(m) -} diff --git a/routers/web/repo/actions/manual.go b/routers/web/repo/actions/manual.go index 413b087e8b..949469fa21 100644 --- a/routers/web/repo/actions/manual.go +++ b/routers/web/repo/actions/manual.go @@ -6,8 +6,8 @@ package actions import ( "net/url" - actions_service "forgejo.org/services/actions" - context_module "forgejo.org/services/context" + actions_service "code.gitea.io/gitea/services/actions" + context_module "code.gitea.io/gitea/services/context" ) func ManualRunWorkflow(ctx *context_module.Context) { @@ -46,8 +46,7 @@ func ManualRunWorkflow(ctx *context_module.Context) { return ctx.Req.PostFormValue(formKey) } - _, _, err = workflow.Dispatch(ctx, formKeyGetter, ctx.Repo.Repository, ctx.Doer) - if err != nil { + if err := workflow.Dispatch(ctx, formKeyGetter, ctx.Repo.Repository, ctx.Doer); err != nil { if actions_service.IsInputRequiredErr(err) { ctx.Flash.Error(ctx.Locale.Tr("actions.workflow.dispatch.input_required", err.(actions_service.InputRequiredErr).Name)) ctx.Redirect(location) diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go index 2d009c5720..bc1ecbfc1e 100644 --- a/routers/web/repo/actions/view.go +++ b/routers/web/repo/actions/view.go @@ -10,7 +10,6 @@ import ( "context" "errors" "fmt" - "html/template" "io" "net/http" "net/url" @@ -18,24 +17,20 @@ import ( "strings" "time" - 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/unit" - "forgejo.org/modules/actions" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/templates" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - actions_service "forgejo.org/services/actions" - context_module "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/base" + "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/web" + "code.gitea.io/gitea/routers/common" + actions_service "code.gitea.io/gitea/services/actions" + context_module "code.gitea.io/gitea/services/context" "xorm.io/builder" ) @@ -113,17 +108,16 @@ type ViewRequest struct { type ViewResponse struct { State struct { Run struct { - Link string `json:"link"` - Title string `json:"title"` - TitleHTML template.HTML `json:"titleHTML"` - Status string `json:"status"` - CanCancel bool `json:"canCancel"` - CanApprove bool `json:"canApprove"` // the run needs an approval and the doer has permission to approve - CanRerun bool `json:"canRerun"` - CanDeleteArtifact bool `json:"canDeleteArtifact"` - Done bool `json:"done"` - Jobs []*ViewJob `json:"jobs"` - Commit ViewCommit `json:"commit"` + Link string `json:"link"` + Title string `json:"title"` + Status string `json:"status"` + CanCancel bool `json:"canCancel"` + CanApprove bool `json:"canApprove"` // the run needs an approval and the doer has permission to approve + CanRerun bool `json:"canRerun"` + CanDeleteArtifact bool `json:"canDeleteArtifact"` + Done bool `json:"done"` + Jobs []*ViewJob `json:"jobs"` + Commit ViewCommit `json:"commit"` } `json:"run"` CurrentJob struct { Title string `json:"title"` @@ -160,9 +154,8 @@ type ViewUser struct { } type ViewBranch struct { - Name string `json:"name"` - Link string `json:"link"` - IsDeleted bool `json:"isDeleted"` + Name string `json:"name"` + Link string `json:"link"` } type ViewJobStep struct { @@ -201,10 +194,7 @@ func ViewPost(ctx *context_module.Context) { resp := &ViewResponse{} - metas := ctx.Repo.Repository.ComposeMetas(ctx) - resp.State.Run.Title = run.Title - resp.State.Run.TitleHTML = templates.RenderCommitMessage(ctx, run.Title, metas) resp.State.Run.Link = run.Link() resp.State.Run.CanCancel = !run.Status.IsDone() && ctx.Repo.CanWrite(unit.TypeActions) resp.State.Run.CanApprove = run.NeedApproval && ctx.Repo.CanWrite(unit.TypeActions) @@ -231,16 +221,6 @@ func ViewPost(ctx *context_module.Context) { Name: run.PrettyRef(), Link: run.RefLink(), } - refName := git.RefName(run.Ref) - if refName.IsBranch() { - b, err := git_model.GetBranch(ctx, ctx.Repo.Repository.ID, refName.ShortName()) - if err != nil && !git_model.IsErrBranchNotExist(err) { - log.Error("GetBranch: %v", err) - } else if git_model.IsErrBranchNotExist(err) || (b != nil && b.IsDeleted) { - branch.IsDeleted = true - } - } - resp.State.Run.Commit = ViewCommit{ LocaleCommit: ctx.Locale.TrString("actions.runs.commit"), LocalePushedBy: ctx.Locale.TrString("actions.runs.pushed_by"), @@ -327,6 +307,7 @@ func ViewPost(ctx *context_module.Context) { if validCursor { length := step.LogLength - cursor.Cursor offset := task.LogIndexes[index] + var err error logRows, err := actions.ReadLogs(ctx, task.LogInStorage, task.LogFilename, offset, length) if err != nil { ctx.Error(http.StatusInternalServerError, err.Error()) @@ -708,8 +689,7 @@ func ArtifactsDownloadView(ctx *context_module.Context) { if len(artifacts) == 1 && artifacts[0].ArtifactName+".zip" == artifacts[0].ArtifactPath && artifacts[0].ContentEncoding == "application/zip" { art := artifacts[0] if setting.Actions.ArtifactStorage.MinioConfig.ServeDirect { - u, err := storage.ActionsArtifacts.URL(art.StoragePath, art.ArtifactPath, nil) - + u, err := storage.ActionsArtifacts.URL(art.StoragePath, art.ArtifactPath) if u != nil && err == nil { ctx.Redirect(u.String()) return diff --git a/routers/web/repo/activity.go b/routers/web/repo/activity.go index c9cd2c13bb..ba776c84d3 100644 --- a/routers/web/repo/activity.go +++ b/routers/web/repo/activity.go @@ -7,10 +7,10 @@ import ( "net/http" "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/services/context" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" ) const ( @@ -48,8 +48,8 @@ func Activity(ctx *context.Context) { ctx.Data["Period"] = "weekly" timeFrom = timeUntil.Add(-time.Hour * 168) } - ctx.Data["DateFrom"] = timeFrom - ctx.Data["DateUntil"] = timeUntil + ctx.Data["DateFrom"] = timeFrom.UTC().Format(time.RFC3339) + ctx.Data["DateUntil"] = timeUntil.UTC().Format(time.RFC3339) ctx.Data["PeriodText"] = ctx.Tr("repo.activity.period." + ctx.Data["Period"].(string)) var err error @@ -94,6 +94,7 @@ func ActivityAuthors(ctx *context.Context) { timeFrom = timeUntil.Add(-time.Hour * 168) } + var err error authors, err := activities_model.GetActivityStatsTopAuthors(ctx, ctx.Repo.Repository, timeFrom, 10) if err != nil { ctx.ServerError("GetActivityStatsTopAuthors", err) diff --git a/routers/web/repo/annex.go b/routers/web/repo/annex.go index e150ff70ca..852b5a11cc 100644 --- a/routers/web/repo/annex.go +++ b/routers/web/repo/annex.go @@ -12,15 +12,14 @@ import ( "syscall" "time" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/annex" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - services_context "forgejo.org/services/context" + "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/modules/annex" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + services_context "code.gitea.io/gitea/services/context" ) type p2phttpRecordType struct { @@ -36,7 +35,6 @@ func AnnexP2PHTTP(ctx *services_context.Context) { uuid := ctx.Params(":uuid") repoPath, err := annex.UUID2RepoPath(uuid) if err != nil { - log.Error("%v", err) ctx.PlainText(http.StatusNotFound, "Repository not found") return } @@ -46,14 +44,12 @@ func AnnexP2PHTTP(ctx *services_context.Context) { owner := parts[len(parts)-2] repo, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, repoName) if err != nil { - log.Error("%v", err) ctx.PlainText(http.StatusNotFound, "Repository not found") return } p, err := access_model.GetUserRepoPermission(ctx, repo, ctx.Doer) if err != nil { - log.Error("%v", err) ctx.ServerError("GetUserRepoPermission", err) return } @@ -97,12 +93,6 @@ func AnnexP2PHTTP(ctx *services_context.Context) { Pdeathsig: syscall.SIGINT, } cmd.Cancel = func() error { return cmd.Process.Signal(os.Interrupt) } - cmd.Env = append(os.Environ(), - "GIT_AUTHOR_NAME="+setting.AppName, - "GIT_AUTHOR_EMAIL="+setting.RunUser+"@"+setting.Domain, - "GIT_COMMITTER_NAME="+setting.AppName, - "GIT_COMMITTER_EMAIL="+setting.RunUser+"@"+setting.Domain, - ) _ = cmd.Run() }(p2phttpCtx) graceful.GetManager().RunAtTerminate(p2phttpCtxCancel) diff --git a/routers/web/repo/attachment.go b/routers/web/repo/attachment.go index e46c08fef8..b42effd8c3 100644 --- a/routers/web/repo/attachment.go +++ b/routers/web/repo/attachment.go @@ -7,18 +7,18 @@ import ( "fmt" "net/http" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/routers/common" - "forgejo.org/services/attachment" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - repo_service "forgejo.org/services/repository" + access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/attachment" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + repo_service "code.gitea.io/gitea/services/repository" ) // UploadIssueAttachment response for Issue/PR attachments @@ -134,7 +134,7 @@ func ServeAttachment(ctx *context.Context, uuid string) { if setting.Attachment.Storage.MinioConfig.ServeDirect { // If we have a signed url (S3, object storage), redirect to this directly. - u, err := storage.Attachments.URL(attach.RelativePath(), attach.Name, nil) + u, err := storage.Attachments.URL(attach.RelativePath(), attach.Name) if u != nil && err == nil { ctx.Redirect(u.String()) diff --git a/routers/web/repo/badges/badges.go b/routers/web/repo/badges/badges.go index e623a21fc0..a2306d5836 100644 --- a/routers/web/repo/badges/badges.go +++ b/routers/web/repo/badges/badges.go @@ -8,11 +8,11 @@ import ( "net/url" "strings" - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/setting" - context_module "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/setting" + context_module "code.gitea.io/gitea/services/context" ) func getBadgeURL(ctx *context_module.Context, label, text, color string) string { diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index ccdd59f2dd..eea3d4dc00 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -10,16 +10,17 @@ import ( "net/url" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/highlight" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/util" - "forgejo.org/services/context" - files_service "forgejo.org/services/repository/files" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/highlight" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + files_service "code.gitea.io/gitea/services/repository/files" ) type blameRow struct { @@ -56,11 +57,6 @@ func RefBlame(ctx *context.Context) { HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err) return } - if entry.IsDir() { - ctx.NotFound("Cannot blame directory", nil) - return - } - blob := entry.Blob() ctx.Data["PageIsViewCode"] = true @@ -258,7 +254,7 @@ func renderBlame(ctx *context.Context, blameParts []*git.BlamePart, commitNames commitCnt++ // User avatar image - commitSince := templates.TimeSince(commit.Author.When) + commitSince := timeutil.TimeSinceUnix(timeutil.TimeStamp(commit.Author.When.Unix()), ctx.Locale) var avatar string if commit.User != nil { diff --git a/routers/web/repo/branch.go b/routers/web/repo/branch.go index af8a838fc9..4897a5f4fc 100644 --- a/routers/web/repo/branch.go +++ b/routers/web/repo/branch.go @@ -11,23 +11,23 @@ import ( "net/url" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/utils" - "forgejo.org/services/context" - "forgejo.org/services/forms" - release_service "forgejo.org/services/release" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + release_service "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/repo/card.go b/routers/web/repo/card.go deleted file mode 100644 index 449e5c4890..0000000000 --- a/routers/web/repo/card.go +++ /dev/null @@ -1,526 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package repo - -import ( - "bytes" - "encoding/hex" - "fmt" - "image" - "image/color" - "image/png" - "net/http" - "strconv" - "strings" - "time" - - "forgejo.org/models/db" - issue_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/card" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/services/context" -) - -// drawUser draws a user avatar in a summary card -func drawUser(ctx *context.Context, card *card.Card, user *user_model.User) error { - if user.UseCustomAvatar { - posterAvatarPath := user.CustomAvatarRelativePath() - if posterAvatarPath != "" { - userAvatarFile, err := storage.Avatars.Open(user.CustomAvatarRelativePath()) - if err != nil { - return err - } - userAvatarImage, _, err := image.Decode(userAvatarFile) - if err != nil { - return err - } - card.DrawImage(userAvatarImage) - } - } else { - posterAvatarLink := user.AvatarLinkWithSize(ctx, 256) - card.DrawExternalImage(posterAvatarLink) - } - return nil -} - -// drawRepoIcon draws the repo icon in a summary card -func drawRepoIcon(ctx *context.Context, card *card.Card, repo *repo_model.Repository) error { - repoAvatarPath := repo.CustomAvatarRelativePath() - - if repoAvatarPath != "" { - repoAvatarFile, err := storage.RepoAvatars.Open(repoAvatarPath) - if err != nil { - return err - } - repoAvatarImage, _, err := image.Decode(repoAvatarFile) - if err != nil { - return err - } - card.DrawImage(repoAvatarImage) - return nil - } - - // If the repo didn't have an avatar, fallback to the repo owner's avatar for the right-hand-side icon - err := repo.LoadOwner(ctx) - if err != nil { - return err - } - if repo.Owner != nil { - err = drawUser(ctx, card, repo.Owner) - if err != nil { - return err - } - } - - return nil -} - -// hexToColor converts a hex color to a go color -func hexToColor(colorStr string) (*color.RGBA, error) { - colorStr = strings.TrimLeft(colorStr, "#") - - b, err := hex.DecodeString(colorStr) - if err != nil { - return nil, err - } - - if len(b) < 3 { - return nil, fmt.Errorf("expected at least 3 bytes from DecodeString, got %d", len(b)) - } - - color := color.RGBA{b[0], b[1], b[2], 255} - - return &color, nil -} - -func drawLanguagesCard(ctx *context.Context, card *card.Card) error { - languageList, err := repo_model.GetTopLanguageStats(ctx, ctx.Repo.Repository, 5) - if err != nil { - return err - } - if len(languageList) == 0 { - card.DrawRect(0, 0, card.Width, card.Height, color.White) - return nil - } - - currentX := 0 - var langColor *color.RGBA - - for _, lang := range languageList { - langColor, err = hexToColor(lang.Color) - if err != nil { - return err - } - - langWidth := float32(card.Width) * (lang.Percentage / 100) - card.DrawRect(currentX, 0, currentX+int(langWidth), card.Width, langColor) - currentX += int(langWidth) - } - - if currentX < card.Width { - card.DrawRect(currentX, 0, card.Width, card.Height, langColor) - } - - return nil -} - -func drawRepoSummaryCard(ctx *context.Context, repo *repo_model.Repository) (*card.Card, error) { - width, height := card.DefaultSize() - mainCard, err := card.NewCard(width, height) - if err != nil { - return nil, err - } - - contentCard, languageBarCard := mainCard.Split(false, 90) - - contentCard.SetMargin(60) - topSection, bottomSection := contentCard.Split(false, 75) - issueSummary, issueIcon := topSection.Split(true, 80) - repoInfo, issueDescription := issueSummary.Split(false, 30) - - repoInfo.SetMargin(10) - _, err = repoInfo.DrawText(repo.FullName(), color.Black, 56, card.Top, card.Left) - if err != nil { - return nil, err - } - - issueDescription.SetMargin(10) - _, err = issueDescription.DrawText(repo.Description, color.Gray{128}, 36, card.Top, card.Left) - if err != nil { - return nil, err - } - - issueIcon.SetMargin(10) - err = drawRepoIcon(ctx, issueIcon, repo) - if err != nil { - return nil, err - } - - topCountCard, bottomCountCard := bottomSection.Split(false, 50) - - releaseCount, err := db.Count[repo_model.Release](ctx, repo_model.FindReleasesOptions{ - // only show draft releases for users who can write, read-only users shouldn't see draft releases. - IncludeDrafts: ctx.Repo.CanWrite(unit_model.TypeReleases), - RepoID: ctx.Repo.Repository.ID, - }) - if err != nil { - return nil, err - } - - starsText := ctx.Locale.TrN( - repo.NumStars, - "explore.stars_one", - "explore.stars_few", - repo.NumStars, - ) - forksText := ctx.Locale.TrN( - repo.NumForks, - "explore.forks_one", - "explore.forks_few", - repo.NumForks, - ) - releasesText := ctx.Locale.TrN( - releaseCount, - "repo.activity.title.releases_1", - "repo.activity.title.releases_n", - releaseCount, - ) - - topCountText := fmt.Sprintf("%s • %s • %s", starsText, forksText, releasesText) - - topCountCard.SetMargin(10) - _, err = topCountCard.DrawText(topCountText, color.Gray{128}, 36, card.Top, card.Left) - if err != nil { - return nil, err - } - - issuesText := ctx.Locale.TrN( - repo.NumOpenIssues, - "repo.activity.title.issues_1", - "repo.activity.title.issues_n", - repo.NumOpenIssues, - ) - pullRequestsText := ctx.Locale.TrN( - repo.NumOpenPulls, - "repo.activity.title.prs_1", - "repo.activity.title.prs_n", - repo.NumOpenPulls, - ) - - bottomCountText := fmt.Sprintf("%s • %s", issuesText, pullRequestsText) - - bottomCountCard.SetMargin(10) - _, err = bottomCountCard.DrawText(bottomCountText, color.Gray{128}, 36, card.Top, card.Left) - if err != nil { - return nil, err - } - - err = drawLanguagesCard(ctx, languageBarCard) - if err != nil { - return nil, err - } - - return mainCard, nil -} - -func drawIssueSummaryCard(ctx *context.Context, issue *issue_model.Issue) (*card.Card, error) { - width, height := card.DefaultSize() - mainCard, err := card.NewCard(width, height) - if err != nil { - return nil, err - } - - mainCard.SetMargin(60) - topSection, bottomSection := mainCard.Split(false, 75) - issueSummary, issueIcon := topSection.Split(true, 80) - repoInfo, issueDescription := issueSummary.Split(false, 15) - - repoInfo.SetMargin(10) - _, err = repoInfo.DrawText(fmt.Sprintf("%s - #%d", issue.Repo.FullName(), issue.Index), color.Gray{128}, 36, card.Top, card.Left) - if err != nil { - return nil, err - } - - issueDescription.SetMargin(10) - _, err = issueDescription.DrawText(issue.Title, color.Black, 56, card.Top, card.Left) - if err != nil { - return nil, err - } - - issueIcon.SetMargin(10) - err = drawRepoIcon(ctx, issueIcon, issue.Repo) - if err != nil { - return nil, err - } - - issueStats, issueAttribution := bottomSection.Split(false, 50) - - var state string - if issue.IsPull && issue.PullRequest.HasMerged { - if issue.PullRequest.Status == 3 { - state = ctx.Locale.TrString("repo.pulls.manually_merged") - } else { - state = ctx.Locale.TrString("repo.pulls.merged") - } - } else if issue.IsClosed { - state = ctx.Locale.TrString("repo.issues.closed_title") - } else if issue.IsPull { - if issue.PullRequest.IsWorkInProgress(ctx) { - state = ctx.Locale.TrString("repo.issues.draft_title") - } else { - state = ctx.Locale.TrString("repo.issues.open_title") - } - } else { - state = ctx.Locale.TrString("repo.issues.open_title") - } - state = strings.ToLower(state) - - issueStats.SetMargin(10) - if issue.IsPull { - reviews := map[int64]bool{} - for _, comment := range issue.Comments { - if comment.Review != nil { - reviews[comment.Review.ID] = true - } - } - _, err = issueStats.DrawText( - fmt.Sprintf("%s, %s, %s", - ctx.Locale.TrN( - issue.NumComments, - "repo.issues.num_comments_1", - "repo.issues.num_comments", - issue.NumComments, - ), - ctx.Locale.TrN( - len(reviews), - "repo.issues.num_reviews_one", - "repo.issues.num_reviews_few", - len(reviews), - ), - state, - ), - color.Gray{128}, 36, card.Top, card.Left) - } else { - _, err = issueStats.DrawText( - fmt.Sprintf("%s, %s", - ctx.Locale.TrN( - issue.NumComments, - "repo.issues.num_comments_1", - "repo.issues.num_comments", - issue.NumComments, - ), - state, - ), - color.Gray{128}, 36, card.Top, card.Left) - } - if err != nil { - return nil, err - } - - issueAttributionIcon, issueAttributionText := issueAttribution.Split(true, 8) - issueAttributionText.SetMargin(5) - _, err = issueAttributionText.DrawText( - fmt.Sprintf( - "%s - %s", - issue.Poster.Name, - issue.Created.AsTime().Format(time.DateOnly), - ), - color.Gray{128}, 36, card.Middle, card.Left) - if err != nil { - return nil, err - } - err = drawUser(ctx, issueAttributionIcon, issue.Poster) - if err != nil { - return nil, err - } - - return mainCard, nil -} - -func drawReleaseSummaryCard(ctx *context.Context, release *repo_model.Release) (*card.Card, error) { - width, height := card.DefaultSize() - mainCard, err := card.NewCard(width, height) - if err != nil { - return nil, err - } - - mainCard.SetMargin(60) - topSection, bottomSection := mainCard.Split(false, 75) - releaseSummary, repoIcon := topSection.Split(true, 80) - repoInfo, releaseDescription := releaseSummary.Split(false, 15) - - repoInfo.SetMargin(10) - _, err = repoInfo.DrawText(release.Repo.FullName(), color.Gray{128}, 36, card.Top, card.Left) - if err != nil { - return nil, err - } - - releaseDescription.SetMargin(10) - _, err = releaseDescription.DrawText(release.DisplayName(), color.Black, 56, card.Top, card.Left) - if err != nil { - return nil, err - } - - repoIcon.SetMargin(10) - err = drawRepoIcon(ctx, repoIcon, release.Repo) - if err != nil { - return nil, err - } - - downloadCountCard, releaseDateCard := bottomSection.Split(true, 75) - - downloadCount, err := release.GetTotalDownloadCount(ctx) - if err != nil { - return nil, err - } - - downloadCountText := ctx.Locale.TrN( - strconv.FormatInt(downloadCount, 10), - "repo.release.download_count_one", - "repo.release.download_count_few", - strconv.FormatInt(downloadCount, 10), - ) - - _, err = downloadCountCard.DrawText(string(downloadCountText), color.Gray{128}, 36, card.Bottom, card.Left) - if err != nil { - return nil, err - } - - _, err = releaseDateCard.DrawText(release.CreatedUnix.AsTime().Format(time.DateOnly), color.Gray{128}, 36, card.Bottom, card.Left) - if err != nil { - return nil, err - } - - return mainCard, nil -} - -// checkCardCache checks if a card in cache and serves it -func checkCardCache(ctx *context.Context, cacheKey string) bool { - cache := cache.GetCache() - pngData, ok := cache.Get(cacheKey).([]byte) - if ok && pngData != nil && len(pngData) > 0 { - ctx.Resp.Header().Set("Content-Type", "image/png") - ctx.Resp.WriteHeader(http.StatusOK) - _, err := ctx.Resp.Write(pngData) - if err != nil { - ctx.ServerError("GetSummaryCard", err) - } - return true - } - - return false -} - -// serveCard server a Card to the user adds it to the cache -func serveCard(ctx *context.Context, card *card.Card, cacheKey string) { - cache := cache.GetCache() - - // Encode image, store in cache - var imageBuffer bytes.Buffer - err := png.Encode(&imageBuffer, card.Img) - if err != nil { - ctx.ServerError("GetSummaryCard", err) - return - } - imageBytes := imageBuffer.Bytes() - err = cache.Put(cacheKey, imageBytes, setting.CacheService.TTLSeconds()) - if err != nil { - // don't abort serving the image if we just had a cache storage failure - log.Warn("failed to cache issue summary card: %v", err) - } - - // Finish the uncached image response - ctx.Resp.Header().Set("Content-Type", "image/png") - ctx.Resp.WriteHeader(http.StatusOK) - _, err = ctx.Resp.Write(imageBytes) - if err != nil { - ctx.ServerError("GetSummaryCard", err) - return - } -} - -func DrawRepoSummaryCard(ctx *context.Context) { - cacheKey := fmt.Sprintf("summary_card:repo:%s:%d", ctx.Locale.Language(), ctx.Repo.Repository.ID) - - if checkCardCache(ctx, cacheKey) { - return - } - - card, err := drawRepoSummaryCard(ctx, ctx.Repo.Repository) - if err != nil { - ctx.ServerError("drawRepoSummaryCar", err) - return - } - - serveCard(ctx, card, cacheKey) -} - -func DrawIssueSummaryCard(ctx *context.Context) { - issue, err := issue_model.GetIssueWithAttrsByIndex(ctx, ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - if issue_model.IsErrIssueNotExist(err) { - ctx.Error(http.StatusNotFound) - } else { - ctx.Error(http.StatusInternalServerError, "GetIssueByIndex", err.Error()) - } - return - } - - if !ctx.Repo.CanReadIssuesOrPulls(issue.IsPull) { - ctx.Error(http.StatusNotFound) - return - } - - cacheKey := fmt.Sprintf("summary_card:issue:%s:%d", ctx.Locale.Language(), issue.ID) - - if checkCardCache(ctx, cacheKey) { - return - } - - card, err := drawIssueSummaryCard(ctx, issue) - if err != nil { - ctx.ServerError("drawIssueSummaryCar", err) - return - } - - serveCard(ctx, card, cacheKey) -} - -func DrawReleaseSummaryCard(ctx *context.Context) { - release, err := repo_model.GetRelease(ctx, ctx.Repo.Repository.ID, ctx.Params("*")) - if err != nil { - if repo_model.IsErrReleaseNotExist(err) { - ctx.NotFound("", nil) - } else { - ctx.ServerError("GetReleaseForRepoByID", err) - } - return - } - - err = release.LoadRepo(ctx) - if err != nil { - ctx.ServerError("LoadRepo", err) - return - } - - cacheKey := fmt.Sprintf("summary_card:release:%s:%d", ctx.Locale.Language(), release.ID) - - if checkCardCache(ctx, cacheKey) { - return - } - - card, err := drawReleaseSummaryCard(ctx, release) - if err != nil { - ctx.ServerError("drawRepoSummaryCar", err) - return - } - - serveCard(ctx, card, cacheKey) -} diff --git a/routers/web/repo/cherry_pick.go b/routers/web/repo/cherry_pick.go index 0f57eb66f0..90dae704f4 100644 --- a/routers/web/repo/cherry_pick.go +++ b/routers/web/repo/cherry_pick.go @@ -8,17 +8,17 @@ import ( "errors" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/repository/files" ) var tplCherryPick base.TplName = "repo/editor/cherry_pick" diff --git a/routers/web/repo/code_frequency.go b/routers/web/repo/code_frequency.go index 04009b4afa..c76f492da0 100644 --- a/routers/web/repo/code_frequency.go +++ b/routers/web/repo/code_frequency.go @@ -7,9 +7,9 @@ import ( "errors" "net/http" - "forgejo.org/modules/base" - "forgejo.org/services/context" - contributors_service "forgejo.org/services/repository" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" + contributors_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/repo/commit.go b/routers/web/repo/commit.go index 3cd80a6777..0e5d1f0a1f 100644 --- a/routers/web/repo/commit.go +++ b/routers/web/repo/commit.go @@ -12,26 +12,24 @@ import ( "path" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/gitdiff" - git_service "forgejo.org/services/repository" - "forgejo.org/services/repository/gitgraph" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitgraph" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/gitdiff" + git_service "code.gitea.io/gitea/services/repository" ) const ( @@ -315,7 +313,11 @@ func Diff(ctx *context.Context) { commit, err := gitRepo.GetCommit(commitID) if err != nil { - ctx.NotFoundOrServerError("gitRepo.GetCommit", git.IsErrNotExist, err) + if git.IsErrNotExist(err) { + ctx.NotFound("Repo.GitRepo.GetCommit", err) + } else { + ctx.ServerError("Repo.GitRepo.GetCommit", err) + } return } if len(commitID) != commit.ID.Type().FullLength() { @@ -336,10 +338,9 @@ func Diff(ctx *context.Context) { MaxLineCharacters: setting.Git.MaxGitDiffLineCharacters, MaxFiles: maxFiles, WhitespaceBehavior: gitdiff.GetWhitespaceFlag(ctx.Data["WhitespaceBehavior"].(string)), - FileOnly: fileOnly, }, files...) if err != nil { - ctx.ServerError("GetDiff", err) + ctx.NotFound("GetDiff", err) return } @@ -415,10 +416,6 @@ func Diff(ctx *context.Context) { } } - ctx.Data["OpenGraphTitle"] = commit.Summary() + " · " + base.ShortSha(commitID) - ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s/commit/%s", ctx.Repo.Repository.HTMLURL(), commitID) - _, ctx.Data["OpenGraphDescription"], _ = strings.Cut(commit.Message(), "\n") - ctx.HTML(http.StatusOK, tplCommitPage) } @@ -469,29 +466,3 @@ func processGitCommits(ctx *context.Context, gitCommits []*git.Commit) []*git_mo } return commits } - -func SetCommitNotes(ctx *context.Context) { - form := web.GetForm(ctx).(*forms.CommitNotesForm) - - commitID := ctx.Params(":sha") - - err := git.SetNote(ctx, ctx.Repo.GitRepo, commitID, form.Notes, ctx.Doer.Name, ctx.Doer.GetEmail()) - if err != nil { - ctx.ServerError("SetNote", err) - return - } - - ctx.Redirect(fmt.Sprintf("%s/commit/%s", ctx.Repo.Repository.HTMLURL(), commitID)) -} - -func RemoveCommitNotes(ctx *context.Context) { - commitID := ctx.Params(":sha") - - err := git.RemoveNote(ctx, ctx.Repo.GitRepo, commitID) - if err != nil { - ctx.ServerError("RemoveNotes", err) - return - } - - ctx.Redirect(fmt.Sprintf("%s/commit/%s", ctx.Repo.Repository.HTMLURL(), commitID)) -} diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 55d50c9a79..38d6004ec6 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -16,30 +16,29 @@ import ( "path/filepath" "strings" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - 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/annex" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - csv_module "forgejo.org/modules/csv" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/routers/common" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/gitdiff" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + 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/base" + "code.gitea.io/gitea/modules/charset" + csv_module "code.gitea.io/gitea/modules/csv" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "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/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/gitdiff" ) const ( @@ -52,7 +51,6 @@ const ( func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner, headName string) { ctx.Data["BeforeCommit"] = before ctx.Data["HeadCommit"] = head - ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + url.QueryEscape(ctx.Data["Link"].(string)) ctx.Data["GetBlobByPathForCommit"] = func(commit *git.Commit, path string) *git.Blob { if commit == nil { @@ -73,21 +71,7 @@ func setCompareContext(ctx *context.Context, before, head *git.Commit, headOwner return st } - isAnnexed, err := annex.IsAnnexed(blob) - if err != nil { - log.Error("IsAnnexed failed: %v", err) - return st - } - if isAnnexed { - st, err = annex.GuessContentType(blob) - if err != nil { - log.Error("GuessContentType failed: %v", err) - return st - } - return st - } - - st, err = blob.GuessContentType() + st, err := blob.GuessContentType() if err != nil { log.Error("GuessContentType failed: %v", err) return st @@ -105,18 +89,18 @@ func SourceCommitURL(owner, name string, commit *git.Commit) string { return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/src/commit/" + url.PathEscape(commit.ID.String()) } -// MediaCommitURL creates a relative URL for the commit media (plain git, LFS, or annex content) in the given repository -func MediaCommitURL(owner, name string, commit *git.Commit) string { - return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/media/commit/" + url.PathEscape(commit.ID.String()) +// RawCommitURL creates a relative URL for the raw commit in the given repository +func RawCommitURL(owner, name string, commit *git.Commit) string { + return setting.AppSubURL + "/" + url.PathEscape(owner) + "/" + url.PathEscape(name) + "/raw/commit/" + url.PathEscape(commit.ID.String()) } // setPathsCompareContext sets context data for source and raw paths func setPathsCompareContext(ctx *context.Context, base, head *git.Commit, headOwner, headName string) { ctx.Data["SourcePath"] = SourceCommitURL(headOwner, headName, head) - ctx.Data["RawPath"] = MediaCommitURL(headOwner, headName, head) + ctx.Data["RawPath"] = RawCommitURL(headOwner, headName, head) if base != nil { ctx.Data["BeforeSourcePath"] = SourceCommitURL(headOwner, headName, base) - ctx.Data["BeforeRawPath"] = MediaCommitURL(headOwner, headName, base) + ctx.Data["BeforeRawPath"] = RawCommitURL(headOwner, headName, base) } } @@ -246,13 +230,6 @@ func ParseCompareInfo(ctx *context.Context) *common.CompareInfo { if infoPath == "" { infos = []string{baseRepo.DefaultBranch, baseRepo.DefaultBranch} } else { - infoPath, isDiff := strings.CutSuffix(infoPath, ".diff") - ctx.Data["ComparingDiff"] = isDiff - if !isDiff { - var isPatch bool - infoPath, isPatch = strings.CutSuffix(infoPath, ".patch") - ctx.Data["ComparingPatch"] = isPatch - } infos = strings.SplitN(infoPath, "...", 2) if len(infos) != 2 { if infos = strings.SplitN(infoPath, "..", 2); len(infos) == 2 { @@ -634,8 +611,6 @@ func PrepareCompareDiff( maxLines, maxFiles = -1, -1 } - fileOnly := ctx.FormBool("file-only") - diff, err := gitdiff.GetDiff(ctx, ci.HeadGitRepo, &gitdiff.DiffOptions{ BeforeCommitID: beforeCommitID, @@ -646,7 +621,6 @@ func PrepareCompareDiff( MaxFiles: maxFiles, WhitespaceBehavior: whitespaceBehavior, DirectComparison: ci.DirectComparison, - FileOnly: fileOnly, }, ctx.FormStrings("files")...) if err != nil { ctx.ServerError("GetDiffRangeWithWhitespaceBehavior", err) @@ -739,22 +713,6 @@ func CompareDiff(ctx *context.Context) { return } - if ctx.Data["ComparingDiff"] != nil && ctx.Data["ComparingDiff"].(bool) { - err := git.GetRepoRawDiffForFile(ci.HeadGitRepo, ci.BaseBranch, ci.HeadBranch, git.RawDiffNormal, "", ctx.Resp) - if err != nil { - ctx.ServerError("ComparingDiff", err) - return - } - } - - if ctx.Data["ComparingPatch"] != nil && ctx.Data["ComparingPatch"].(bool) { - err := git.GetRepoRawDiffForFile(ci.HeadGitRepo, ci.BaseBranch, ci.HeadBranch, git.RawDiffPatch, "", ctx.Resp) - if err != nil { - ctx.ServerError("ComparingPatch", err) - return - } - } - ctx.Data["PullRequestWorkInProgressPrefixes"] = setting.Repository.PullRequest.WorkInProgressPrefixes ctx.Data["DirectComparison"] = ci.DirectComparison ctx.Data["OtherCompareSeparator"] = ".." @@ -840,8 +798,7 @@ func CompareDiff(ctx *context.Context) { if ci.DirectComparison { separator = ".." } - ctx.Data["Comparing"] = base.ShortSha(beforeCommitID) + separator + base.ShortSha(afterCommitID) - ctx.Data["Title"] = "Comparing " + ctx.Data["Comparing"].(string) + ctx.Data["Title"] = "Comparing " + base.ShortSha(beforeCommitID) + separator + base.ShortSha(afterCommitID) ctx.Data["IsDiffCompare"] = true _, templateErrs := setTemplateIfExists(ctx, pullRequestTemplateKey, pullRequestTemplateCandidates) diff --git a/routers/web/repo/contributors.go b/routers/web/repo/contributors.go index 094d13b54b..762fbf9379 100644 --- a/routers/web/repo/contributors.go +++ b/routers/web/repo/contributors.go @@ -7,9 +7,9 @@ import ( "errors" "net/http" - "forgejo.org/modules/base" - "forgejo.org/services/context" - contributors_service "forgejo.org/services/repository" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" + contributors_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/repo/download.go b/routers/web/repo/download.go index 50ad85735b..b55d8d5046 100644 --- a/routers/web/repo/download.go +++ b/routers/web/repo/download.go @@ -5,18 +5,19 @@ package repo import ( + "path" "time" - git_model "forgejo.org/models/git" - "forgejo.org/modules/annex" - "forgejo.org/modules/git" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/routers/common" - "forgejo.org/services/context" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/modules/annex" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" ) // ServeBlobOrLFS download a git.Blob redirecting to LFS if necessary @@ -54,8 +55,8 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim } if setting.LFS.Storage.MinioConfig.ServeDirect { - // If we have a signed url (S3, object storage, blob storage), redirect to this directly. - u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name(), nil) + // If we have a signed url (S3, object storage), redirect to this directly. + u, err := storage.LFS.URL(pointer.RelativePath(), blob.Name()) if u != nil && err == nil { ctx.Redirect(u.String()) return nil @@ -102,7 +103,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob, lastModified *time.Tim return common.ServeBlob(ctx.Base, ctx.Repo.TreePath, blob, lastModified) } -func getBlobForEntry(ctx *context.Context) (*git.Blob, *time.Time) { +func getBlobForEntry(ctx *context.Context) (blob *git.Blob, lastModified *time.Time) { entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) if err != nil { if git.IsErrNotExist(err) { @@ -118,14 +119,19 @@ func getBlobForEntry(ctx *context.Context) (*git.Blob, *time.Time) { return nil, nil } - latestCommit, err := ctx.Repo.GitRepo.GetTreePathLatestCommit(ctx.Repo.Commit.ID.String(), ctx.Repo.TreePath) + info, _, err := git.Entries([]*git.TreeEntry{entry}).GetCommitsInfo(ctx, ctx.Repo.Commit, path.Dir("/" + ctx.Repo.TreePath)[1:]) if err != nil { - ctx.ServerError("GetTreePathLatestCommit", err) + ctx.ServerError("GetCommitsInfo", err) return nil, nil } - lastModified := &latestCommit.Committer.When - return entry.Blob(), lastModified + if len(info) == 1 { + // Not Modified + lastModified = &info[0].Commit.Committer.When + } + blob = entry.Blob() + + return blob, lastModified } // SingleDownload download a file by repos path diff --git a/routers/web/repo/editor.go b/routers/web/repo/editor.go index 5114cc9c05..00c3d880a9 100644 --- a/routers/web/repo/editor.go +++ b/routers/web/repo/editor.go @@ -10,26 +10,26 @@ import ( "path" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/utils" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/forms" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + 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/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/utils" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/forms" + files_service "code.gitea.io/gitea/services/repository/files" ) const ( @@ -211,7 +211,6 @@ func editFile(ctx *context.Context, isNewFile bool) { ctx.Data["TreeNames"] = treeNames ctx.Data["TreePaths"] = treePaths ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL() - ctx.Data["BranchPath"] = ctx.Repo.BranchNameSubURL() ctx.Data["commit_summary"] = "" ctx.Data["commit_message"] = "" if canCommit { @@ -585,7 +584,7 @@ func DeleteFilePost(ctx *context.Context) { ctx.Error(http.StatusInternalServerError, err.Error()) } } else if models.IsErrCommitIDDoesNotMatch(err) || git.IsErrPushOutOfDate(err) { - ctx.RenderWithErr(ctx.Tr("repo.editor.file_changed_while_editing", ctx.Repo.RepoLink+"/compare/"+util.PathEscapeSegments(form.LastCommit)+"..."+util.PathEscapeSegments(ctx.Repo.CommitID)), tplDeleteFile, &form) + ctx.RenderWithErr(ctx.Tr("repo.editor.file_changed_while_deleting", ctx.Repo.RepoLink+"/compare/"+util.PathEscapeSegments(form.LastCommit)+"..."+util.PathEscapeSegments(ctx.Repo.CommitID)), tplDeleteFile, &form) } else if git.IsErrPushRejected(err) { errPushRej := err.(*git.ErrPushRejected) if len(errPushRej.Message) == 0 { diff --git a/routers/web/repo/editor_test.go b/routers/web/repo/editor_test.go index 5b893cf258..4d565b5fd6 100644 --- a/routers/web/repo/editor_test.go +++ b/routers/web/repo/editor_test.go @@ -6,11 +6,11 @@ package repo import ( "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/services/contexttest" + 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/gitrepo" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/repo/find.go b/routers/web/repo/find.go index 808323631c..9da4237c1e 100644 --- a/routers/web/repo/find.go +++ b/routers/web/repo/find.go @@ -6,9 +6,9 @@ package repo import ( "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/flags/manage.go b/routers/web/repo/flags/manage.go index c97ef54818..377a5c20f8 100644 --- a/routers/web/repo/flags/manage.go +++ b/routers/web/repo/flags/manage.go @@ -6,10 +6,10 @@ package flags import ( "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go index ada9d350c9..cee3c6d471 100644 --- a/routers/web/repo/githttp.go +++ b/routers/web/repo/githttp.go @@ -19,20 +19,20 @@ import ( "sync" "time" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + "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/modules/git" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" "github.com/go-chi/cors" ) @@ -79,7 +79,24 @@ func httpBase(ctx *context.Context) *serviceHandler { strings.HasSuffix(ctx.Req.URL.Path, "git-upload-archive") { isPull = true } else { - isPull = ctx.Req.Method == "GET" || ctx.Req.Method == "HEAD" + // In addition to GET requests, HEAD requests are also "pull" + // operations (reads), so they should also not require + // authentication. This is necessary for git-annex to operate + // properly, as it emits HEAD requests to check for the + // existence of keys, e.g. before dropping locally, and asking + // for authentication would break unauthenticated http usage in + // this situation. + // It should be safe to make all HEAD requests require no + // authentication, but as it is only necessary for the + // annex/objects endpoints to fix git-annex' drop operations it + // is limited to those for now. + r, err := regexp.Compile("^/?" + username + "/" + reponame + "(.git)?/annex/objects") + if err != nil { + ctx.ServerError("failed to create URL path regex", err) + return nil + } + isPull = ctx.Req.Method == "GET" || + r.MatchString(ctx.Req.URL.Path) && ctx.Req.Method == "HEAD" } var accessMode perm.AccessMode @@ -243,9 +260,8 @@ func httpBase(ctx *context.Context) *serviceHandler { } } - isRequestToConfig := strings.HasSuffix(ctx.Req.URL.Path, "/config") if !repoExist { - if !receivePack && !isRequestToConfig { + if !receivePack { ctx.PlainText(http.StatusNotFound, "Repository not found") return nil } @@ -265,7 +281,7 @@ func httpBase(ctx *context.Context) *serviceHandler { } // Return dummy payload if GET receive-pack - if ctx.Req.Method == http.MethodGet && !isRequestToConfig { + if ctx.Req.Method == http.MethodGet { dummyInfoRefs(ctx) return nil } @@ -469,7 +485,7 @@ func serviceRPC(ctx *context.Context, h *serviceHandler, service string) { Stderr: &stderr, UseContextTimeout: true, }); err != nil { - if !git.IsErrCanceledOrKilled(err) { + if err.Error() != "signal: killed" { log.Error("Fail to serve RPC(%s) in %s: %v - %s", service, h.getRepoDir(), err, stderr.String()) } return @@ -552,21 +568,6 @@ func GetConfig(ctx *context.Context) { h := httpBase(ctx) if h != nil { setHeaderNoCache(ctx) - if setting.Annex.Enabled && strings.HasPrefix(ctx.Req.UserAgent(), "git-annex/") { - p, err := access_model.GetUserRepoPermission(ctx, h.repo, ctx.Doer) - if err != nil { - ctx.ServerError("GetUserRepoPermission", err) - return - } - - if p.CanAccess(perm.AccessModeWrite, unit.TypeCode) { - _, _, err := git.NewCommand(ctx, "annex", "init").RunStdString(&git.RunOpts{Dir: h.getRepoDir()}) - if err != nil { - ctx.Resp.WriteHeader(http.StatusInternalServerError) - return - } - } - } config, err := os.ReadFile(filepath.Join(h.getRepoDir(), "config")) if err != nil { log.Error("Failed to read git config file: %v", err) diff --git a/routers/web/repo/helper.go b/routers/web/repo/helper.go index 9d67f142fb..5e1e116018 100644 --- a/routers/web/repo/helper.go +++ b/routers/web/repo/helper.go @@ -5,21 +5,21 @@ package repo import ( "net/url" - "slices" + "sort" - "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/services/context" ) func MakeSelfOnTop(doer *user.User, users []*user.User) []*user.User { if doer != nil { - doerIndex := slices.IndexFunc(users, func(user *user.User) bool { - return user.ID == doer.ID + sort.Slice(users, func(i, j int) bool { + if users[i].ID == users[j].ID { + return false + } + return users[i].ID == doer.ID // if users[i] is self, put it before others, so less=true }) - if doerIndex != -1 { - return slices.Insert(slices.Delete(users, doerIndex, doerIndex+1), 0, doer) - } } return users } diff --git a/routers/web/repo/helper_test.go b/routers/web/repo/helper_test.go index 2607fd32f8..978758e77f 100644 --- a/routers/web/repo/helper_test.go +++ b/routers/web/repo/helper_test.go @@ -6,7 +6,7 @@ package repo import ( "testing" - "forgejo.org/models/user" + "code.gitea.io/gitea/models/user" "github.com/stretchr/testify/assert" ) @@ -23,15 +23,4 @@ func TestMakeSelfOnTop(t *testing.T) { users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 2}, {ID: 1}}) assert.Len(t, users, 2) assert.EqualValues(t, 2, users[0].ID) - - users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 1}}) - assert.Len(t, users, 1) - assert.EqualValues(t, 1, users[0].ID) - - users = MakeSelfOnTop(&user.User{ID: 2}, []*user.User{{ID: 1}, {ID: 2}, {ID: 3}, {ID: 4}}) - assert.Len(t, users, 4) - assert.EqualValues(t, 2, users[0].ID) - assert.EqualValues(t, 1, users[1].ID) - assert.EqualValues(t, 3, users[2].ID) - assert.EqualValues(t, 4, users[3].ID) } diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index ff3a903aed..5d13ccc97c 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1,6 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. // Copyright 2018 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package repo @@ -20,46 +19,46 @@ import ( "strings" "time" - activities_model "forgejo.org/models/activities" - "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" - pull_model "forgejo.org/models/pull" - 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/emoji" - "forgejo.org/modules/git" - issue_indexer "forgejo.org/modules/indexer/issues" - issue_template "forgejo.org/modules/issue/template" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/templates" - "forgejo.org/modules/templates/vars" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" + activities_model "code.gitea.io/gitea/models/activities" + "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" + pull_model "code.gitea.io/gitea/models/pull" + 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/emoji" + "code.gitea.io/gitea/modules/git" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + issue_template "code.gitea.io/gitea/modules/issue/template" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/templates/vars" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) const ( @@ -204,6 +203,8 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt keyword = "" } + isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) + var mileIDs []int64 if milestoneID > 0 || milestoneID == db.NoConditionID { // -1 to get those issues which have no any milestone assigned mileIDs = []int64{milestoneID} @@ -224,7 +225,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt IssueIDs: nil, } if keyword != "" { - allIssueIDs, err := issueIDsFromSearch(ctx, keyword, statsOpts) + allIssueIDs, err := issueIDsFromSearch(ctx, keyword, isFuzzy, statsOpts) if err != nil { if issue_indexer.IsAvailable(ctx) { ctx.ServerError("issueIDsFromSearch", err) @@ -292,7 +293,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt var issues issues_model.IssueList { - ids, err := issueIDsFromSearch(ctx, keyword, &issues_model.IssuesOptions{ + ids, err := issueIDsFromSearch(ctx, keyword, isFuzzy, &issues_model.IssuesOptions{ Paginator: &db.ListOptions{ Page: pager.Paginater.Current(), PageSize: setting.UI.IssuePagingNum, @@ -455,15 +456,14 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt ctx.Data["IssueStats"] = issueStats ctx.Data["OpenCount"] = issueStats.OpenCount ctx.Data["ClosedCount"] = issueStats.ClosedCount - ctx.Data["AllCount"] = issueStats.AllCount - linkStr := "?q=%s&type=%s&sort=%s&state=%s&labels=%s&milestone=%d&project=%d&assignee=%d&poster=%d&archived=%t" - ctx.Data["AllStatesLink"] = fmt.Sprintf(linkStr, + linkStr := "%s?q=%s&type=%s&sort=%s&state=%s&labels=%s&milestone=%d&project=%d&assignee=%d&poster=%d&archived=%t" + ctx.Data["AllStatesLink"] = fmt.Sprintf(linkStr, ctx.Link, url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "all", url.QueryEscape(selectLabels), milestoneID, projectID, assigneeID, posterID, archived) - ctx.Data["OpenLink"] = fmt.Sprintf(linkStr, + ctx.Data["OpenLink"] = fmt.Sprintf(linkStr, ctx.Link, url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "open", url.QueryEscape(selectLabels), milestoneID, projectID, assigneeID, posterID, archived) - ctx.Data["ClosedLink"] = fmt.Sprintf(linkStr, + ctx.Data["ClosedLink"] = fmt.Sprintf(linkStr, ctx.Link, url.QueryEscape(keyword), url.QueryEscape(viewType), url.QueryEscape(sortType), "closed", url.QueryEscape(selectLabels), milestoneID, projectID, assigneeID, posterID, archived) ctx.Data["SelLabelIDs"] = labelIDs @@ -474,6 +474,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt ctx.Data["ProjectID"] = projectID ctx.Data["AssigneeID"] = assigneeID ctx.Data["PosterID"] = posterID + ctx.Data["IsFuzzy"] = isFuzzy ctx.Data["Keyword"] = keyword ctx.Data["IsShowClosed"] = isShowClosed switch { @@ -496,12 +497,17 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt pager.AddParam(ctx, "assignee", "AssigneeID") pager.AddParam(ctx, "poster", "PosterID") pager.AddParam(ctx, "archived", "ShowArchivedLabels") + pager.AddParam(ctx, "fuzzy", "IsFuzzy") ctx.Data["Page"] = pager } -func issueIDsFromSearch(ctx *context.Context, keyword string, opts *issues_model.IssuesOptions) ([]int64, error) { - ids, _, err := issue_indexer.SearchIssues(ctx, issue_indexer.ToSearchOptions(keyword, opts)) +func issueIDsFromSearch(ctx *context.Context, keyword string, fuzzy bool, opts *issues_model.IssuesOptions) ([]int64, error) { + ids, _, err := issue_indexer.SearchIssues(ctx, issue_indexer.ToSearchOptions(keyword, opts).Copy( + func(o *issue_indexer.SearchOptions) { + o.IsFuzzyKeyword = fuzzy + }, + )) if err != nil { return nil, fmt.Errorf("SearchIssues: %w", err) } @@ -1260,11 +1266,7 @@ func NewIssuePost(ctx *context.Context) { if err := issue_service.NewIssue(ctx, repo, issue, labelIDs, attachments, assigneeIDs); err != nil { if errors.Is(err, user_model.ErrBlockedByUser) { - if issue.IsPull { - ctx.JSONError(ctx.Tr("repo.pulls.blocked_by_user")) - } else { - ctx.JSONError(ctx.Tr("repo.issues.blocked_by_user")) - } + ctx.JSONError(ctx.Tr("repo.issues.blocked_by_user")) return } else if repo_model.IsErrUserDoesNotHaveAccessToRepo(err) { ctx.Error(http.StatusBadRequest, "UserDoesNotHaveAccessToRepo", err.Error()) @@ -1288,41 +1290,28 @@ func NewIssuePost(ctx *context.Context) { log.Trace("Issue created: %d/%d", repo.ID, issue.ID) if ctx.FormString("redirect_after_creation") == "project" && projectID > 0 { - project, err := project_model.GetProjectByID(ctx, projectID) - if err == nil { - if project.Type == project_model.TypeOrganization { - ctx.JSONRedirect(project_model.ProjectLinkForOrg(ctx.Repo.Owner, project.ID)) - } else { - ctx.JSONRedirect(project_model.ProjectLinkForRepo(repo, project.ID)) - } - return - } + ctx.JSONRedirect(ctx.Repo.RepoLink + "/projects/" + strconv.FormatInt(projectID, 10)) + } else { + ctx.JSONRedirect(issue.Link()) } - ctx.JSONRedirect(issue.Link()) } // roleDescriptor returns the role descriptor for a comment in/with the given repo, poster and issue func roleDescriptor(ctx stdCtx.Context, repo *repo_model.Repository, poster *user_model.User, issue *issues_model.Issue, hasOriginalAuthor bool) (issues_model.RoleDescriptor, error) { roleDescriptor := issues_model.RoleDescriptor{} - // Migrated comment with no associated local user if hasOriginalAuthor { return roleDescriptor, nil } - // Special user that can't have associated contributions and permissions in the repo. - if poster.IsGhost() || poster.IsActions() || poster.IsAPActor() { - return roleDescriptor, nil - } - - // If the poster is the actual poster of the issue, enable Poster role. - roleDescriptor.IsPoster = issue.IsPoster(poster.ID) - perm, err := access_model.GetUserRepoPermission(ctx, repo, poster) if err != nil { return roleDescriptor, err } + // If the poster is the actual poster of the issue, enable Poster role. + roleDescriptor.IsPoster = issue.IsPoster(poster.ID) + // Check if the poster is owner of the repo. if perm.IsOwner() { // If the poster isn't an admin, enable the owner role. @@ -1834,7 +1823,7 @@ func ViewIssue(ctx *context.Context) { ctx.Data["LatestCloseCommentID"] = latestCloseCommentID // Combine multiple label assignments into a single comment - issues_model.CombineCommentsHistory(issue, time.Now().Unix()) + combineLabelComments(issue) getBranchData(ctx, issue) if issue.IsPull { @@ -1921,21 +1910,6 @@ func ViewIssue(ctx *context.Context) { ctx.Data["MergeStyle"] = mergeStyle - var updateStyle repo_model.UpdateStyle - // Check correct values and select default - if ms, ok := ctx.Data["UpdateStyle"].(repo_model.UpdateStyle); !ok || - !prConfig.IsUpdateStyleAllowed(ms) { - defaultUpdateStyle := prConfig.GetDefaultUpdateStyle() - if prConfig.IsUpdateStyleAllowed(defaultUpdateStyle) && !ok { - updateStyle = defaultUpdateStyle - } else if prConfig.AllowMerge { - updateStyle = repo_model.UpdateStyleMerge - } else if prConfig.AllowRebase { - updateStyle = repo_model.UpdateStyleRebase - } - } - ctx.Data["UpdateStyle"] = updateStyle - defaultMergeMessage, defaultMergeBody, err := pull_service.GetDefaultMergeMessage(ctx, ctx.Repo.GitRepo, pull, mergeStyle) if err != nil { ctx.ServerError("GetDefaultMergeMessage", err) @@ -2079,12 +2053,6 @@ func ViewIssue(ctx *context.Context) { ctx.Data["RefEndName"] = git.RefName(issue.Ref).ShortName() ctx.Data["NewPinAllowed"] = pinAllowed ctx.Data["PinEnabled"] = setting.Repository.Issue.MaxPinned != 0 - ctx.Data["OpenGraphTitle"] = issue.Title - ctx.Data["OpenGraphURL"] = issue.HTMLURL() - ctx.Data["OpenGraphDescription"] = issue.Content - ctx.Data["OpenGraphImageURL"] = issue.SummaryCardURL() - ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.issues.summary_card_alt", issue.Title, issue.Repo.FullName()) - ctx.Data["IsBlocked"] = ctx.Doer != nil && user_model.IsBlockedMultiple(ctx, []int64{issue.PosterID, issue.Repo.OwnerID}, ctx.Doer.ID) prepareHiddenCommentType(ctx) if ctx.Written() { @@ -3203,15 +3171,6 @@ func NewComment(ctx *context.Context) { } else { isClosed := form.Status == "close" if err := issue_service.ChangeStatus(ctx, issue, ctx.Doer, "", isClosed); err != nil { - if errors.Is(err, user_model.ErrBlockedByUser) { - if issue.IsPull { - ctx.JSONError(ctx.Tr("repo.pulls.blocked_by_user")) - } else { - ctx.JSONError(ctx.Tr("repo.issues.blocked_by_user")) - } - return - } - log.Error("ChangeStatus: %v", err) if issues_model.IsErrDependenciesLeft(err) { @@ -3253,11 +3212,7 @@ func NewComment(ctx *context.Context) { comment, err := issue_service.CreateIssueComment(ctx, ctx.Doer, ctx.Repo.Repository, issue, form.Content, attachments) if err != nil { if errors.Is(err, user_model.ErrBlockedByUser) { - if issue.IsPull { - ctx.JSONError(ctx.Tr("repo.pulls.comment.blocked_by_user")) - } else { - ctx.JSONError(ctx.Tr("repo.issues.comment.blocked_by_user")) - } + ctx.JSONError(ctx.Tr("repo.issues.comment.blocked_by_user")) } else { ctx.ServerError("CreateIssueComment", err) } @@ -3709,6 +3664,73 @@ func attachmentsHTML(ctx *context.Context, attachments []*repo_model.Attachment, return attachHTML } +// combineLabelComments combine the nearby label comments as one. +func combineLabelComments(issue *issues_model.Issue) { + var prev, cur *issues_model.Comment + for i := 0; i < len(issue.Comments); i++ { + cur = issue.Comments[i] + if i > 0 { + prev = issue.Comments[i-1] + } + if i == 0 || cur.Type != issues_model.CommentTypeLabel || + (prev != nil && prev.PosterID != cur.PosterID) || + (prev != nil && cur.CreatedUnix-prev.CreatedUnix >= 60) { + if cur.Type == issues_model.CommentTypeLabel && cur.Label != nil { + if cur.Content != "1" { + cur.RemovedLabels = append(cur.RemovedLabels, cur.Label) + } else { + cur.AddedLabels = append(cur.AddedLabels, cur.Label) + } + } + continue + } + + if cur.Label != nil { // now cur MUST be label comment + if prev.Type == issues_model.CommentTypeLabel { // we can combine them only prev is a label comment + if cur.Content != "1" { + // remove labels from the AddedLabels list if the label that was removed is already + // in this list, and if it's not in this list, add the label to RemovedLabels + addedAndRemoved := false + for i, label := range prev.AddedLabels { + if cur.Label.ID == label.ID { + prev.AddedLabels = append(prev.AddedLabels[:i], prev.AddedLabels[i+1:]...) + addedAndRemoved = true + break + } + } + if !addedAndRemoved { + prev.RemovedLabels = append(prev.RemovedLabels, cur.Label) + } + } else { + // remove labels from the RemovedLabels list if the label that was added is already + // in this list, and if it's not in this list, add the label to AddedLabels + removedAndAdded := false + for i, label := range prev.RemovedLabels { + if cur.Label.ID == label.ID { + prev.RemovedLabels = append(prev.RemovedLabels[:i], prev.RemovedLabels[i+1:]...) + removedAndAdded = true + break + } + } + if !removedAndAdded { + prev.AddedLabels = append(prev.AddedLabels, cur.Label) + } + } + prev.CreatedUnix = cur.CreatedUnix + // remove the current comment since it has been combined to prev comment + issue.Comments = append(issue.Comments[:i], issue.Comments[i+1:]...) + i-- + } else { // if prev is not a label comment, start a new group + if cur.Content != "1" { + cur.RemovedLabels = append(cur.RemovedLabels, cur.Label) + } else { + cur.AddedLabels = append(cur.AddedLabels, cur.Label) + } + } + } + } +} + // get all teams that current user can mention func handleTeamMentions(ctx *context.Context) { if ctx.Doer == nil || !ctx.Repo.Owner.IsOrganization() { diff --git a/routers/web/repo/issue_content_history.go b/routers/web/repo/issue_content_history.go index 5c71d75f80..16b250abda 100644 --- a/routers/web/repo/issue_content_history.go +++ b/routers/web/repo/issue_content_history.go @@ -9,12 +9,13 @@ import ( "net/http" "strings" - "forgejo.org/models/avatars" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/avatars" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/services/context" "github.com/sergi/go-diff/diffmatchpatch" ) @@ -72,10 +73,10 @@ func GetContentHistoryList(ctx *context.Context) { class := avatars.DefaultAvatarClass + " tw-mr-2" name := html.EscapeString(username) avatarHTML := string(templates.AvatarHTML(src, 28, class, username)) - timeSinceHTML := string(templates.TimeSince(item.EditedUnix)) + timeSinceText := string(timeutil.TimeSinceUnix(item.EditedUnix, ctx.Locale)) results = append(results, map[string]any{ - "name": avatarHTML + "" + name + " " + actionText + " " + timeSinceHTML, + "name": avatarHTML + "" + name + " " + actionText + " " + timeSinceText, "value": item.HistoryID, }) } diff --git a/routers/web/repo/issue_dependency.go b/routers/web/repo/issue_dependency.go index 3764a6bd7e..66b38688ec 100644 --- a/routers/web/repo/issue_dependency.go +++ b/routers/web/repo/issue_dependency.go @@ -6,10 +6,10 @@ package repo import ( "net/http" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + issues_model "code.gitea.io/gitea/models/issues" + access_model "code.gitea.io/gitea/models/perm/access" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // AddDependency adds new dependencies diff --git a/routers/web/repo/issue_label.go b/routers/web/repo/issue_label.go index 74674e9550..81bee4dbb5 100644 --- a/routers/web/repo/issue_label.go +++ b/routers/web/repo/issue_label.go @@ -6,17 +6,17 @@ package repo import ( "net/http" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - "forgejo.org/modules/base" - "forgejo.org/modules/label" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - issue_service "forgejo.org/services/issue" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/label" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + issue_service "code.gitea.io/gitea/services/issue" ) const ( diff --git a/routers/web/repo/issue_label_test.go b/routers/web/repo/issue_label_test.go index 406ab4918c..2b4915e855 100644 --- a/routers/web/repo/issue_label_test.go +++ b/routers/web/repo/issue_label_test.go @@ -8,13 +8,13 @@ import ( "strconv" "testing" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - "forgejo.org/modules/repository" - "forgejo.org/modules/test" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/routers/web/repo/issue_lock.go b/routers/web/repo/issue_lock.go index dea67ab996..1d5fc8a5f3 100644 --- a/routers/web/repo/issue_lock.go +++ b/routers/web/repo/issue_lock.go @@ -4,10 +4,10 @@ package repo import ( - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // LockIssue locks an issue. This would limit commenting abilities to diff --git a/routers/web/repo/issue_pin.go b/routers/web/repo/issue_pin.go index 5e2075a17f..365c812681 100644 --- a/routers/web/repo/issue_pin.go +++ b/routers/web/repo/issue_pin.go @@ -6,10 +6,10 @@ package repo import ( "net/http" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/services/context" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) // IssuePinOrUnpin pin or unpin a Issue diff --git a/routers/web/repo/issue_stopwatch.go b/routers/web/repo/issue_stopwatch.go index 5bc49464dd..70d42b27c0 100644 --- a/routers/web/repo/issue_stopwatch.go +++ b/routers/web/repo/issue_stopwatch.go @@ -7,10 +7,10 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/eventsource" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/eventsource" + "code.gitea.io/gitea/services/context" ) // IssueStopwatch creates or stops a stopwatch for the given issue. diff --git a/routers/web/repo/issue_test.go b/routers/web/repo/issue_test.go new file mode 100644 index 0000000000..f1d0aac72f --- /dev/null +++ b/routers/web/repo/issue_test.go @@ -0,0 +1,375 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repo + +import ( + "testing" + + issues_model "code.gitea.io/gitea/models/issues" + + "github.com/stretchr/testify/assert" +) + +func TestCombineLabelComments(t *testing.T) { + kases := []struct { + name string + beforeCombined []*issues_model.Comment + afterCombined []*issues_model.Comment + }{ + { + name: "kase 1", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + CreatedUnix: 0, + AddedLabels: []*issues_model.Label{}, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + }, + { + name: "kase 2", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 70, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + CreatedUnix: 0, + AddedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + CreatedUnix: 70, + RemovedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + }, + { + name: "kase 3", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 2, + Content: "", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + CreatedUnix: 0, + AddedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 2, + Content: "", + CreatedUnix: 0, + RemovedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + }, + { + name: "kase 4", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/backport", + }, + CreatedUnix: 10, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + CreatedUnix: 10, + AddedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + { + Name: "kind/backport", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + }, + }, + }, + { + name: "kase 5", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 2, + Content: "testtest", + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + AddedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 2, + Content: "testtest", + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + RemovedLabels: []*issues_model.Label{ + { + Name: "kind/bug", + }, + }, + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + }, + }, + { + name: "kase 6", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "reviewed/confirmed", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/feature", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeLabel, + PosterID: 1, + Content: "1", + Label: &issues_model.Label{ + Name: "kind/bug", + }, + AddedLabels: []*issues_model.Label{ + { + Name: "reviewed/confirmed", + }, + { + Name: "kind/feature", + }, + }, + CreatedUnix: 0, + }, + }, + }, + } + + for _, kase := range kases { + t.Run(kase.name, func(t *testing.T) { + issue := issues_model.Issue{ + Comments: kase.beforeCombined, + } + combineLabelComments(&issue) + assert.EqualValues(t, kase.afterCombined, issue.Comments) + }) + } +} diff --git a/routers/web/repo/issue_timetrack.go b/routers/web/repo/issue_timetrack.go index e63f7e2dc2..241e434049 100644 --- a/routers/web/repo/issue_timetrack.go +++ b/routers/web/repo/issue_timetrack.go @@ -7,12 +7,12 @@ import ( "net/http" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // AddTimeManually tracks time manually diff --git a/routers/web/repo/issue_watch.go b/routers/web/repo/issue_watch.go index 5af223f865..5cff9f4ddd 100644 --- a/routers/web/repo/issue_watch.go +++ b/routers/web/repo/issue_watch.go @@ -7,10 +7,10 @@ import ( "net/http" "strconv" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/services/context" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/main_test.go b/routers/web/repo/main_test.go index 8b30ad41ed..6e469cf2ed 100644 --- a/routers/web/repo/main_test.go +++ b/routers/web/repo/main_test.go @@ -6,7 +6,7 @@ package repo import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/repo/middlewares.go b/routers/web/repo/middlewares.go index 9aba447433..ddda9f3ff2 100644 --- a/routers/web/repo/middlewares.go +++ b/routers/web/repo/middlewares.go @@ -7,12 +7,12 @@ import ( "fmt" "strconv" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/optional" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) // SetEditorconfigIfExists set editor config as render variable diff --git a/routers/web/repo/migrate.go b/routers/web/repo/migrate.go index 86d2461e94..0acf966bca 100644 --- a/routers/web/repo/migrate.go +++ b/routers/web/repo/migrate.go @@ -9,23 +9,23 @@ import ( "net/url" "strings" - "forgejo.org/models" - admin_model "forgejo.org/models/admin" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/migrations" - "forgejo.org/services/task" + "code.gitea.io/gitea/models" + admin_model "code.gitea.io/gitea/models/admin" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/migrations" + "code.gitea.io/gitea/services/task" ) const ( diff --git a/routers/web/repo/milestone.go b/routers/web/repo/milestone.go index 920a9ee12a..1c53f73fdb 100644 --- a/routers/web/repo/milestone.go +++ b/routers/web/repo/milestone.go @@ -9,18 +9,18 @@ import ( "net/url" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/base" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/issue" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/issue" "xorm.io/builder" ) diff --git a/routers/web/repo/packages.go b/routers/web/repo/packages.go index c947fb99bf..11874ab0d0 100644 --- a/routers/web/repo/packages.go +++ b/routers/web/repo/packages.go @@ -6,13 +6,13 @@ package repo import ( "net/http" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/patch.go b/routers/web/repo/patch.go index 688ef19375..d234f6c964 100644 --- a/routers/web/repo/patch.go +++ b/routers/web/repo/patch.go @@ -6,16 +6,16 @@ package repo import ( "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/repository/files" ) const ( diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index 80f699787c..878b7ee699 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -9,22 +9,22 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/perm" - project_model "forgejo.org/models/project" - attachment_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/json" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/perm" + project_model "code.gitea.io/gitea/models/project" + attachment_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( @@ -125,19 +125,6 @@ func Projects(ctx *context.Context) { ctx.Data["IsProjectsPage"] = true ctx.Data["SortType"] = sortType - numOpenIssues, err := issues_model.NumIssuesInProjects(ctx, projects, ctx.Doer, ctx.Org.Organization, optional.Some(false)) - if err != nil { - ctx.ServerError("NumIssuesInProjects", err) - return - } - numClosedIssues, err := issues_model.NumIssuesInProjects(ctx, projects, ctx.Doer, ctx.Org.Organization, optional.Some(true)) - if err != nil { - ctx.ServerError("NumIssuesInProjects", err) - return - } - ctx.Data["NumOpenIssuesInProject"] = numOpenIssues - ctx.Data["NumClosedIssuesInProject"] = numClosedIssues - ctx.HTML(http.StatusOK, tplProjects) } @@ -196,7 +183,7 @@ func ChangeProjectStatus(ctx *context.Context) { ctx.NotFoundOrServerError("ChangeProjectStatusByRepoIDAndID", project_model.IsErrProjectNotExist, err) return } - ctx.JSONRedirect(project_model.ProjectLinkForRepo(ctx.Repo.Repository, id)) + ctx.JSONRedirect(fmt.Sprintf("%s/projects/%d", ctx.Repo.RepoLink, id)) } // DeleteProject delete a project @@ -250,7 +237,7 @@ func RenderEditProject(ctx *context.Context) { ctx.Data["content"] = p.Description ctx.Data["card_type"] = p.CardType ctx.Data["redirect"] = ctx.FormString("redirect") - ctx.Data["CancelLink"] = project_model.ProjectLinkForRepo(ctx.Repo.Repository, p.ID) + ctx.Data["CancelLink"] = fmt.Sprintf("%s/projects/%d", ctx.Repo.Repository.Link(), p.ID) ctx.HTML(http.StatusOK, tplProjectsNew) } @@ -264,7 +251,7 @@ func EditProjectPost(ctx *context.Context) { ctx.Data["PageIsEditProjects"] = true ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(unit.TypeProjects) ctx.Data["CardTypes"] = project_model.GetCardConfig() - ctx.Data["CancelLink"] = project_model.ProjectLinkForRepo(ctx.Repo.Repository, projectID) + ctx.Data["CancelLink"] = fmt.Sprintf("%s/projects/%d", ctx.Repo.Repository.Link(), projectID) if ctx.HasError() { ctx.HTML(http.StatusOK, tplProjectsNew) @@ -323,7 +310,7 @@ func ViewProject(ctx *context.Context) { return } - issuesMap, err := issues_model.LoadIssuesFromColumnList(ctx, columns, ctx.Doer, nil, optional.None[bool]()) + issuesMap, err := issues_model.LoadIssuesFromColumnList(ctx, columns) if err != nil { ctx.ServerError("LoadIssuesOfColumns", err) return @@ -376,7 +363,6 @@ func ViewProject(ctx *context.Context) { return } - ctx.Data["Title"] = project.Title ctx.Data["IsProjectsPage"] = true ctx.Data["CanWriteProjects"] = ctx.Repo.Permission.CanWrite(unit.TypeProjects) ctx.Data["Project"] = project diff --git a/routers/web/repo/projects_test.go b/routers/web/repo/projects_test.go index bc8b747980..d61230a57e 100644 --- a/routers/web/repo/projects_test.go +++ b/routers/web/repo/projects_test.go @@ -6,8 +6,8 @@ package repo import ( "testing" - "forgejo.org/models/unittest" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index 6ba1bca181..14b03b9fa4 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -14,40 +14,41 @@ import ( "net/url" "strconv" "strings" + "time" - "forgejo.org/models" - activities_model "forgejo.org/models/activities" - "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" - pull_model "forgejo.org/models/pull" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/emoji" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - issue_template "forgejo.org/modules/issue/template" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/utils" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/automerge" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/forms" - "forgejo.org/services/gitdiff" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" + "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" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + access_model "code.gitea.io/gitea/models/perm/access" + pull_model "code.gitea.io/gitea/models/pull" + quota_model "code.gitea.io/gitea/models/quota" + 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/emoji" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + issue_template "code.gitea.io/gitea/modules/issue/template" + "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/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/utils" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/automerge" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/gitdiff" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" "github.com/gobwas/glob" ) @@ -613,12 +614,12 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C var headBranchSha string // HeadRepo may be missing if pull.HeadRepo != nil { - headGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pull.HeadRepo) + headGitRepo, err := gitrepo.OpenRepository(ctx, pull.HeadRepo) if err != nil { - ctx.ServerError("RepositoryFromContextOrOpen", err) + ctx.ServerError("OpenRepository", err) return nil } - defer closer.Close() + defer headGitRepo.Close() if pull.Flow == issues_model.PullRequestFlowGithub { headBranchExist = headGitRepo.IsBranchExist(pull.HeadBranch) @@ -726,7 +727,7 @@ func PrepareViewPullInfo(ctx *context.Context, issue *issues_model.Issue) *git.C ctx.Data["HeadBranchCommitID"] = headBranchSha ctx.Data["PullHeadCommitID"] = sha - if pull.HeadRepo == nil || !headBranchExist || (!pull.Issue.IsClosed && !pull.IsChecking() && (headBranchSha != sha)) { + if pull.HeadRepo == nil || !headBranchExist || (!pull.Issue.IsClosed && (headBranchSha != sha)) { ctx.Data["IsPullRequestBroken"] = true if pull.IsSameRepo() { ctx.Data["HeadTarget"] = pull.HeadBranch @@ -965,7 +966,6 @@ func viewPullFiles(ctx *context.Context, specifiedStartCommit, specifiedEndCommi MaxLineCharacters: setting.Git.MaxGitDiffLineCharacters, MaxFiles: maxFiles, WhitespaceBehavior: gitdiff.GetWhitespaceFlag(ctx.Data["WhitespaceBehavior"].(string)), - FileOnly: fileOnly, } if !willShowSpecifiedCommit { @@ -1206,6 +1206,8 @@ func UpdatePullRequest(ctx *context.Context) { return } + time.Sleep(1 * time.Second) + ctx.Flash.Success(ctx.Tr("repo.pulls.update_branch_success")) ctx.Redirect(issue.Link()) } @@ -1300,7 +1302,7 @@ func MergePullRequest(ctx *context.Context) { // delete all scheduled auto merges _ = pull_model.DeleteScheduledAutoMerge(ctx, pr.ID) // schedule auto merge - scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) + scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) if err != nil { ctx.ServerError("ScheduleAutoMerge", err) return diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index 18a5b872f1..e8a3c48d7f 100644 --- a/routers/web/repo/pull_review.go +++ b/routers/web/repo/pull_review.go @@ -8,17 +8,17 @@ import ( "fmt" "net/http" - issues_model "forgejo.org/models/issues" - pull_model "forgejo.org/models/pull" - "forgejo.org/modules/base" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/forms" - pull_service "forgejo.org/services/pull" + issues_model "code.gitea.io/gitea/models/issues" + pull_model "code.gitea.io/gitea/models/pull" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/forms" + pull_service "code.gitea.io/gitea/services/pull" ) const ( @@ -82,24 +82,6 @@ func CreateCodeComment(ctx *context.Context) { attachments = form.Files } - // If the reply is made to a comment that is part of a pending review, then - // this comment also should be seen as part of that pending review. Consider - // it to be a pending review by default, except when `single_review` was - // passed. - pendingReview := !form.SingleReview - if form.Reply > 0 { - r, err := issues_model.GetReviewByID(ctx, form.Reply) - if err != nil { - ctx.ServerError("GetReviewByID", err) - return - } - if r.IssueID != issue.ID { - ctx.NotFound("Review does not belong to pull request", nil) - return - } - pendingReview = r.Type == issues_model.ReviewTypePending - } - comment, err := pull_service.CreateCodeComment(ctx, ctx.Doer, ctx.Repo.GitRepo, @@ -107,7 +89,7 @@ func CreateCodeComment(ctx *context.Context) { signedLine, form.Content, form.TreePath, - pendingReview, + !form.SingleReview, form.Reply, form.LatestCommitID, attachments, diff --git a/routers/web/repo/pull_review_test.go b/routers/web/repo/pull_review_test.go index 14e6714a63..329e83fe4b 100644 --- a/routers/web/repo/pull_review_test.go +++ b/routers/web/repo/pull_review_test.go @@ -8,13 +8,13 @@ import ( "net/http/httptest" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - "forgejo.org/modules/templates" - "forgejo.org/services/context" - "forgejo.org/services/contexttest" - "forgejo.org/services/pull" + "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/templates" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/pull" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/routers/web/repo/recent_commits.go b/routers/web/repo/recent_commits.go index 6154de7377..c158fb30b6 100644 --- a/routers/web/repo/recent_commits.go +++ b/routers/web/repo/recent_commits.go @@ -7,9 +7,9 @@ import ( "errors" "net/http" - "forgejo.org/modules/base" - "forgejo.org/services/context" - contributors_service "forgejo.org/services/repository" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/services/context" + contributors_service "code.gitea.io/gitea/services/repository" ) const ( diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 024dd7b62d..2266debd6e 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -10,29 +10,29 @@ import ( "net/http" "strings" - "forgejo.org/models" - "forgejo.org/models/asymkey" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - 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/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/web/feed" - "forgejo.org/services/context" - "forgejo.org/services/context/upload" - "forgejo.org/services/forms" - releaseservice "forgejo.org/services/release" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/asymkey" + "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/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/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/context/upload" + "code.gitea.io/gitea/services/forms" + releaseservice "code.gitea.io/gitea/services/release" ) const ( @@ -168,10 +168,6 @@ func Releases(ctx *context.Context) { // Disable the showCreateNewBranch form in the dropdown on this page. ctx.Data["CanCreateBranch"] = false ctx.Data["HideBranchesInDropdown"] = true - ctx.Data["ShowReleaseSearch"] = true - - keyword := ctx.FormTrim("q") - ctx.Data["Keyword"] = keyword listOptions := db.ListOptions{ Page: ctx.FormInt("page"), @@ -192,7 +188,6 @@ func Releases(ctx *context.Context) { // only show draft releases for users who can write, read-only users shouldn't see draft releases. IncludeDrafts: writeAccess, RepoID: ctx.Repo.Repository.ID, - Keyword: keyword, }) if err != nil { ctx.ServerError("getReleaseInfos", err) @@ -263,10 +258,6 @@ func TagsList(ctx *context.Context) { ctx.Data["CanCreateBranch"] = false ctx.Data["HideBranchesInDropdown"] = true ctx.Data["CanCreateRelease"] = ctx.Repo.CanWrite(unit.TypeReleases) && !ctx.Repo.Repository.IsArchived - ctx.Data["ShowReleaseSearch"] = true - - keyword := ctx.FormTrim("q") - ctx.Data["Keyword"] = keyword listOptions := db.ListOptions{ Page: ctx.FormInt("page"), @@ -287,7 +278,6 @@ func TagsList(ctx *context.Context) { IncludeTags: true, HasSha1: optional.Some(true), RepoID: ctx.Repo.Repository.ID, - Keyword: keyword, } releases, err := db.Find[repo_model.Release](ctx, opts) @@ -365,7 +355,11 @@ func SingleRelease(ctx *context.Context) { addVerifyTagToContext(ctx) ctx.Data["PageIsSingleTag"] = release.IsTag - ctx.Data["Title"] = release.DisplayName() + if release.IsTag { + ctx.Data["Title"] = release.TagName + } else { + ctx.Data["Title"] = release.Title + } err = release.LoadArchiveDownloadCount(ctx) if err != nil { @@ -374,13 +368,6 @@ func SingleRelease(ctx *context.Context) { } ctx.Data["Releases"] = releases - - ctx.Data["OpenGraphTitle"] = fmt.Sprintf("%s - %s", release.DisplayName(), release.Repo.FullName()) - ctx.Data["OpenGraphDescription"] = base.EllipsisString(release.Note, 300) - ctx.Data["OpenGraphURL"] = release.HTMLURL() - ctx.Data["OpenGraphImageURL"] = release.SummaryCardURL() - ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.release.summary_card_alt", release.DisplayName(), release.Repo.FullName()) - ctx.HTML(http.StatusOK, tplReleasesList) } diff --git a/routers/web/repo/release_test.go b/routers/web/repo/release_test.go index 785b1fdf69..5c7b6e2e8f 100644 --- a/routers/web/repo/release_test.go +++ b/routers/web/repo/release_test.go @@ -6,13 +6,13 @@ package repo import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" + "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" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/routers/web/repo/render.go b/routers/web/repo/render.go index b31e2e203a..e64db03e20 100644 --- a/routers/web/repo/render.go +++ b/routers/web/repo/render.go @@ -9,13 +9,13 @@ import ( "net/http" "path" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) // RenderFile renders a file by repos path diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go index 53b3f34347..9562491440 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -12,32 +12,32 @@ import ( "slices" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - repo_service "forgejo.org/services/repository" - archiver_service "forgejo.org/services/repository/archiver" - commitstatus_service "forgejo.org/services/repository/commitstatus" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/organization" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + 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/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + repo_service "code.gitea.io/gitea/services/repository" + archiver_service "code.gitea.io/gitea/services/repository/archiver" + commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" ) const ( @@ -472,12 +472,7 @@ func RedirectDownload(ctx *context.Context) { // Download an archive of a repository func Download(ctx *context.Context) { uri := ctx.Params("*") - ext, tp, err := archiver_service.ParseFileName(uri) - if err != nil { - ctx.NotFound("ParseFileName", err) - return - } - aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, uri) if err != nil { if errors.Is(err, archiver_service.ErrUnknownArchiveFormat{}) { ctx.Error(http.StatusBadRequest, err.Error()) @@ -510,7 +505,7 @@ func download(ctx *context.Context, archiveName string, archiver *repo_model.Rep rPath := archiver.RelativePath() if setting.RepoArchive.Storage.MinioConfig.ServeDirect { // If we have a signed url (S3, object storage), redirect to this directly. - u, err := storage.RepoArchives.URL(rPath, downloadName, nil) + u, err := storage.RepoArchives.URL(rPath, downloadName) if u != nil && err == nil { if archiver.ReleaseID != 0 { err = repo_model.CountArchiveDownload(ctx, ctx.Repo.Repository.ID, archiver.ReleaseID, archiver.Type) @@ -552,12 +547,7 @@ func download(ctx *context.Context, archiveName string, archiver *repo_model.Rep // kind of drop it on the floor if this is the case. func InitiateDownload(ctx *context.Context) { uri := ctx.Params("*") - ext, tp, err := archiver_service.ParseFileName(uri) - if err != nil { - ctx.NotFound("ParseFileName", err) - return - } - aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, strings.TrimSuffix(uri, ext), tp) + aReq, err := archiver_service.NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, uri) if err != nil { ctx.ServerError("archiver_service.NewRequest", err) return diff --git a/routers/web/repo/search.go b/routers/web/repo/search.go index 1671378a3b..c4f9f9afd1 100644 --- a/routers/web/repo/search.go +++ b/routers/web/repo/search.go @@ -7,90 +7,27 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const tplSearch base.TplName = "repo/search" -type searchMode int - -const ( - ExactSearchMode searchMode = iota - UnionSearchMode - RegExpSearchMode -) - -func searchModeFromString(s string) searchMode { - switch s { - case "fuzzy", "union": - return UnionSearchMode - case "regexp": - return RegExpSearchMode - default: - return ExactSearchMode - } -} - -func (m searchMode) String() string { - switch m { - case ExactSearchMode: - return "exact" - case UnionSearchMode: - return "union" - case RegExpSearchMode: - return "regexp" - default: - panic("cannot happen") - } -} - -func (m searchMode) ToIndexer() code_indexer.SearchMode { - if m == ExactSearchMode { - return code_indexer.SearchModeExact - } - return code_indexer.SearchModeUnion -} - -func (m searchMode) ToGitGrep() git.GrepMode { - switch m { - case RegExpSearchMode: - return git.RegExpGrepMode - case UnionSearchMode: - return git.FixedAnyGrepMode - default: - return git.FixedGrepMode - } -} - // Search render repository search page func Search(ctx *context.Context) { language := ctx.FormTrim("l") keyword := ctx.FormTrim("q") - path := ctx.FormTrim("path") - mode := ExactSearchMode - if modeStr := ctx.FormString("mode"); len(modeStr) > 0 { - mode = searchModeFromString(modeStr) - } else if ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) { // for backward compatibility in links - mode = UnionSearchMode - } + isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) ctx.Data["Keyword"] = keyword ctx.Data["Language"] = language - ctx.Data["CodeSearchPath"] = path - ctx.Data["CodeSearchMode"] = mode.String() + ctx.Data["IsFuzzy"] = isFuzzy ctx.Data["PageIsViewCode"] = true - ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled - if setting.Indexer.RepoIndexerEnabled { - ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions - } else { - ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions - } if keyword == "" { ctx.HTML(http.StatusOK, tplSearch) @@ -108,11 +45,10 @@ func Search(ctx *context.Context) { if setting.Indexer.RepoIndexerEnabled { var err error total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{ - RepoIDs: []int64{ctx.Repo.Repository.ID}, - Keyword: keyword, - Mode: mode.ToIndexer(), - Language: language, - Filename: path, + RepoIDs: []int64{ctx.Repo.Repository.ID}, + Keyword: keyword, + IsKeywordFuzzy: isFuzzy, + Language: language, Paginator: &db.ListOptions{ Page: page, PageSize: setting.UI.RepoSearchPagingNum, @@ -130,9 +66,8 @@ func Search(ctx *context.Context) { } else { res, err := git.GrepSearch(ctx, ctx.Repo.GitRepo, keyword, git.GrepOptions{ ContextLineNumber: 1, + IsFuzzy: isFuzzy, RefName: ctx.Repo.RefName, - Filename: path, - Mode: mode.ToGitGrep(), }) if err != nil { ctx.ServerError("GrepSearch", err) @@ -150,13 +85,12 @@ func Search(ctx *context.Context) { // UpdatedUnix: not supported yet // Language: not supported yet // Color: not supported yet - Lines: code_indexer.HighlightSearchResultCode( - r.Filename, r.LineNumbers, r.HighlightedRanges, - strings.Join(r.LineCodes, "\n")), + Lines: code_indexer.HighlightSearchResultCode(r.Filename, r.LineNumbers, r.HighlightedRanges, strings.Join(r.LineCodes, "\n")), }) } } + ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled ctx.Data["Repo"] = ctx.Repo.Repository ctx.Data["SourcePath"] = ctx.Repo.Repository.Link() ctx.Data["SearchResults"] = searchResults diff --git a/routers/web/repo/setting/avatar.go b/routers/web/repo/setting/avatar.go index abbb12cacb..504f57cfc2 100644 --- a/routers/web/repo/setting/avatar.go +++ b/routers/web/repo/setting/avatar.go @@ -8,13 +8,13 @@ import ( "fmt" "io" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + repo_service "code.gitea.io/gitea/services/repository" ) // UpdateAvatarSetting update repo's avatar diff --git a/routers/web/repo/setting/collaboration.go b/routers/web/repo/setting/collaboration.go index a816a16bc8..75b55151e7 100644 --- a/routers/web/repo/setting/collaboration.go +++ b/routers/web/repo/setting/collaboration.go @@ -8,19 +8,19 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - "forgejo.org/services/mailer" - org_service "forgejo.org/services/org" - repo_service "forgejo.org/services/repository" + "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" + unit_model "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/mailer" + org_service "code.gitea.io/gitea/services/org" + repo_service "code.gitea.io/gitea/services/repository" ) // Collaboration render a repository's collaboration page diff --git a/routers/web/repo/setting/default_branch.go b/routers/web/repo/setting/default_branch.go index 1c6033f1e4..881d148afc 100644 --- a/routers/web/repo/setting/default_branch.go +++ b/routers/web/repo/setting/default_branch.go @@ -6,12 +6,12 @@ package setting import ( "net/http" - git_model "forgejo.org/models/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/routers/web/repo" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) // SetDefaultBranchPost set default branch diff --git a/routers/web/repo/setting/deploy_key.go b/routers/web/repo/setting/deploy_key.go index c59f0e90c2..abc3eb4af1 100644 --- a/routers/web/repo/setting/deploy_key.go +++ b/routers/web/repo/setting/deploy_key.go @@ -6,14 +6,14 @@ package setting import ( "net/http" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/forms" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // DeployKeys render the deploy keys list of a repository page diff --git a/routers/web/repo/setting/git_hooks.go b/routers/web/repo/setting/git_hooks.go index a50bce2a27..217a01c90c 100644 --- a/routers/web/repo/setting/git_hooks.go +++ b/routers/web/repo/setting/git_hooks.go @@ -6,8 +6,8 @@ package setting import ( "net/http" - "forgejo.org/modules/git" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/services/context" ) // GitHooks hooks of a repository diff --git a/routers/web/repo/setting/lfs.go b/routers/web/repo/setting/lfs.go index 2e9c34e8a7..7e3634375a 100644 --- a/routers/web/repo/setting/lfs.go +++ b/routers/web/repo/setting/lfs.go @@ -14,20 +14,20 @@ import ( "strconv" "strings" - git_model "forgejo.org/models/git" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/container" - "forgejo.org/modules/git" - "forgejo.org/modules/git/pipeline" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/services/context" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/git/pipeline" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/setting/main_test.go b/routers/web/repo/setting/main_test.go index 6b5a70ba08..c414b853e5 100644 --- a/routers/web/repo/setting/main_test.go +++ b/routers/web/repo/setting/main_test.go @@ -6,7 +6,7 @@ package setting import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/repo/setting/protected_branch.go b/routers/web/repo/setting/protected_branch.go index 18efbc37c4..b2f5798a26 100644 --- a/routers/web/repo/setting/protected_branch.go +++ b/routers/web/repo/setting/protected_branch.go @@ -11,17 +11,17 @@ import ( "strings" "time" - git_model "forgejo.org/models/git" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - "forgejo.org/modules/base" - "forgejo.org/modules/web" - "forgejo.org/routers/web/repo" - "forgejo.org/services/context" - "forgejo.org/services/forms" - pull_service "forgejo.org/services/pull" - "forgejo.org/services/repository" + 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/modules/base" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + pull_service "code.gitea.io/gitea/services/pull" + "code.gitea.io/gitea/services/repository" "github.com/gobwas/glob" ) diff --git a/routers/web/repo/setting/protected_tag.go b/routers/web/repo/setting/protected_tag.go index 5735149dfd..2c25b650b9 100644 --- a/routers/web/repo/setting/protected_tag.go +++ b/routers/web/repo/setting/protected_tag.go @@ -8,15 +8,15 @@ import ( "net/http" "strings" - git_model "forgejo.org/models/git" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + 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/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( diff --git a/routers/web/repo/setting/runners.go b/routers/web/repo/setting/runners.go index 32c8667825..a47d3b45e2 100644 --- a/routers/web/repo/setting/runners.go +++ b/routers/web/repo/setting/runners.go @@ -8,13 +8,13 @@ import ( "net/http" "net/url" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - actions_shared "forgejo.org/routers/web/shared/actions" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + actions_shared "code.gitea.io/gitea/routers/web/shared/actions" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -179,7 +179,7 @@ func RunnerDeletePost(ctx *context.Context) { ctx.ServerError("getRunnersCtx", err) return } - actions_shared.RunnerDeletePost(ctx, ctx.ParamsInt64(":runnerid"), rCtx.OwnerID, rCtx.RepoID, rCtx.RedirectLink, rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid"))) + actions_shared.RunnerDeletePost(ctx, ctx.ParamsInt64(":runnerid"), rCtx.RedirectLink, rCtx.RedirectLink+url.PathEscape(ctx.Params(":runnerid"))) } func RedirectToDefaultSetting(ctx *context.Context) { diff --git a/routers/web/repo/setting/secrets.go b/routers/web/repo/setting/secrets.go index 11c83e8bd6..d4d56bfc57 100644 --- a/routers/web/repo/setting/secrets.go +++ b/routers/web/repo/setting/secrets.go @@ -7,11 +7,11 @@ import ( "errors" "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - shared "forgejo.org/routers/web/shared/secrets" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + shared "code.gitea.io/gitea/routers/web/shared/secrets" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/repo/setting/setting.go b/routers/web/repo/setting/setting.go index 083cc4ae82..ce506eafb1 100644 --- a/routers/web/repo/setting/setting.go +++ b/routers/web/repo/setting/setting.go @@ -13,34 +13,34 @@ import ( "strings" "time" - "forgejo.org/models" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/models/organization" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/indexer/code" - "forgejo.org/modules/indexer/stats" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - actions_service "forgejo.org/services/actions" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/federation" - "forgejo.org/services/forms" - "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" - repo_service "forgejo.org/services/repository" - wiki_service "forgejo.org/services/wiki" + "code.gitea.io/gitea/models" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/indexer/stats" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/modules/web" + actions_service "code.gitea.io/gitea/services/actions" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/federation" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" + repo_service "code.gitea.io/gitea/services/repository" + wiki_service "code.gitea.io/gitea/services/wiki" ) const ( @@ -105,10 +105,6 @@ func Units(ctx *context.Context) { func UnitsPost(ctx *context.Context) { form := web.GetForm(ctx).(*forms.RepoUnitSettingForm) - if ctx.HasError() { - ctx.Redirect(ctx.Repo.Repository.Link() + "/settings/units") - return - } repo := ctx.Repo.Repository @@ -266,7 +262,6 @@ func UnitsPost(ctx *context.Context) { AllowRebaseUpdate: form.PullsAllowRebaseUpdate, DefaultDeleteBranchAfterMerge: form.DefaultDeleteBranchAfterMerge, DefaultMergeStyle: repo_model.MergeStyle(form.PullsDefaultMergeStyle), - DefaultUpdateStyle: repo_model.UpdateStyle(form.PullsDefaultUpdateStyle), DefaultAllowMaintainerEdit: form.DefaultAllowMaintainerEdit, }, }) @@ -655,7 +650,7 @@ func SettingsPost(ctx *context.Context) { address, err := forms.ParseRemoteAddr(form.PushMirrorAddress, form.PushMirrorUsername, form.PushMirrorPassword) if err == nil { - err = migrations.IsPushMirrorURLAllowed(address, ctx.Doer) + err = migrations.IsMigrateURLAllowed(address, ctx.Doer) } if err != nil { ctx.Data["Err_PushMirrorAddress"] = true diff --git a/routers/web/repo/setting/settings_test.go b/routers/web/repo/setting/settings_test.go index 6f05953bfb..0c8553faea 100644 --- a/routers/web/repo/setting/settings_test.go +++ b/routers/web/repo/setting/settings_test.go @@ -7,19 +7,19 @@ import ( "net/http" "testing" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" - repo_service "forgejo.org/services/repository" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" + repo_service "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/routers/web/repo/setting/variables.go b/routers/web/repo/setting/variables.go index a83d2dea6f..45b6c0f39a 100644 --- a/routers/web/repo/setting/variables.go +++ b/routers/web/repo/setting/variables.go @@ -7,11 +7,11 @@ import ( "errors" "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - shared "forgejo.org/routers/web/shared/actions" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + shared "code.gitea.io/gitea/routers/web/shared/actions" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -127,7 +127,7 @@ func VariableUpdate(ctx *context.Context) { return } - shared.UpdateVariable(ctx, vCtx.OwnerID, vCtx.RepoID, vCtx.RedirectLink) + shared.UpdateVariable(ctx, vCtx.RedirectLink) } func VariableDelete(ctx *context.Context) { @@ -136,5 +136,5 @@ func VariableDelete(ctx *context.Context) { ctx.ServerError("getVariablesCtx", err) return } - shared.DeleteVariable(ctx, vCtx.OwnerID, vCtx.RepoID, vCtx.RedirectLink) + shared.DeleteVariable(ctx, vCtx.RedirectLink) } diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go index 6d4d9e47e2..eee493e2c2 100644 --- a/routers/web/repo/setting/webhook.go +++ b/routers/web/repo/setting/webhook.go @@ -11,24 +11,24 @@ import ( "net/url" "path" - "forgejo.org/models/db" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/web/middleware" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/context" - "forgejo.org/services/convert" - "forgejo.org/services/forms" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/services/forms" + webhook_service "code.gitea.io/gitea/services/webhook" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) const ( diff --git a/routers/web/repo/topic.go b/routers/web/repo/topic.go index a028afb042..d81a695df9 100644 --- a/routers/web/repo/topic.go +++ b/routers/web/repo/topic.go @@ -7,9 +7,9 @@ import ( "net/http" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/services/context" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) // TopicsPost response for creating repository diff --git a/routers/web/repo/treelist.go b/routers/web/repo/treelist.go index 5c37f2ebca..d11af4669f 100644 --- a/routers/web/repo/treelist.go +++ b/routers/web/repo/treelist.go @@ -6,9 +6,9 @@ package repo import ( "net/http" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/services/context" "github.com/go-enry/go-enry/v2" ) diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index c231b7ee6c..f3256738a1 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -24,36 +24,35 @@ import ( _ "image/jpeg" // for processing jpeg images _ "image/png" // for processing png images - activities_model "forgejo.org/models/activities" - admin_model "forgejo.org/models/admin" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issue_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/actions" - "forgejo.org/modules/annex" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/highlight" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/svg" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/routers/web/feed" - "forgejo.org/services/context" - issue_service "forgejo.org/services/issue" - files_service "forgejo.org/services/repository/files" + activities_model "code.gitea.io/gitea/models/activities" + admin_model "code.gitea.io/gitea/models/admin" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + issue_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/annex" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/highlight" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/svg" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/services/context" + issue_service "code.gitea.io/gitea/services/issue" + files_service "code.gitea.io/gitea/services/repository/files" "github.com/nektos/act/pkg/model" @@ -149,6 +148,7 @@ func FindReadmeFileInEntries(ctx *context.Context, entries []*git.TreeEntry, try // this should be impossible; if subTreeEntry exists so should this. continue } + var err error childEntries, err := subTree.ListEntries() if err != nil { return "", nil, err @@ -441,10 +441,6 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { ctx.Data["FileName"] = blob.Name() ctx.Data["RawFileLink"] = ctx.Repo.RepoLink + "/raw/" + ctx.Repo.BranchNameSubURL() + "/" + util.PathEscapeSegments(ctx.Repo.TreePath) - ctx.Data["OpenGraphTitle"] = ctx.Data["Title"] - ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"]) - ctx.Data["OpenGraphNoDescription"] = true - if entry.IsLink() { _, link, err := entry.FollowLinks() // Errors should be allowed, because this shouldn't @@ -1104,15 +1100,7 @@ func renderHomeCode(ctx *context.Context) { return } - if entry.IsSubModule() { - subModuleURL, err := ctx.Repo.Commit.GetSubModule(entry.Name()) - if err != nil { - HandleGitError(ctx, "Repo.Commit.GetSubModule", err) - return - } - subModuleFile := git.NewSubModuleFile(ctx.Repo.Commit, subModuleURL, entry.ID.String()) - ctx.Redirect(subModuleFile.RefURL(setting.AppURL, ctx.Repo.Repository.FullName(), setting.SSH.Domain)) - } else if entry.IsDir() { + if entry.IsDir() { renderDirectory(ctx) } else { renderFile(ctx, entry) @@ -1225,12 +1213,6 @@ PostRecentBranchCheck: ctx.Data["TreeNames"] = treeNames ctx.Data["BranchLink"] = branchLink ctx.Data["CodeIndexerDisabled"] = !setting.Indexer.RepoIndexerEnabled - if setting.Indexer.RepoIndexerEnabled { - ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx) - ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions - } else { - ctx.Data["CodeSearchOptions"] = git.GrepSearchOptions - } isAnnexFile, okAnnexFile := ctx.Data["IsAnnexFile"] isAnnexFilePresent, okAnnexFilePresent := ctx.Data["IsAnnexFilePresent"] if okAnnexFile && okAnnexFilePresent && isAnnexFile.(bool) && !isAnnexFilePresent.(bool) { diff --git a/routers/web/repo/wiki.go b/routers/web/repo/wiki.go index 9a21ac21a3..1fd080021d 100644 --- a/routers/web/repo/wiki.go +++ b/routers/web/repo/wiki.go @@ -6,7 +6,6 @@ package repo import ( "bytes" - gocontext "context" "fmt" "io" "net/http" @@ -14,25 +13,25 @@ import ( "path/filepath" "strings" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers/common" - "forgejo.org/services/context" - "forgejo.org/services/forms" - notify_service "forgejo.org/services/notify" - wiki_service "forgejo.org/services/wiki" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "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/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + notify_service "code.gitea.io/gitea/services/notify" + wiki_service "code.gitea.io/gitea/services/wiki" ) const ( @@ -535,9 +534,6 @@ func Wiki(ctx *context.Context) { } ctx.Data["Author"] = lastCommit.Author - ctx.Data["OpenGraphTitle"] = ctx.Data["Title"] - ctx.Data["OpenGraphURL"] = fmt.Sprintf("%s%s", setting.AppURL, ctx.Data["Link"]) - ctx.HTML(http.StatusOK, tplWikiView) } @@ -602,32 +598,22 @@ func WikiPages(ctx *context.Context) { } }() - treePath := "" // To support list sub folders' pages in the future - tree, err := commit.SubTree(treePath) - if err != nil { - ctx.ServerError("SubTree", err) - return - } - - allEntries, err := tree.ListEntries() + entries, err := commit.ListEntries() if err != nil { ctx.ServerError("ListEntries", err) return } - allEntries.CustomSort(base.NaturalSortLess) - - entries, _, err := allEntries.GetCommitsInfo(gocontext.Context(ctx), commit, treePath) - if err != nil { - ctx.ServerError("GetCommitsInfo", err) - return - } - pages := make([]PageMeta, 0, len(entries)) for _, entry := range entries { - if !entry.Entry.IsRegular() { + if !entry.IsRegular() { continue } - wikiName, err := wiki_service.GitPathToWebPath(entry.Entry.Name()) + c, err := wikiRepo.GetCommitByPath(entry.Name()) + if err != nil { + ctx.ServerError("GetCommit", err) + return + } + wikiName, err := wiki_service.GitPathToWebPath(entry.Name()) if err != nil { if repo_model.IsErrWikiInvalidFileName(err) { continue @@ -639,8 +625,8 @@ func WikiPages(ctx *context.Context) { pages = append(pages, PageMeta{ Name: displayName, SubURL: wiki_service.WebPathToURLPath(wikiName), - GitEntryName: entry.Entry.Name(), - UpdatedUnix: timeutil.TimeStamp(entry.Commit.Author.When.Unix()), + GitEntryName: entry.Name(), + UpdatedUnix: timeutil.TimeStamp(c.Author.When.Unix()), }) } ctx.Data["Pages"] = pages diff --git a/routers/web/repo/wiki_test.go b/routers/web/repo/wiki_test.go index cba416fc92..47bad6d8e0 100644 --- a/routers/web/repo/wiki_test.go +++ b/routers/web/repo/wiki_test.go @@ -9,14 +9,14 @@ import ( "net/url" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" - wiki_service "forgejo.org/services/wiki" + 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/gitrepo" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" + wiki_service "code.gitea.io/gitea/services/wiki" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -86,7 +86,7 @@ func TestWiki(t *testing.T) { Wiki(ctx) assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) assert.EqualValues(t, "Home", ctx.Data["Title"]) - assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"]) + assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) } func TestWikiPages(t *testing.T) { @@ -96,7 +96,7 @@ func TestWikiPages(t *testing.T) { contexttest.LoadRepo(t, ctx, 1) WikiPages(ctx) assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) - assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File", "XSS"}, ctx.Data["Pages"]) + assertPagesMetas(t, []string{"Home", "Long Page", "Page With Image", "Page With Spaced Name", "Unescaped File"}, ctx.Data["Pages"]) } func TestNewWiki(t *testing.T) { diff --git a/routers/web/shared/actions/fixtures/TestRunnerDetails/action_runner.yml b/routers/web/shared/actions/fixtures/TestRunnerDetails/action_runner.yml deleted file mode 100644 index d783f83110..0000000000 --- a/routers/web/shared/actions/fixtures/TestRunnerDetails/action_runner.yml +++ /dev/null @@ -1,7 +0,0 @@ -- - id: 1004 - uuid: "fb857e63-c0ce-4571-a6c9-fde26c128073" - name: "Global runner" - owner_id: 0 - repo_id: 0 - deleted: 0 diff --git a/routers/web/shared/actions/fixtures/TestRunnerDetails/action_task.yml b/routers/web/shared/actions/fixtures/TestRunnerDetails/action_task.yml deleted file mode 100644 index 63a2d30deb..0000000000 --- a/routers/web/shared/actions/fixtures/TestRunnerDetails/action_task.yml +++ /dev/null @@ -1,160 +0,0 @@ -- - id: 1 - runner_id: 1004 - token_hash: a1 -- - id: 2 - runner_id: 1004 - token_hash: a2 -- - id: 3 - runner_id: 1004 - token_hash: a3 -- - id: 4 - runner_id: 1004 - token_hash: a4 -- - id: 5 - runner_id: 1004 - token_hash: a5 -- - id: 6 - runner_id: 1004 - token_hash: a6 -- - id: 7 - runner_id: 1004 - token_hash: a7 -- - id: 8 - runner_id: 1004 - token_hash: a8 -- - id: 9 - runner_id: 1004 - token_hash: a9 -- - id: 10 - runner_id: 1004 - token_hash: a10 -- - id: 11 - runner_id: 1004 - token_hash: a11 -- - id: 12 - runner_id: 1004 - token_hash: a12 -- - id: 13 - runner_id: 1004 - token_hash: a13 -- - id: 14 - runner_id: 1004 - token_hash: a14 -- - id: 15 - runner_id: 1004 - token_hash: a15 -- - id: 16 - runner_id: 1004 - token_hash: a16 -- - id: 17 - runner_id: 1004 - token_hash: a17 -- - id: 18 - runner_id: 1004 - token_hash: a18 -- - id: 19 - runner_id: 1004 - token_hash: a19 -- - id: 20 - runner_id: 1004 - token_hash: a20 -- - id: 21 - runner_id: 1004 - token_hash: a21 -- - id: 22 - runner_id: 1004 - token_hash: a22 -- - id: 23 - runner_id: 1004 - token_hash: a23 -- - id: 24 - runner_id: 1004 - token_hash: a24 -- - id: 25 - runner_id: 1004 - token_hash: a25 -- - id: 26 - runner_id: 1004 - token_hash: a26 -- - id: 27 - runner_id: 1004 - token_hash: a27 -- - id: 28 - runner_id: 1004 - token_hash: a28 -- - id: 29 - runner_id: 1004 - token_hash: a29 -- - id: 30 - runner_id: 1004 - token_hash: a30 -- - id: 31 - runner_id: 1004 - token_hash: a31 -- - id: 32 - runner_id: 1004 - token_hash: a32 -- - id: 33 - runner_id: 1004 - token_hash: a33 -- - id: 34 - runner_id: 1004 - token_hash: a34 -- - id: 35 - runner_id: 1004 - token_hash: a35 -- - id: 36 - runner_id: 1004 - token_hash: a36 -- - id: 37 - runner_id: 1004 - token_hash: a37 -- - id: 38 - runner_id: 1004 - token_hash: a38 -- - id: 39 - runner_id: 1004 - token_hash: a39 -- - id: 40 - runner_id: 1004 - token_hash: a40 diff --git a/routers/web/shared/actions/main_test.go b/routers/web/shared/actions/main_test.go deleted file mode 100644 index 056f48b98d..0000000000 --- a/routers/web/shared/actions/main_test.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2025 The Forgejo Authors. -// SPDX-License-Identifier: GPL-3.0-or-later - -package actions - -import ( - "testing" - - "forgejo.org/models/unittest" - - _ "forgejo.org/models" - _ "forgejo.org/models/forgefed" -) - -func TestMain(m *testing.M) { - unittest.MainTest(m) -} diff --git a/routers/web/shared/actions/runners.go b/routers/web/shared/actions/runners.go index 2ab6b2dadd..f38933226b 100644 --- a/routers/web/shared/actions/runners.go +++ b/routers/web/shared/actions/runners.go @@ -6,13 +6,13 @@ package actions import ( "errors" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // RunnersList prepares data for runners list @@ -79,6 +79,7 @@ func RunnerDetails(ctx *context.Context, page int, runnerID, ownerID, repoID int Page: page, PageSize: 30, }, + Status: actions_model.StatusUnknown, // Unknown means all RunnerID: runner.ID, } @@ -141,21 +142,10 @@ func RunnerResetRegistrationToken(ctx *context.Context, ownerID, repoID int64, r } // RunnerDeletePost response for deleting a runner -func RunnerDeletePost(ctx *context.Context, runnerID, ownerID, repoID int64, +func RunnerDeletePost(ctx *context.Context, runnerID int64, successRedirectTo, failedRedirectTo string, ) { - runner, err := actions_model.GetRunnerByID(ctx, runnerID) - if err != nil { - ctx.ServerError("GetRunnerByID", err) - return - } - - if !runner.Editable(ownerID, repoID) { - ctx.NotFound("Editable", util.NewPermissionDeniedErrorf("no permission to edit this runner")) - return - } - - if err := actions_model.DeleteRunner(ctx, runner); err != nil { + if err := actions_model.DeleteRunner(ctx, runnerID); err != nil { log.Warn("DeleteRunnerPost.UpdateRunner failed: %v, url: %s", err, ctx.Req.URL) ctx.Flash.Warning(ctx.Tr("actions.runners.delete_runner_failed")) diff --git a/routers/web/shared/actions/runners_test.go b/routers/web/shared/actions/runners_test.go deleted file mode 100644 index ad75d34ee6..0000000000 --- a/routers/web/shared/actions/runners_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2025 The Forgejo Authors. -// SPDX-License-Identifier: GPL-3.0-or-later - -package actions - -import ( - "net/http" - "testing" - - actions_model "forgejo.org/models/actions" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/services/contexttest" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestRunnerDetails(t *testing.T) { - defer unittest.OverrideFixtures("routers/web/shared/actions/fixtures/TestRunnerDetails")() - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - runner := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunner{ID: 1004}) - - t.Run("permission denied", func(t *testing.T) { - ctx, resp := contexttest.MockContext(t, "/admin/actions/runners") - RunnerDetails(ctx, 1, runner.ID, user.ID, 0) - assert.Equal(t, http.StatusNotFound, resp.Code) - }) - - t.Run("first page", func(t *testing.T) { - ctx, resp := contexttest.MockContext(t, "/admin/actions/runners") - page := 1 - RunnerDetails(ctx, page, runner.ID, 0, 0) - require.Equal(t, http.StatusOK, resp.Code) - assert.Len(t, ctx.GetData()["Tasks"], 30) - }) - - t.Run("second and last page", func(t *testing.T) { - ctx, resp := contexttest.MockContext(t, "/admin/actions/runners") - page := 2 - RunnerDetails(ctx, page, runner.ID, 0, 0) - require.Equal(t, http.StatusOK, resp.Code) - assert.Len(t, ctx.GetData()["Tasks"], 10) - }) -} diff --git a/routers/web/shared/actions/variables.go b/routers/web/shared/actions/variables.go index 13dff2f11a..79c03e4e8c 100644 --- a/routers/web/shared/actions/variables.go +++ b/routers/web/shared/actions/variables.go @@ -4,13 +4,13 @@ package actions import ( - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/web" - actions_service "forgejo.org/services/actions" - "forgejo.org/services/context" - "forgejo.org/services/forms" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/web" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) func SetVariablesContext(ctx *context.Context, ownerID, repoID int64) { @@ -39,33 +39,25 @@ func CreateVariable(ctx *context.Context, ownerID, repoID int64, redirectURL str ctx.JSONRedirect(redirectURL) } -func UpdateVariable(ctx *context.Context, ownerID, repoID int64, redirectURL string) { +func UpdateVariable(ctx *context.Context, redirectURL string) { id := ctx.ParamsInt64(":variable_id") form := web.GetForm(ctx).(*forms.EditVariableForm) - if ok, err := actions_service.UpdateVariable(ctx, id, ownerID, repoID, form.Name, form.Data); err != nil || !ok { - if !ok { - ctx.JSONError(ctx.Tr("actions.variables.not_found")) - } else { - log.Error("UpdateVariable: %v", err) - ctx.JSONError(ctx.Tr("actions.variables.update.failed")) - } + if ok, err := actions_service.UpdateVariable(ctx, id, form.Name, form.Data); err != nil || !ok { + log.Error("UpdateVariable: %v", err) + ctx.JSONError(ctx.Tr("actions.variables.update.failed")) return } ctx.Flash.Success(ctx.Tr("actions.variables.update.success")) ctx.JSONRedirect(redirectURL) } -func DeleteVariable(ctx *context.Context, ownerID, repoID int64, redirectURL string) { +func DeleteVariable(ctx *context.Context, redirectURL string) { id := ctx.ParamsInt64(":variable_id") - if ok, err := actions_model.DeleteVariable(ctx, id, ownerID, repoID); err != nil || !ok { - if !ok { - ctx.JSONError(ctx.Tr("actions.variables.not_found")) - } else { - log.Error("Delete variable [%d] failed: %v", id, err) - ctx.JSONError(ctx.Tr("actions.variables.deletion.failed")) - } + if err := actions_service.DeleteVariableByID(ctx, id); err != nil { + log.Error("Delete variable [%d] failed: %v", id, err) + ctx.JSONError(ctx.Tr("actions.variables.deletion.failed")) return } ctx.Flash.Success(ctx.Tr("actions.variables.deletion.success")) diff --git a/routers/web/shared/packages/packages.go b/routers/web/shared/packages/packages.go index 1d4fb1588d..af960f1c0c 100644 --- a/routers/web/shared/packages/packages.go +++ b/routers/web/shared/packages/packages.go @@ -9,19 +9,19 @@ import ( "net/http" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - cargo_service "forgejo.org/services/packages/cargo" - container_service "forgejo.org/services/packages/container" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + cargo_service "code.gitea.io/gitea/services/packages/cargo" + container_service "code.gitea.io/gitea/services/packages/container" ) func SetPackagesContext(ctx *context.Context, owner *user_model.User) { diff --git a/routers/web/shared/project/column.go b/routers/web/shared/project/column.go index 40bb439452..599842ea9e 100644 --- a/routers/web/shared/project/column.go +++ b/routers/web/shared/project/column.go @@ -4,9 +4,9 @@ package project import ( - project_model "forgejo.org/models/project" - "forgejo.org/modules/json" - "forgejo.org/services/context" + project_model "code.gitea.io/gitea/models/project" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/services/context" ) // MoveColumns moves or keeps columns in a project and sorts them inside that project diff --git a/routers/web/shared/secrets/secrets.go b/routers/web/shared/secrets/secrets.go index a853598939..3bd421f86a 100644 --- a/routers/web/shared/secrets/secrets.go +++ b/routers/web/shared/secrets/secrets.go @@ -4,14 +4,14 @@ package secrets import ( - "forgejo.org/models/db" - secret_model "forgejo.org/models/secret" - "forgejo.org/modules/log" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - secret_service "forgejo.org/services/secrets" + "code.gitea.io/gitea/models/db" + secret_model "code.gitea.io/gitea/models/secret" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + secret_service "code.gitea.io/gitea/services/secrets" ) func SetSecretsContext(ctx *context.Context, ownerID, repoID int64) { diff --git a/routers/web/shared/storage_overview.go b/routers/web/shared/storage_overview.go deleted file mode 100644 index fac4aa99e5..0000000000 --- a/routers/web/shared/storage_overview.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package shared - -import ( - "html/template" - "net/http" - - quota_model "forgejo.org/models/quota" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/services/context" -) - -// StorageOverview render a size overview of the user, as well as relevant -// quota limits of the instance. -func StorageOverview(ctx *context.Context, userID int64, tpl base.TplName) { - if !setting.Quota.Enabled { - ctx.NotFound("MustEnableQuota", nil) - } - ctx.Data["Title"] = ctx.Tr("settings.storage_overview") - ctx.Data["PageIsStorageOverview"] = true - - ctx.Data["Color"] = func(subject quota_model.LimitSubject) float64 { - return float64(subject) * 137.50776405003785 // Golden angle. - } - - ctx.Data["PrettySubject"] = func(subject quota_model.LimitSubject) template.HTML { - switch subject { - case quota_model.LimitSubjectSizeAll: - return ctx.Locale.Tr("settings.quota.sizes.all") - case quota_model.LimitSubjectSizeReposAll: - return ctx.Locale.Tr("settings.quota.sizes.repos.all") - case quota_model.LimitSubjectSizeReposPublic: - return ctx.Locale.Tr("settings.quota.sizes.repos.public") - case quota_model.LimitSubjectSizeReposPrivate: - return ctx.Locale.Tr("settings.quota.sizes.repos.private") - case quota_model.LimitSubjectSizeGitAll: - return ctx.Locale.Tr("settings.quota.sizes.git.all") - case quota_model.LimitSubjectSizeGitLFS: - return ctx.Locale.Tr("settings.quota.sizes.git.lfs") - case quota_model.LimitSubjectSizeAssetsAll: - return ctx.Locale.Tr("settings.quota.sizes.assets.all") - case quota_model.LimitSubjectSizeAssetsAttachmentsAll: - return ctx.Locale.Tr("settings.quota.sizes.assets.attachments.all") - case quota_model.LimitSubjectSizeAssetsAttachmentsIssues: - return ctx.Locale.Tr("settings.quota.sizes.assets.attachments.issues") - case quota_model.LimitSubjectSizeAssetsAttachmentsReleases: - return ctx.Locale.Tr("settings.quota.sizes.assets.attachments.releases") - case quota_model.LimitSubjectSizeAssetsArtifacts: - return ctx.Locale.Tr("settings.quota.sizes.assets.artifacts") - case quota_model.LimitSubjectSizeAssetsPackagesAll: - return ctx.Locale.Tr("settings.quota.sizes.assets.packages.all") - case quota_model.LimitSubjectSizeWiki: - return ctx.Locale.Tr("settings.quota.sizes.wiki") - default: - panic("unrecognized subject: " + subject.String()) - } - } - - sizeUsed, err := quota_model.GetUsedForUser(ctx, userID) - if err != nil { - ctx.ServerError("GetUsedForUser", err) - return - } - ctx.Data["SizeUsed"] = sizeUsed - - quotaGroups, err := quota_model.GetGroupsForUser(ctx, userID) - if err != nil { - ctx.ServerError("GetGroupsForUser", err) - return - } - if len(quotaGroups) == 0 { - quotaGroups = append(quotaGroups, "a_model.Group{ - Name: "Global quota", - Rules: []quota_model.Rule{ - { - Name: "Default", - Limit: setting.Quota.Default.Total, - Subjects: quota_model.LimitSubjects{quota_model.LimitSubjectSizeAll}, - }, - }, - }, - ) - } - ctx.Data["QuotaGroups"] = quotaGroups - - ctx.HTML(http.StatusOK, tpl) -} diff --git a/routers/web/shared/user/header.go b/routers/web/shared/user/header.go index 56f0de2033..fd7605c33b 100644 --- a/routers/web/shared/user/header.go +++ b/routers/web/shared/user/header.go @@ -7,22 +7,22 @@ package user import ( "net/url" - "forgejo.org/models/db" - "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - project_model "forgejo.org/models/project" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + 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" + "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/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // prepareContextForCommonProfile store some common data into context data for user's profile related pages (including the nav menu) @@ -66,7 +66,6 @@ func PrepareContextForProfileBigAvatar(ctx *context.Context) { showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) orgs, err := db.Find[organization.Organization](ctx, organization.FindOrgOptions{ UserID: ctx.ContextUser.ID, - IncludeLimited: ctx.IsSigned, IncludePrivate: showPrivate, }) if err != nil { diff --git a/routers/web/swagger_json.go b/routers/web/swagger_json.go index 1569600734..fc39b504a9 100644 --- a/routers/web/swagger_json.go +++ b/routers/web/swagger_json.go @@ -4,7 +4,7 @@ package web import ( - "forgejo.org/services/context" + "code.gitea.io/gitea/services/context" ) // SwaggerV1Json render swagger v1 json diff --git a/routers/web/user/avatar.go b/routers/web/user/avatar.go index 76cc342770..04f510161d 100644 --- a/routers/web/user/avatar.go +++ b/routers/web/user/avatar.go @@ -7,10 +7,10 @@ import ( "strings" "time" - "forgejo.org/models/avatars" - user_model "forgejo.org/models/user" - "forgejo.org/modules/httpcache" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/avatars" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/services/context" ) func cacheableRedirect(ctx *context.Context, location string) { diff --git a/routers/web/user/code.go b/routers/web/user/code.go index ac1852e410..e2e8f25661 100644 --- a/routers/web/user/code.go +++ b/routers/web/user/code.go @@ -6,13 +6,13 @@ package user import ( "net/http" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/base" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/setting" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/base" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/setting" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" ) const ( @@ -39,19 +39,12 @@ func CodeSearch(ctx *context.Context) { language := ctx.FormTrim("l") keyword := ctx.FormTrim("q") - path := ctx.FormTrim("path") - mode := code_indexer.SearchModeExact - if m := ctx.FormTrim("mode"); m == "union" || - m == "fuzzy" || - ctx.FormBool("fuzzy") { - mode = code_indexer.SearchModeUnion - } + isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) ctx.Data["Keyword"] = keyword ctx.Data["Language"] = language - ctx.Data["CodeSearchOptions"] = code_indexer.CodeSearchOptions - ctx.Data["CodeSearchMode"] = mode.String() + ctx.Data["IsFuzzy"] = isFuzzy ctx.Data["IsCodePage"] = true if keyword == "" { @@ -83,11 +76,10 @@ func CodeSearch(ctx *context.Context) { if len(repoIDs) > 0 { total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{ - RepoIDs: repoIDs, - Keyword: keyword, - Mode: mode, - Language: language, - Filename: path, + RepoIDs: repoIDs, + Keyword: keyword, + IsKeywordFuzzy: isFuzzy, + Language: language, Paginator: &db.ListOptions{ Page: page, PageSize: setting.UI.RepoSearchPagingNum, diff --git a/routers/web/user/home.go b/routers/web/user/home.go index 9f22cebaba..4b249e9696 100644 --- a/routers/web/user/home.go +++ b/routers/web/user/home.go @@ -10,30 +10,31 @@ import ( "net/http" "regexp" "slices" + "sort" "strconv" "strings" - activities_model "forgejo.org/models/activities" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/container" - issue_indexer "forgejo.org/modules/indexer/issues" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/routers/web/feed" - "forgejo.org/services/context" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" + activities_model "code.gitea.io/gitea/models/activities" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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" + 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" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/services/context" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" @@ -90,8 +91,6 @@ func Dashboard(ctx *context.Context) { cnt, _ := organization.GetOrganizationCount(ctx, ctxUser) ctx.Data["UserOrgsCount"] = cnt ctx.Data["MirrorsEnabled"] = setting.Mirror.Enabled - ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage - ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage ctx.Data["Date"] = date var uid int64 @@ -243,9 +242,7 @@ func Milestones(ctx *context.Context) { ctx.ServerError("SearchRepositoryByCondition", err) return } - slices.SortFunc(showRepos, func(a, b *repo_model.Repository) int { - return strings.Compare(a.FullName(), b.FullName()) - }) + sort.Sort(showRepos) for i := 0; i < len(milestones); { for _, repo := range showRepos { @@ -383,11 +380,9 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { } var ( - viewType string - sortType = ctx.FormString("sort") - filterMode int - defaultFilterMode int - defaultViewType string + viewType string + sortType = ctx.FormString("sort") + filterMode int ) // Default to recently updated, unlike repository issues list @@ -408,18 +403,6 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { // TODO: distinguish during routing - // Default to created_by on /pulls and /issues - // because it is most relevant to the user in the global context - if ctx.Org == nil || ctx.Org.Organization == nil { - defaultFilterMode = issues_model.FilterModeCreate - defaultViewType = "created_by" - } else { - // Default to your_repositories on /org/*/pulls and /org/*/issues - // because it is the most relevant to the user in the context of an org - defaultFilterMode = issues_model.FilterModeYourRepositories - defaultViewType = "your_repositories" - } - viewType = ctx.FormString("type") switch viewType { case "assigned": @@ -435,8 +418,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { case "created_by": fallthrough default: - filterMode = defaultFilterMode - viewType = defaultViewType + filterMode = issues_model.FilterModeCreate + viewType = "created_by" } // -------------------------------------------------------------------------- @@ -465,6 +448,8 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { User: ctx.Doer, } + isFuzzy := ctx.FormOptionalBool("fuzzy").ValueOrDefault(true) + // Search all repositories which // // As user: @@ -594,7 +579,9 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { // USING FINAL STATE OF opts FOR A QUERY. var issues issues_model.IssueList { - issueIDs, _, err := issue_indexer.SearchIssues(ctx, issue_indexer.ToSearchOptions(keyword, opts)) + issueIDs, _, err := issue_indexer.SearchIssues(ctx, issue_indexer.ToSearchOptions(keyword, opts).Copy( + func(o *issue_indexer.SearchOptions) { o.IsFuzzyKeyword = isFuzzy }, + )) if err != nil { ctx.ServerError("issueIDsFromSearch", err) return @@ -620,7 +607,9 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { // ------------------------------- // Fill stats to post to ctx.Data. // ------------------------------- - issueStats, err := getUserIssueStats(ctx, ctxUser, filterMode, issue_indexer.ToSearchOptions(keyword, opts)) + issueStats, err := getUserIssueStats(ctx, ctxUser, filterMode, issue_indexer.ToSearchOptions(keyword, opts).Copy( + func(o *issue_indexer.SearchOptions) { o.IsFuzzyKeyword = isFuzzy }, + )) if err != nil { ctx.ServerError("getUserIssueStats", err) return @@ -675,6 +664,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { ctx.Data["IsShowClosed"] = isShowClosed ctx.Data["SelectLabels"] = selectedLabels ctx.Data["PageIsOrgIssues"] = org != nil + ctx.Data["IsFuzzy"] = isFuzzy if isShowClosed { ctx.Data["State"] = "closed" @@ -690,6 +680,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) { pager.AddParam(ctx, "labels", "SelectLabels") pager.AddParam(ctx, "milestone", "MilestoneID") pager.AddParam(ctx, "assignee", "AssigneeID") + pager.AddParam(ctx, "fuzzy", "IsFuzzy") ctx.Data["Page"] = pager ctx.HTML(http.StatusOK, tplIssues) diff --git a/routers/web/user/home_test.go b/routers/web/user/home_test.go index af9d50538d..e1c8ca9a79 100644 --- a/routers/web/user/home_test.go +++ b/routers/web/user/home_test.go @@ -7,14 +7,14 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/services/context" - "forgejo.org/services/contexttest" + "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/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -98,8 +98,6 @@ func TestMilestones(t *testing.T) { assert.EqualValues(t, 1, ctx.Data["Total"]) assert.Len(t, ctx.Data["Milestones"], 1) assert.Len(t, ctx.Data["Repos"], 2) // both repo 42 and 1 have milestones and both are owned by user 2 - assert.EqualValues(t, "user2/glob", ctx.Data["Repos"].(repo_model.RepositoryList)[0].FullName()) - assert.EqualValues(t, "user2/repo1", ctx.Data["Repos"].(repo_model.RepositoryList)[1].FullName()) } func TestMilestonesForSpecificRepo(t *testing.T) { diff --git a/routers/web/user/main_test.go b/routers/web/user/main_test.go index 080e3fdcfe..8b6ae69296 100644 --- a/routers/web/user/main_test.go +++ b/routers/web/user/main_test.go @@ -6,7 +6,7 @@ package user import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/user/notification.go b/routers/web/user/notification.go index 296951b2ff..dfcaf58e08 100644 --- a/routers/web/user/notification.go +++ b/routers/web/user/notification.go @@ -11,21 +11,21 @@ import ( "net/url" "strings" - activities_model "forgejo.org/models/activities" - "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/unit" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/context" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" + activities_model "code.gitea.io/gitea/models/activities" + "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/unit" + "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/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/context" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" ) const ( @@ -111,26 +111,20 @@ func getNotifications(ctx *context.Context) { return } - sess := db.GetEngine(ctx).Table("notification") - if setting.Database.Type.IsMySQL() { - sess = sess.IndexHint("USE", "", "IDX_notification_user_id") - } - sess.Where("user_id = ?", ctx.Doer.ID). - And("status = ? OR status = ?", status, activities_model.NotificationStatusPinned). - OrderBy("notification.updated_unix DESC") - - if perPage > 0 { - if page == 0 { - page = 1 - } - sess.Limit(perPage, (page-1)*perPage) - } - - nls := make([]*activities_model.Notification, 0, perPage) - if err := sess.Find(&nls); err != nil { - ctx.ServerError("FindNotifications", err) + statuses := []activities_model.NotificationStatus{status, activities_model.NotificationStatusPinned} + nls, err := db.Find[activities_model.Notification](ctx, activities_model.FindNotificationOptions{ + ListOptions: db.ListOptions{ + PageSize: perPage, + Page: page, + }, + UserID: ctx.Doer.ID, + Status: statuses, + }) + if err != nil { + ctx.ServerError("db.Find[activities_model.Notification]", err) return } + notifications := activities_model.NotificationList(nls) failCount := 0 diff --git a/routers/web/user/package.go b/routers/web/user/package.go index 2862c6684b..d47a36e165 100644 --- a/routers/web/user/package.go +++ b/routers/web/user/package.go @@ -6,30 +6,30 @@ package user import ( "fmt" "net/http" - "slices" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/base" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - alpine_module "forgejo.org/modules/packages/alpine" - arch_model "forgejo.org/modules/packages/arch" - debian_module "forgejo.org/modules/packages/debian" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - packages_helper "forgejo.org/routers/api/packages/helper" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - "forgejo.org/services/forms" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + "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/modules/base" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + alpine_module "code.gitea.io/gitea/modules/packages/alpine" + arch_model "code.gitea.io/gitea/modules/packages/arch" + debian_module "code.gitea.io/gitea/modules/packages/debian" + rpm_module "code.gitea.io/gitea/modules/packages/rpm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + packages_helper "code.gitea.io/gitea/routers/api/packages/helper" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + packages_service "code.gitea.io/gitea/services/packages" ) const ( @@ -177,11 +177,10 @@ func ViewPackageVersion(ctx *context.Context) { ctx.Data["Title"] = pd.Package.Name ctx.Data["IsPackagesPage"] = true ctx.Data["PackageDescriptor"] = pd - ctx.Data["PackageRegistryHost"] = setting.Packages.RegistryHost switch pd.Package.Type { case packages_model.TypeContainer: - + ctx.Data["RegistryHost"] = setting.Packages.RegistryHost case packages_model.TypeAlpine: branches := make(container.Set[string]) repositories := make(container.Set[string]) @@ -200,10 +199,11 @@ func ViewPackageVersion(ctx *context.Context) { } } - ctx.Data["Branches"] = slices.Sorted(branches.Seq()) - ctx.Data["Repositories"] = slices.Sorted(repositories.Seq()) - ctx.Data["Architectures"] = slices.Sorted(architectures.Seq()) + ctx.Data["Branches"] = util.Sorted(branches.Values()) + ctx.Data["Repositories"] = util.Sorted(repositories.Values()) + ctx.Data["Architectures"] = util.Sorted(architectures.Values()) case packages_model.TypeArch: + ctx.Data["RegistryHost"] = setting.Packages.RegistryHost ctx.Data["SignMail"] = fmt.Sprintf("%s@noreply.%s", ctx.Package.Owner.Name, setting.Packages.RegistryHost) groups := make(container.Set[string]) for _, f := range pd.Files { @@ -213,7 +213,7 @@ func ViewPackageVersion(ctx *context.Context) { } } } - ctx.Data["Groups"] = slices.Sorted(groups.Seq()) + ctx.Data["Groups"] = util.Sorted(groups.Values()) case packages_model.TypeDebian: distributions := make(container.Set[string]) components := make(container.Set[string]) @@ -232,10 +232,10 @@ func ViewPackageVersion(ctx *context.Context) { } } - ctx.Data["Distributions"] = slices.Sorted(distributions.Seq()) - ctx.Data["Components"] = slices.Sorted(components.Seq()) - ctx.Data["Architectures"] = slices.Sorted(architectures.Seq()) - case packages_model.TypeRpm, packages_model.TypeAlt: + ctx.Data["Distributions"] = util.Sorted(distributions.Values()) + ctx.Data["Components"] = util.Sorted(components.Values()) + ctx.Data["Architectures"] = util.Sorted(architectures.Values()) + case packages_model.TypeRpm: groups := make(container.Set[string]) architectures := make(container.Set[string]) @@ -250,8 +250,8 @@ func ViewPackageVersion(ctx *context.Context) { } } - ctx.Data["Groups"] = slices.Sorted(groups.Seq()) - ctx.Data["Architectures"] = slices.Sorted(architectures.Seq()) + ctx.Data["Groups"] = util.Sorted(groups.Values()) + ctx.Data["Architectures"] = util.Sorted(architectures.Values()) } var ( diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index 5132b1da5c..9cb392d878 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -11,23 +11,23 @@ import ( "path" "strings" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/routers/web/feed" - "forgejo.org/routers/web/org" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - user_service "forgejo.org/services/user" + activities_model "code.gitea.io/gitea/models/activities" + "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/base" + "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/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/routers/web/org" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) const ( @@ -63,12 +63,6 @@ func userProfile(ctx *context.Context) { ctx.Data["Title"] = ctx.ContextUser.DisplayName() ctx.Data["PageIsUserProfile"] = true - ctx.Data["OpenGraphTitle"] = ctx.ContextUser.DisplayName() - ctx.Data["OpenGraphType"] = "profile" - ctx.Data["OpenGraphImageURL"] = ctx.ContextUser.AvatarLink(ctx) - ctx.Data["OpenGraphURL"] = ctx.ContextUser.HTMLURL() - ctx.Data["OpenGraphDescription"] = ctx.ContextUser.Description - // prepare heatmap data if setting.Service.EnableUserHeatmap { data, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer) diff --git a/routers/web/user/search.go b/routers/web/user/search.go index 411a356d9b..fb7729bbe1 100644 --- a/routers/web/user/search.go +++ b/routers/web/user/search.go @@ -6,26 +6,39 @@ package user import ( "net/http" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) -// SearchCandidates searches candidate users for dropdown list -func SearchCandidates(ctx *context.Context) { - users, _, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ +// Search search users +func Search(ctx *context.Context) { + listOptions := db.ListOptions{ + Page: ctx.FormInt("page"), + PageSize: convert.ToCorrectPageSize(ctx.FormInt("limit")), + } + + users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ Actor: ctx.Doer, Keyword: ctx.FormTrim("q"), + UID: ctx.FormInt64("uid"), Type: user_model.UserTypeIndividual, - IsActive: optional.Some(true), - ListOptions: db.ListOptions{PageSize: setting.UI.MembersPagingNum}, + IsActive: ctx.FormOptionalBool("active"), + ListOptions: listOptions, }) if err != nil { - ctx.ServerError("Unable to search users", err) + ctx.JSON(http.StatusInternalServerError, map[string]any{ + "ok": false, + "error": err.Error(), + }) return } - ctx.JSON(http.StatusOK, map[string]any{"data": convert.ToUsers(ctx, ctx.Doer, users)}) + + ctx.SetTotalCountHeader(maxResults) + + ctx.JSON(http.StatusOK, map[string]any{ + "ok": true, + "data": convert.ToUsers(ctx, ctx.Doer, users), + }) } diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index a0cdb25f44..34d2377592 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -9,23 +9,22 @@ import ( "net/http" "time" - "forgejo.org/models" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/password" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/db" - "forgejo.org/services/auth/source/smtp" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" - "forgejo.org/services/user" + "code.gitea.io/gitea/models" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/password" + "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/timeutil" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/db" + "code.gitea.io/gitea/services/auth/source/smtp" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" + "code.gitea.io/gitea/services/user" ) const ( @@ -212,7 +211,7 @@ func EmailPost(ctx *context.Context) { loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSettingsAccount, &form) - } else if validation.IsErrEmailCharIsNotSupported(err) || validation.IsErrEmailInvalid(err) { + } else if user_model.IsErrEmailCharIsNotSupported(err) || user_model.IsErrEmailInvalid(err) { loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSettingsAccount, &form) diff --git a/routers/web/user/setting/account_test.go b/routers/web/user/setting/account_test.go index 82e00bbf7c..9fdc5e4d53 100644 --- a/routers/web/user/setting/account_test.go +++ b/routers/web/user/setting/account_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/contexttest" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/forms" "github.com/stretchr/testify/assert" ) diff --git a/routers/web/user/setting/adopt.go b/routers/web/user/setting/adopt.go index f7fd1c3803..171c1933d4 100644 --- a/routers/web/user/setting/adopt.go +++ b/routers/web/user/setting/adopt.go @@ -6,12 +6,12 @@ package setting import ( "path/filepath" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" + 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/util" + "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" ) // AdoptOrDeleteRepository adopts or deletes a repository diff --git a/routers/web/user/setting/applications.go b/routers/web/user/setting/applications.go index 631d5958ea..24ebf9b922 100644 --- a/routers/web/user/setting/applications.go +++ b/routers/web/user/setting/applications.go @@ -7,14 +7,13 @@ package setting import ( "net/http" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( @@ -88,23 +87,6 @@ func DeleteApplication(ctx *context.Context) { ctx.JSONRedirect(setting.AppSubURL + "/user/settings/applications") } -// RegenerateApplication response for regenerating user access token -func RegenerateApplication(ctx *context.Context) { - if t, err := auth_model.RegenerateAccessTokenByID(ctx, ctx.FormInt64("id"), ctx.Doer.ID); err != nil { - if auth_model.IsErrAccessTokenNotExist(err) { - ctx.Flash.Error(ctx.Tr("error.not_found")) - } else { - ctx.Flash.Error(ctx.Tr("error.server_internal")) - log.Error("DeleteAccessTokenByID", err) - } - } else { - ctx.Flash.Success(ctx.Tr("settings.regenerate_token_success")) - ctx.Flash.Info(t.Token) - } - - ctx.JSONRedirect(setting.AppSubURL + "/user/settings/applications") -} - func loadApplicationsData(ctx *context.Context) { ctx.Data["AccessTokenScopePublicOnly"] = auth_model.AccessTokenScopePublicOnly tokens, err := db.Find[auth_model.AccessToken](ctx, auth_model.ListAccessTokensOptions{UserID: ctx.Doer.ID}) diff --git a/routers/web/user/setting/blocked_users.go b/routers/web/user/setting/blocked_users.go index 1448dc9a3c..3f35b2eadf 100644 --- a/routers/web/user/setting/blocked_users.go +++ b/routers/web/user/setting/blocked_users.go @@ -6,11 +6,11 @@ package setting import ( "net/http" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "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/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/user/setting/keys.go b/routers/web/user/setting/keys.go index 94d32b730f..9462be71c2 100644 --- a/routers/web/user/setting/keys.go +++ b/routers/web/user/setting/keys.go @@ -8,15 +8,15 @@ import ( "fmt" "net/http" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/context" - "forgejo.org/services/forms" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/setting" + "code.gitea.io/gitea/modules/web" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) const ( diff --git a/routers/web/user/setting/main_test.go b/routers/web/user/setting/main_test.go index 38ac2842dd..e398208d0d 100644 --- a/routers/web/user/setting/main_test.go +++ b/routers/web/user/setting/main_test.go @@ -6,7 +6,7 @@ package setting import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/routers/web/user/setting/oauth2.go b/routers/web/user/setting/oauth2.go index 64b252e97f..1f485e06c8 100644 --- a/routers/web/user/setting/oauth2.go +++ b/routers/web/user/setting/oauth2.go @@ -4,9 +4,9 @@ package setting import ( - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/user/setting/oauth2_common.go b/routers/web/user/setting/oauth2_common.go index 7449e45216..85d1e820a5 100644 --- a/routers/web/user/setting/oauth2_common.go +++ b/routers/web/user/setting/oauth2_common.go @@ -7,13 +7,13 @@ import ( "fmt" "net/http" - "forgejo.org/models/auth" - "forgejo.org/modules/base" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - shared_user "forgejo.org/routers/web/shared/user" - "forgejo.org/services/context" - "forgejo.org/services/forms" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + shared_user "code.gitea.io/gitea/routers/web/shared/user" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) type OAuth2CommonHandlers struct { @@ -47,6 +47,7 @@ func (oa *OAuth2CommonHandlers) AddApp(ctx *context.Context) { return } + // TODO validate redirect URI app, err := auth.CreateOAuth2Application(ctx, auth.CreateOAuth2ApplicationOptions{ Name: form.Name, RedirectURIs: util.SplitTrimSpace(form.RedirectURIs, "\n"), @@ -94,25 +95,11 @@ func (oa *OAuth2CommonHandlers) EditSave(ctx *context.Context) { form := web.GetForm(ctx).(*forms.EditOAuth2ApplicationForm) if ctx.HasError() { - app, err := auth.GetOAuth2ApplicationByID(ctx, ctx.ParamsInt64("id")) - if err != nil { - if auth.IsErrOAuthApplicationNotFound(err) { - ctx.NotFound("Application not found", err) - return - } - ctx.ServerError("GetOAuth2ApplicationByID", err) - return - } - if app.UID != oa.OwnerID { - ctx.NotFound("Application not found", nil) - return - } - ctx.Data["App"] = app - oa.renderEditPage(ctx) return } + // TODO validate redirect URI var err error if ctx.Data["App"], err = auth.UpdateOAuth2Application(ctx, auth.UpdateOAuth2ApplicationOptions{ ID: ctx.ParamsInt64("id"), diff --git a/routers/web/user/setting/packages.go b/routers/web/user/setting/packages.go index ba739a03fc..4132659495 100644 --- a/routers/web/user/setting/packages.go +++ b/routers/web/user/setting/packages.go @@ -7,13 +7,13 @@ import ( "net/http" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - chef_module "forgejo.org/modules/packages/chef" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - shared "forgejo.org/routers/web/shared/packages" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + chef_module "code.gitea.io/gitea/modules/packages/chef" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + shared "code.gitea.io/gitea/routers/web/shared/packages" + "code.gitea.io/gitea/services/context" ) const ( diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go index 173550ad19..907f0f5061 100644 --- a/routers/web/user/setting/profile.go +++ b/routers/web/user/setting/profile.go @@ -12,26 +12,26 @@ import ( "net/http" "os" "path/filepath" + "slices" "strings" - "time" - "forgejo.org/models/avatars" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" - "forgejo.org/modules/typesniffer" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" - "forgejo.org/services/forms" - user_service "forgejo.org/services/user" + "code.gitea.io/gitea/models/avatars" + "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/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/typesniffer" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + user_service "code.gitea.io/gitea/services/user" ) const ( @@ -41,7 +41,8 @@ const ( tplSettingsRepositories base.TplName = "user/settings/repos" ) -var commonPronouns = []string{"he/him", "she/her", "they/them", "it/its", "any pronouns"} +// must be kept in sync with `web_src/js/features/user-settings.js` +var recognisedPronouns = []string{"", "he/him", "she/her", "they/them", "it/its", "any pronouns"} // Profile render user's profile page func Profile(ctx *context.Context) { @@ -49,8 +50,7 @@ func Profile(ctx *context.Context) { ctx.Data["PageIsSettingsProfile"] = true ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice() ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx) - ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod - ctx.Data["CommonPronouns"] = commonPronouns + ctx.Data["PronounsAreCustom"] = !slices.Contains(recognisedPronouns, ctx.Doer.Pronouns) ctx.HTML(http.StatusOK, tplSettingsProfile) } @@ -61,8 +61,7 @@ func ProfilePost(ctx *context.Context) { ctx.Data["PageIsSettingsProfile"] = true ctx.Data["AllowedUserVisibilityModes"] = setting.Service.AllowedUserVisibilityModesSlice.ToVisibleTypeSlice() ctx.Data["DisableGravatar"] = setting.Config().Picture.DisableGravatar.Value(ctx) - ctx.Data["CooldownPeriod"] = setting.Service.UsernameCooldownPeriod - ctx.Data["CommonPronouns"] = commonPronouns + ctx.Data["PronounsAreCustom"] = !slices.Contains(recognisedPronouns, ctx.Doer.Pronouns) if ctx.HasError() { ctx.HTML(http.StatusOK, tplSettingsProfile) @@ -78,8 +77,6 @@ func ProfilePost(ctx *context.Context) { ctx.Flash.Error(ctx.Tr("form.username_change_not_local_user")) case user_model.IsErrUserAlreadyExist(err): ctx.Flash.Error(ctx.Tr("form.username_been_taken")) - case user_model.IsErrCooldownPeriod(err): - ctx.Flash.Error(ctx.Tr("form.username_claiming_cooldown", err.(user_model.ErrCooldownPeriod).ExpireTime.Format(time.RFC1123Z))) case db.IsErrNameReserved(err): ctx.Flash.Error(ctx.Tr("user.form.name_reserved", form.Name)) case db.IsErrNamePatternNotAllowed(err): @@ -104,7 +101,6 @@ func ProfilePost(ctx *context.Context) { Location: optional.Some(form.Location), Visibility: optional.Some(form.Visibility), KeepActivityPrivate: optional.Some(form.KeepActivityPrivate), - KeepPronounsPrivate: optional.Some(form.KeepPronounsPrivate), } if err := user_service.UpdateUser(ctx, ctx.Doer, opts); err != nil { ctx.ServerError("UpdateUser", err) @@ -329,14 +325,6 @@ func Repos(ctx *context.Context) { func Appearance(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings.appearance") ctx.Data["PageIsSettingsAppearance"] = true - ctx.Data["AllThemes"] = setting.UI.Themes - ctx.Data["ThemeName"] = func(themeName string) string { - fullThemeName := "themes.names." + themeName - if ctx.Locale.HasKey(fullThemeName) { - return ctx.Locale.TrString(fullThemeName) - } - return themeName - } var hiddenCommentTypes *big.Int val, err := user_model.GetUserSetting(ctx, ctx.Doer.ID, user_model.SettingsKeyHiddenCommentTypes) diff --git a/routers/web/user/setting/runner.go b/routers/web/user/setting/runner.go index 5c8bba82a1..2bb10cceb9 100644 --- a/routers/web/user/setting/runner.go +++ b/routers/web/user/setting/runner.go @@ -4,8 +4,8 @@ package setting import ( - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) func RedirectToDefaultSetting(ctx *context.Context) { diff --git a/routers/web/user/setting/security/2fa.go b/routers/web/user/setting/security/2fa.go index f1271c8370..7c85c0e4b7 100644 --- a/routers/web/user/setting/security/2fa.go +++ b/routers/web/user/setting/security/2fa.go @@ -12,13 +12,13 @@ import ( "net/http" "strings" - "forgejo.org/models/auth" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" "github.com/pquerna/otp" "github.com/pquerna/otp/totp" @@ -220,6 +220,11 @@ func EnrollTwoFactorPost(ctx *context.Context) { t = &auth.TwoFactor{ UID: ctx.Doer.ID, } + err = t.SetSecret(secret) + if err != nil { + ctx.ServerError("SettingsTwoFactor: Failed to set secret", err) + return + } token, err := t.GenerateScratchToken() if err != nil { ctx.ServerError("SettingsTwoFactor: Failed to generate scratch token", err) @@ -246,7 +251,7 @@ func EnrollTwoFactorPost(ctx *context.Context) { return } - if err = auth.NewTwoFactor(ctx, t, secret); err != nil { + if err = auth.NewTwoFactor(ctx, t); err != nil { // FIXME: We need to handle a unique constraint fail here it's entirely possible that another request has beaten us. // If there is a unique constraint fail we should just tolerate the error ctx.ServerError("SettingsTwoFactor: Failed to save two factor", err) diff --git a/routers/web/user/setting/security/openid.go b/routers/web/user/setting/security/openid.go index 14660e1646..8f788e1735 100644 --- a/routers/web/user/setting/security/openid.go +++ b/routers/web/user/setting/security/openid.go @@ -6,13 +6,13 @@ package security import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/openid" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/openid" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" ) // OpenIDPost response for change user's openid diff --git a/routers/web/user/setting/security/security.go b/routers/web/user/setting/security/security.go index 8b801cfebd..8d6859ab87 100644 --- a/routers/web/user/setting/security/security.go +++ b/routers/web/user/setting/security/security.go @@ -8,14 +8,14 @@ import ( "net/http" "sort" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/context" + auth_model "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/base" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/context" ) const ( @@ -55,7 +55,7 @@ func DeleteAccountLink(ctx *context.Context) { } func loadSecurityData(ctx *context.Context) { - enrolled, err := auth_model.HasTOTPByUID(ctx, ctx.Doer.ID) + enrolled, err := auth_model.HasTwoFactorByUID(ctx, ctx.Doer.ID) if err != nil { ctx.ServerError("SettingsTwoFactor", err) return diff --git a/routers/web/user/setting/security/webauthn.go b/routers/web/user/setting/security/webauthn.go index a909d479c9..bfbc06c701 100644 --- a/routers/web/user/setting/security/webauthn.go +++ b/routers/web/user/setting/security/webauthn.go @@ -9,14 +9,14 @@ import ( "strconv" "time" - "forgejo.org/models/auth" - wa "forgejo.org/modules/auth/webauthn" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/mailer" + "code.gitea.io/gitea/models/auth" + wa "code.gitea.io/gitea/modules/auth/webauthn" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/mailer" "github.com/go-webauthn/webauthn/protocol" "github.com/go-webauthn/webauthn/webauthn" diff --git a/routers/web/user/setting/storage_overview.go b/routers/web/user/setting/storage_overview.go deleted file mode 100644 index 4586600572..0000000000 --- a/routers/web/user/setting/storage_overview.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package setting - -import ( - "forgejo.org/modules/base" - "forgejo.org/routers/web/shared" - "forgejo.org/services/context" -) - -const ( - tplSettingsStorageOverview base.TplName = "user/settings/storage_overview" -) - -// StorageOverview render a size overview of the user, as well as relevant -// quota limits of the instance. -func StorageOverview(ctx *context.Context) { - shared.StorageOverview(ctx, ctx.Doer.ID, tplSettingsStorageOverview) -} diff --git a/routers/web/user/setting/webhooks.go b/routers/web/user/setting/webhooks.go index bc07accad4..3cc67d9def 100644 --- a/routers/web/user/setting/webhooks.go +++ b/routers/web/user/setting/webhooks.go @@ -6,12 +6,12 @@ package setting import ( "net/http" - "forgejo.org/models/db" - "forgejo.org/models/webhook" - "forgejo.org/modules/base" - "forgejo.org/modules/setting" - "forgejo.org/services/context" - webhook_service "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" + webhook_service "code.gitea.io/gitea/services/webhook" ) const ( diff --git a/routers/web/user/stop_watch.go b/routers/web/user/stop_watch.go index 210b32d205..38f74ea455 100644 --- a/routers/web/user/stop_watch.go +++ b/routers/web/user/stop_watch.go @@ -6,10 +6,10 @@ package user import ( "net/http" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/services/context" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) // GetStopwatches get all stopwatches diff --git a/routers/web/user/task.go b/routers/web/user/task.go index 296c44f809..8476767e9e 100644 --- a/routers/web/user/task.go +++ b/routers/web/user/task.go @@ -7,9 +7,9 @@ import ( "net/http" "strconv" - admin_model "forgejo.org/models/admin" - "forgejo.org/modules/json" - "forgejo.org/services/context" + admin_model "code.gitea.io/gitea/models/admin" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/services/context" ) // TaskStatus returns task's status diff --git a/routers/web/web.go b/routers/web/web.go index 2840ee419a..d0e9081b1c 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -8,46 +8,48 @@ import ( "net/http" "strings" - "forgejo.org/models/perm" - quota_model "forgejo.org/models/quota" - "forgejo.org/models/unit" - "forgejo.org/modules/log" - "forgejo.org/modules/metrics" - "forgejo.org/modules/public" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/structs" - "forgejo.org/modules/templates" - "forgejo.org/modules/validation" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - "forgejo.org/modules/web/routing" - "forgejo.org/routers/common" - "forgejo.org/routers/web/admin" - "forgejo.org/routers/web/auth" - "forgejo.org/routers/web/devtest" - "forgejo.org/routers/web/events" - "forgejo.org/routers/web/explore" - "forgejo.org/routers/web/feed" - "forgejo.org/routers/web/healthcheck" - "forgejo.org/routers/web/misc" - "forgejo.org/routers/web/org" - org_setting "forgejo.org/routers/web/org/setting" - "forgejo.org/routers/web/repo" - "forgejo.org/routers/web/repo/actions" - "forgejo.org/routers/web/repo/badges" - repo_flags "forgejo.org/routers/web/repo/flags" - repo_setting "forgejo.org/routers/web/repo/setting" - "forgejo.org/routers/web/shared/project" - "forgejo.org/routers/web/user" - user_setting "forgejo.org/routers/web/user/setting" - "forgejo.org/routers/web/user/setting/security" - auth_service "forgejo.org/services/auth" - "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/lfs" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/perm" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/metrics" + "code.gitea.io/gitea/modules/public" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/modules/web/routing" + "code.gitea.io/gitea/routers/common" + "code.gitea.io/gitea/routers/web/admin" + "code.gitea.io/gitea/routers/web/auth" + "code.gitea.io/gitea/routers/web/devtest" + "code.gitea.io/gitea/routers/web/events" + "code.gitea.io/gitea/routers/web/explore" + "code.gitea.io/gitea/routers/web/feed" + "code.gitea.io/gitea/routers/web/healthcheck" + "code.gitea.io/gitea/routers/web/misc" + "code.gitea.io/gitea/routers/web/org" + org_setting "code.gitea.io/gitea/routers/web/org/setting" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/routers/web/repo/actions" + "code.gitea.io/gitea/routers/web/repo/badges" + repo_flags "code.gitea.io/gitea/routers/web/repo/flags" + repo_setting "code.gitea.io/gitea/routers/web/repo/setting" + "code.gitea.io/gitea/routers/web/shared/project" + "code.gitea.io/gitea/routers/web/user" + user_setting "code.gitea.io/gitea/routers/web/user/setting" + "code.gitea.io/gitea/routers/web/user/setting/security" + auth_service "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/lfs" - _ "forgejo.org/modules/session" // to registers all internal adapters + _ "code.gitea.io/gitea/modules/session" // to registers all internal adapters "code.forgejo.org/go-chi/captcha" chi_middleware "github.com/go-chi/chi/v5/middleware" @@ -108,6 +110,10 @@ func buildAuthGroup() *auth_service.Group { } group.Add(&auth_service.Session{}) + if setting.IsWindows && auth_model.IsSSPIEnabled(db.DefaultContext) { + group.Add(&auth_service.SSPI{}) // it MUST be the last, see the comment of SSPI + } + return group } @@ -538,7 +544,7 @@ func registerRoutes(m *web.Route) { m.Post("/authorize", web.Bind(forms.AuthorizationForm{}), auth.AuthorizeOAuth) }, ignSignInAndCsrf, reqSignIn) - m.Methods("GET, POST, OPTIONS", "/userinfo", optionsCorsHandler(), ignSignInAndCsrf, auth.InfoOAuth) + m.Methods("GET, OPTIONS", "/userinfo", optionsCorsHandler(), ignSignInAndCsrf, auth.InfoOAuth) m.Methods("POST, OPTIONS", "/access_token", optionsCorsHandler(), web.Bind(forms.AccessTokenForm{}), ignSignInAndCsrf, auth.AccessTokenOAuth) m.Methods("GET, OPTIONS", "/keys", optionsCorsHandler(), ignSignInAndCsrf, auth.OIDCKeys) m.Methods("POST, OPTIONS", "/introspect", optionsCorsHandler(), web.Bind(forms.IntrospectTokenForm{}), ignSignInAndCsrf, auth.IntrospectOAuth) @@ -600,7 +606,6 @@ func registerRoutes(m *web.Route) { m.Combo("").Get(user_setting.Applications). Post(web.Bind(forms.NewAccessTokenForm{}), user_setting.ApplicationsPost) m.Post("/delete", user_setting.DeleteApplication) - m.Post("/regenerate", user_setting.RegenerateApplication) }) m.Combo("/keys").Get(user_setting.Keys). @@ -653,8 +658,7 @@ func registerRoutes(m *web.Route) { m.Get("", user_setting.BlockedUsers) m.Post("/unblock", user_setting.UnblockUser) }) - m.Get("/storage_overview", user_setting.StorageOverview) - }, reqSignIn, ctxDataSet("PageIsUserSettings", true, "EnablePackages", setting.Packages.Enabled, "EnableQuota", setting.Quota.Enabled)) + }, reqSignIn, ctxDataSet("PageIsUserSettings", true, "AllThemes", setting.UI.Themes, "EnablePackages", setting.Packages.Enabled)) m.Group("/user", func() { m.Get("/activate", auth.Activate) @@ -668,7 +672,7 @@ func registerRoutes(m *web.Route) { m.Post("/logout", auth.SignOut) m.Get("/task/{task}", reqSignIn, user.TaskStatus) m.Get("/stopwatches", reqSignIn, user.GetStopwatches) - m.Get("/search_candidates", ignExploreSignIn, user.SearchCandidates) + m.Get("/search", ignExploreSignIn, user.Search) m.Group("/oauth2", func() { m.Get("/{provider}", auth.SignInOAuth) m.Get("/{provider}/callback", auth.SignInOAuthCallback) @@ -940,7 +944,6 @@ func registerRoutes(m *web.Route) { m.Post("/block", org_setting.BlockedUsersBlock) m.Post("/unblock", org_setting.BlockedUsersUnblock) }) - m.Get("/storage_overview", org_setting.StorageOverview) m.Group("/packages", func() { m.Get("", org.Packages) @@ -960,7 +963,7 @@ func registerRoutes(m *web.Route) { m.Post("/rebuild", org.RebuildCargoIndex) }) }, packagesEnabled) - }, ctxDataSet("EnableOAuth2", setting.OAuth2.Enabled, "EnablePackages", setting.Packages.Enabled, "EnableQuota", setting.Quota.Enabled, "PageIsOrgSettings", true)) + }, ctxDataSet("EnableOAuth2", setting.OAuth2.Enabled, "EnablePackages", setting.Packages.Enabled, "PageIsOrgSettings", true)) }, context.OrgAssignment(true, true)) }, reqSignIn) // ***** END: Organization ***** @@ -1160,10 +1163,8 @@ func registerRoutes(m *web.Route) { m.Group("/{type:issues|pulls}", func() { m.Group("/{index}", func() { m.Get("/info", repo.GetIssueInfo) - m.Get("/summary-card", repo.DrawIssueSummaryCard) }) }) - m.Get("/-/summary-card", repo.DrawRepoSummaryCard) }, ignSignIn, context.RepoAssignment, context.UnitTypes()) // for "/{username}/{reponame}" which doesn't require authentication // Grouping for those endpoints that do require authentication @@ -1313,7 +1314,6 @@ func registerRoutes(m *web.Route) { m.Get("/latest", repo.LatestRelease) m.Get(".rss", feedEnabled, repo.ReleasesFeedRSS) m.Get(".atom", feedEnabled, repo.ReleasesFeedAtom) - m.Get("/summary-card/*", repo.DrawReleaseSummaryCard) }, ctxDataSet("EnableFeed", setting.Other.EnableFeed), repo.MustBeNotEmpty, context.RepoRefByType(context.RepoRefTag, true)) m.Get("/releases/attachments/{uuid}", repo.MustBeNotEmpty, repo.GetAttachment) @@ -1582,10 +1582,6 @@ func registerRoutes(m *web.Route) { m.Get("/graph", repo.Graph) m.Get("/commit/{sha:([a-f0-9]{4,64})$}", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.Diff) m.Get("/commit/{sha:([a-f0-9]{4,64})$}/load-branches-and-tags", repo.LoadBranchesAndTags) - m.Group("/commit/{sha:([a-f0-9]{4,64})$}/notes", func() { - m.Post("", web.Bind(forms.CommitNotesForm{}), repo.SetCommitNotes) - m.Post("/remove", repo.RemoveCommitNotes) - }, reqSignIn, reqRepoCodeWriter) m.Get("/cherry-pick/{sha:([a-f0-9]{4,64})$}", repo.SetEditorconfigIfExists, repo.CherryPick) }, repo.MustBeNotEmpty, context.RepoRef(), reqRepoCodeReader) diff --git a/routers/web/webfinger.go b/routers/web/webfinger.go index be3c2925fe..1f3de70db0 100644 --- a/routers/web/webfinger.go +++ b/routers/web/webfinger.go @@ -9,10 +9,10 @@ import ( "net/url" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // https://datatracker.ietf.org/doc/html/draft-ietf-appsawg-webfinger-14#section-4.4 diff --git a/services/actions/auth.go b/services/actions/auth.go index 4dc86a35f3..1ef21f6e0e 100644 --- a/services/actions/auth.go +++ b/services/actions/auth.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "github.com/golang-jwt/jwt/v5" ) diff --git a/services/actions/auth_test.go b/services/actions/auth_test.go index 93a5980bc5..1400e61f47 100644 --- a/services/actions/auth_test.go +++ b/services/actions/auth_test.go @@ -7,8 +7,8 @@ import ( "net/http" "testing" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" "github.com/golang-jwt/jwt/v5" "github.com/stretchr/testify/assert" diff --git a/services/actions/cleanup.go b/services/actions/cleanup.go index fde5286e60..34fa2688e7 100644 --- a/services/actions/cleanup.go +++ b/services/actions/cleanup.go @@ -10,12 +10,12 @@ import ( "os" "time" - actions_model "forgejo.org/models/actions" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" + actions_model "code.gitea.io/gitea/models/actions" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/timeutil" ) // Cleanup removes expired actions logs, data and artifacts diff --git a/services/actions/cleanup_test.go b/services/actions/cleanup_test.go index 67f68d4de9..65fae840c1 100644 --- a/services/actions/cleanup_test.go +++ b/services/actions/cleanup_test.go @@ -6,10 +6,10 @@ package actions import ( "testing" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/timeutil" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/actions/clear_tasks.go b/services/actions/clear_tasks.go index 31e15ec927..67373782d5 100644 --- a/services/actions/clear_tasks.go +++ b/services/actions/clear_tasks.go @@ -8,18 +8,18 @@ import ( "fmt" "time" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/actions" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" ) // StopZombieTasks stops the task which have running status, but haven't been updated for a long time func StopZombieTasks(ctx context.Context) error { return stopTasks(ctx, actions_model.FindTaskOptions{ - Status: []actions_model.Status{actions_model.StatusRunning}, + Status: actions_model.StatusRunning, UpdatedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.ZombieTaskTimeout).Unix()), }) } @@ -27,7 +27,7 @@ func StopZombieTasks(ctx context.Context) error { // StopEndlessTasks stops the tasks which have running status and continuous updates, but don't end for a long time func StopEndlessTasks(ctx context.Context) error { return stopTasks(ctx, actions_model.FindTaskOptions{ - Status: []actions_model.Status{actions_model.StatusRunning}, + Status: actions_model.StatusRunning, StartedBefore: timeutil.TimeStamp(time.Now().Add(-setting.Actions.EndlessTaskTimeout).Unix()), }) } diff --git a/services/actions/commit_status.go b/services/actions/commit_status.go index 1fffa6852f..04dffbac88 100644 --- a/services/actions/commit_status.go +++ b/services/actions/commit_status.go @@ -8,15 +8,15 @@ import ( "fmt" "path" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - user_model "forgejo.org/models/user" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - commitstatus_service "forgejo.org/services/repository/commitstatus" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + user_model "code.gitea.io/gitea/models/user" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" "github.com/nektos/act/pkg/jobparser" ) diff --git a/services/actions/context.go b/services/actions/context.go deleted file mode 100644 index bf187c56bf..0000000000 --- a/services/actions/context.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "context" - "fmt" - - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/container" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" -) - -// GenerateGiteaContext generate the gitea context without token and gitea_runtime_token -// job can be nil when generating a context for parsing workflow-level expressions -func GenerateGiteaContext(run *actions_model.ActionRun, job *actions_model.ActionRunJob) map[string]any { - event := map[string]any{} - _ = json.Unmarshal([]byte(run.EventPayload), &event) - - baseRef := "" - headRef := "" - ref := run.Ref - sha := run.CommitSHA - if pullPayload, err := run.GetPullRequestEventPayload(); err == nil && pullPayload.PullRequest != nil && pullPayload.PullRequest.Base != nil && pullPayload.PullRequest.Head != nil { - baseRef = pullPayload.PullRequest.Base.Ref - headRef = pullPayload.PullRequest.Head.Ref - - // if the TriggerEvent is pull_request_target, ref and sha need to be set according to the base of pull request - // In GitHub's documentation, ref should be the branch or tag that triggered workflow. But when the TriggerEvent is pull_request_target, - // the ref will be the base branch. - if run.TriggerEvent == actions_module.GithubEventPullRequestTarget { - ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name - sha = pullPayload.PullRequest.Base.Sha - } - } - - refName := git.RefName(ref) - - gitContext := map[string]any{ - // standard contexts, see https://docs.github.com/en/actions/learn-github-actions/contexts#github-context - "action": "", // string, The name of the action currently running, or the id of a step. GitHub removes special characters, and uses the name __run when the current step runs a script without an id. If you use the same action more than once in the same job, the name will include a suffix with the sequence number with underscore before it. For example, the first script you run will have the name __run, and the second script will be named __run_2. Similarly, the second invocation of actions/checkout will be actionscheckout2. - "action_path": "", // string, The path where an action is located. This property is only supported in composite actions. You can use this path to access files located in the same repository as the action. - "action_ref": "", // string, For a step executing an action, this is the ref of the action being executed. For example, v2. - "action_repository": "", // string, For a step executing an action, this is the owner and repository name of the action. For example, actions/checkout. - "action_status": "", // string, For a composite action, the current result of the composite action. - "actor": run.TriggerUser.Name, // string, The username of the user that triggered the initial workflow run. If the workflow run is a re-run, this value may differ from github.triggering_actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges. - "api_url": setting.AppURL + "api/v1", // string, The URL of the GitHub REST API. - "base_ref": baseRef, // string, The base_ref or target branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target. - "env": "", // string, Path on the runner to the file that sets environment variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions." - "event": event, // object, The full event webhook payload. You can access individual properties of the event using this context. This object is identical to the webhook payload of the event that triggered the workflow run, and is different for each event. The webhooks for each GitHub Actions event is linked in "Events that trigger workflows." For example, for a workflow run triggered by the push event, this object contains the contents of the push webhook payload. - "event_name": run.TriggerEvent, // string, The name of the event that triggered the workflow run. - "event_path": "", // string, The path to the file on the runner that contains the full event webhook payload. - "graphql_url": "", // string, The URL of the GitHub GraphQL API. - "head_ref": headRef, // string, The head_ref or source branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target. - "job": "", // string, The job_id of the current job. - "ref": ref, // string, The fully-formed ref of the branch or tag that triggered the workflow run. For workflows triggered by push, this is the branch or tag ref that was pushed. For workflows triggered by pull_request, this is the pull request merge branch. For workflows triggered by release, this is the release tag created. For other triggers, this is the branch or tag ref that triggered the workflow run. This is only set if a branch or tag is available for the event type. The ref given is fully-formed, meaning that for branches the format is refs/heads/, for pull requests it is refs/pull//merge, and for tags it is refs/tags/. For example, refs/heads/feature-branch-1. - "ref_name": refName.ShortName(), // string, The short ref name of the branch or tag that triggered the workflow run. This value matches the branch or tag name shown on GitHub. For example, feature-branch-1. - "ref_protected": false, // boolean, true if branch protections are configured for the ref that triggered the workflow run. - "ref_type": refName.RefType(), // string, The type of ref that triggered the workflow run. Valid values are branch or tag. - "path": "", // string, Path on the runner to the file that sets system PATH variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions." - "repository": run.Repo.OwnerName + "/" + run.Repo.Name, // string, The owner and repository name. For example, Codertocat/Hello-World. - "repository_owner": run.Repo.OwnerName, // string, The repository owner's name. For example, Codertocat. - "repositoryUrl": run.Repo.HTMLURL(), // string, The Git URL to the repository. For example, git://github.com/codertocat/hello-world.git. - "retention_days": "", // string, The number of days that workflow run logs and artifacts are kept. - "run_id": "", // string, A unique number for each workflow run within a repository. This number does not change if you re-run the workflow run. - "run_number": fmt.Sprint(run.Index), // string, A unique number for each run of a particular workflow in a repository. This number begins at 1 for the workflow's first run, and increments with each new run. This number does not change if you re-run the workflow run. - "run_attempt": "", // string, A unique number for each attempt of a particular workflow run in a repository. This number begins at 1 for the workflow run's first attempt, and increments with each re-run. - "secret_source": "Actions", // string, The source of a secret used in a workflow. Possible values are None, Actions, Dependabot, or Codespaces. - "server_url": setting.AppURL, // string, The URL of the GitHub server. For example: https://github.com. - "sha": sha, // string, The commit SHA that triggered the workflow. The value of this commit SHA depends on the event that triggered the workflow. For more information, see "Events that trigger workflows." For example, ffac537e6cbbf934b08745a378932722df287a53. - "triggering_actor": "", // string, The username of the user that initiated the workflow run. If the workflow run is a re-run, this value may differ from github.actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges. - "workflow": run.WorkflowID, // string, The name of the workflow. If the workflow file doesn't specify a name, the value of this property is the full path of the workflow file in the repository. - "workspace": "", // string, The default working directory on the runner for steps, and the default location of your repository when using the checkout action. - - // additional contexts - "gitea_default_actions_url": setting.Actions.DefaultActionsURL.URL(), - } - - if job != nil { - gitContext["job"] = job.JobID - gitContext["run_id"] = fmt.Sprint(job.RunID) - gitContext["run_attempt"] = fmt.Sprint(job.Attempt) - } - - return gitContext -} - -type TaskNeed struct { - Result actions_model.Status - Outputs map[string]string -} - -// FindTaskNeeds finds the `needs` for the task by the task's job -func FindTaskNeeds(ctx context.Context, job *actions_model.ActionRunJob) (map[string]*TaskNeed, error) { - if len(job.Needs) == 0 { - return nil, nil - } - needs := container.SetOf(job.Needs...) - - jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: job.RunID}) - if err != nil { - return nil, fmt.Errorf("FindRunJobs: %w", err) - } - - jobIDJobs := make(map[string][]*actions_model.ActionRunJob) - for _, job := range jobs { - jobIDJobs[job.JobID] = append(jobIDJobs[job.JobID], job) - } - - ret := make(map[string]*TaskNeed, len(needs)) - for jobID, jobsWithSameID := range jobIDJobs { - if !needs.Contains(jobID) { - continue - } - var jobOutputs map[string]string - for _, job := range jobsWithSameID { - if job.TaskID == 0 || !job.Status.IsDone() { - // it shouldn't happen, or the job has been rerun - continue - } - got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID) - if err != nil { - return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err) - } - outputs := make(map[string]string, len(got)) - for _, v := range got { - outputs[v.OutputKey] = v.OutputValue - } - if len(jobOutputs) == 0 { - jobOutputs = outputs - } else { - jobOutputs = mergeTwoOutputs(outputs, jobOutputs) - } - } - ret[jobID] = &TaskNeed{ - Outputs: jobOutputs, - Result: actions_model.AggregateJobStatus(jobsWithSameID), - } - } - return ret, nil -} - -// mergeTwoOutputs merges two outputs from two different ActionRunJobs -// Values with the same output name may be overridden. The user should ensure the output names are unique. -// See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#using-job-outputs-in-a-matrix-job -func mergeTwoOutputs(o1, o2 map[string]string) map[string]string { - ret := make(map[string]string, len(o1)) - for k1, v1 := range o1 { - if len(v1) > 0 { - ret[k1] = v1 - } else { - ret[k1] = o2[k1] - } - } - return ret -} diff --git a/services/actions/context_test.go b/services/actions/context_test.go deleted file mode 100644 index c96094ade8..0000000000 --- a/services/actions/context_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "testing" - - actions_model "forgejo.org/models/actions" - "forgejo.org/models/unittest" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestFindTaskNeeds(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 51}) - job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: task.JobID}) - - ret, err := FindTaskNeeds(t.Context(), job) - require.NoError(t, err) - assert.Len(t, ret, 1) - assert.Contains(t, ret, "job1") - assert.Len(t, ret["job1"].Outputs, 2) - assert.Equal(t, "abc", ret["job1"].Outputs["output_a"]) - assert.Equal(t, "bbb", ret["job1"].Outputs["output_b"]) -} diff --git a/services/actions/init.go b/services/actions/init.go index 8f1db64e27..0f49cb6297 100644 --- a/services/actions/init.go +++ b/services/actions/init.go @@ -4,11 +4,11 @@ package actions import ( - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + notify_service "code.gitea.io/gitea/services/notify" ) func Init() { diff --git a/services/actions/interface.go b/services/actions/interface.go index 54a30061bc..d4fa782fec 100644 --- a/services/actions/interface.go +++ b/services/actions/interface.go @@ -3,7 +3,7 @@ package actions -import "forgejo.org/services/context" +import "code.gitea.io/gitea/services/context" // API for actions of a repository or organization type API interface { @@ -25,6 +25,4 @@ type API interface { UpdateVariable(*context.APIContext) // GetRegistrationToken get registration token GetRegistrationToken(*context.APIContext) - // SearchActionRunJobs get pending Action run jobs - SearchActionRunJobs(*context.APIContext) } diff --git a/services/actions/job_emitter.go b/services/actions/job_emitter.go index d4ca029d46..1f859fcf70 100644 --- a/services/actions/job_emitter.go +++ b/services/actions/job_emitter.go @@ -8,10 +8,10 @@ import ( "errors" "fmt" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/modules/graceful" - "forgejo.org/modules/queue" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/queue" "github.com/nektos/act/pkg/jobparser" "xorm.io/builder" diff --git a/services/actions/job_emitter_test.go b/services/actions/job_emitter_test.go index a3e0e95d04..58c2dc3b24 100644 --- a/services/actions/job_emitter_test.go +++ b/services/actions/job_emitter_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - actions_model "forgejo.org/models/actions" + actions_model "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" ) diff --git a/services/actions/main_test.go b/services/actions/main_test.go index 71ec1d3426..ea37ff507a 100644 --- a/services/actions/main_test.go +++ b/services/actions/main_test.go @@ -6,11 +6,10 @@ package actions import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/services/actions/notifier.go b/services/actions/notifier.go index 2d3a1d2107..2dd81158a7 100644 --- a/services/actions/notifier.go +++ b/services/actions/notifier.go @@ -6,20 +6,20 @@ package actions import ( "context" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - perm_model "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/convert" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + 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" + 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/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/convert" + notify_service "code.gitea.io/gitea/services/notify" ) type actionsNotifier struct { diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index 9de0b75ac7..0a1dbb162d 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -11,24 +11,24 @@ import ( "slices" "strings" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/convert" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/json" + "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" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/convert" "github.com/nektos/act/pkg/jobparser" "github.com/nektos/act/pkg/model" diff --git a/services/actions/notifier_helper_test.go b/services/actions/notifier_helper_test.go index 9166dc3b95..0fa40c0168 100644 --- a/services/actions/notifier_helper_test.go +++ b/services/actions/notifier_helper_test.go @@ -6,10 +6,10 @@ package actions import ( "testing" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - webhook_module "forgejo.org/modules/webhook" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/actions/rerun.go b/services/actions/rerun.go index f6dd4af5c7..60f6650905 100644 --- a/services/actions/rerun.go +++ b/services/actions/rerun.go @@ -4,8 +4,8 @@ package actions import ( - actions_model "forgejo.org/models/actions" - "forgejo.org/modules/container" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/container" ) // GetAllRerunJobs get all jobs that need to be rerun when job should be rerun diff --git a/services/actions/rerun_test.go b/services/actions/rerun_test.go index 4b822e8da1..a98de7b788 100644 --- a/services/actions/rerun_test.go +++ b/services/actions/rerun_test.go @@ -6,7 +6,7 @@ package actions import ( "testing" - actions_model "forgejo.org/models/actions" + actions_model "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" ) diff --git a/services/actions/schedule_tasks.go b/services/actions/schedule_tasks.go index f66a6ca092..18f3324fd2 100644 --- a/services/actions/schedule_tasks.go +++ b/services/actions/schedule_tasks.go @@ -8,13 +8,13 @@ import ( "fmt" "time" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" - webhook_module "forgejo.org/modules/webhook" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/nektos/act/pkg/jobparser" ) diff --git a/services/actions/task.go b/services/actions/task.go deleted file mode 100644 index 43c8deaa5f..0000000000 --- a/services/actions/task.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2022 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package actions - -import ( - "context" - "fmt" - - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - secret_model "forgejo.org/models/secret" - - runnerv1 "code.gitea.io/actions-proto-go/runner/v1" - "google.golang.org/protobuf/types/known/structpb" -) - -func PickTask(ctx context.Context, runner *actions_model.ActionRunner) (*runnerv1.Task, bool, error) { - var ( - task *runnerv1.Task - job *actions_model.ActionRunJob - ) - - if err := db.WithTx(ctx, func(ctx context.Context) error { - t, ok, err := actions_model.CreateTaskForRunner(ctx, runner) - if err != nil { - return fmt.Errorf("CreateTaskForRunner: %w", err) - } - if !ok { - return nil - } - - if err := t.LoadAttributes(ctx); err != nil { - return fmt.Errorf("task LoadAttributes: %w", err) - } - job = t.Job - - secrets, err := secret_model.GetSecretsOfTask(ctx, t) - if err != nil { - return fmt.Errorf("GetSecretsOfTask: %w", err) - } - - vars, err := actions_model.GetVariablesOfRun(ctx, t.Job.Run) - if err != nil { - return fmt.Errorf("GetVariablesOfRun: %w", err) - } - - needs, err := findTaskNeeds(ctx, job) - if err != nil { - return fmt.Errorf("findTaskNeeds: %w", err) - } - - taskContext, err := generateTaskContext(t) - if err != nil { - return fmt.Errorf("generateTaskContext: %w", err) - } - - task = &runnerv1.Task{ - Id: t.ID, - WorkflowPayload: t.Job.WorkflowPayload, - Context: taskContext, - Secrets: secrets, - Vars: vars, - Needs: needs, - } - - return nil - }); err != nil { - return nil, false, err - } - - if task == nil { - return nil, false, nil - } - - CreateCommitStatus(ctx, job) - - return task, true, nil -} - -func generateTaskContext(t *actions_model.ActionTask) (*structpb.Struct, error) { - giteaRuntimeToken, err := CreateAuthorizationToken(t.ID, t.Job.RunID, t.JobID) - if err != nil { - return nil, err - } - - gitCtx := GenerateGiteaContext(t.Job.Run, t.Job) - gitCtx["token"] = t.Token - gitCtx["gitea_runtime_token"] = giteaRuntimeToken - - return structpb.NewStruct(gitCtx) -} - -func findTaskNeeds(ctx context.Context, taskJob *actions_model.ActionRunJob) (map[string]*runnerv1.TaskNeed, error) { - taskNeeds, err := FindTaskNeeds(ctx, taskJob) - if err != nil { - return nil, err - } - ret := make(map[string]*runnerv1.TaskNeed, len(taskNeeds)) - for jobID, taskNeed := range taskNeeds { - ret[jobID] = &runnerv1.TaskNeed{ - Outputs: taskNeed.Outputs, - Result: runnerv1.Result(taskNeed.Result), - } - } - return ret, nil -} diff --git a/services/actions/variables.go b/services/actions/variables.go index fed1fd0890..8dde9c4af5 100644 --- a/services/actions/variables.go +++ b/services/actions/variables.go @@ -8,10 +8,10 @@ import ( "regexp" "strings" - actions_model "forgejo.org/models/actions" - "forgejo.org/modules/log" - "forgejo.org/modules/util" - secret_service "forgejo.org/services/secrets" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" + secret_service "code.gitea.io/gitea/services/secrets" ) func CreateVariable(ctx context.Context, ownerID, repoID int64, name, data string) (*actions_model.ActionVariable, error) { @@ -31,7 +31,7 @@ func CreateVariable(ctx context.Context, ownerID, repoID int64, name, data strin return v, nil } -func UpdateVariable(ctx context.Context, variableID, ownerID, repoID int64, name, data string) (bool, error) { +func UpdateVariable(ctx context.Context, variableID int64, name, data string) (bool, error) { if err := secret_service.ValidateName(name); err != nil { return false, err } @@ -41,14 +41,16 @@ func UpdateVariable(ctx context.Context, variableID, ownerID, repoID int64, name } return actions_model.UpdateVariable(ctx, &actions_model.ActionVariable{ - ID: variableID, - Name: strings.ToUpper(name), - Data: util.ReserveLineBreakForTextarea(data), - OwnerID: ownerID, - RepoID: repoID, + ID: variableID, + Name: strings.ToUpper(name), + Data: util.ReserveLineBreakForTextarea(data), }) } +func DeleteVariableByID(ctx context.Context, variableID int64) error { + return actions_model.DeleteVariable(ctx, variableID) +} + func DeleteVariableByName(ctx context.Context, ownerID, repoID int64, name string) error { if err := secret_service.ValidateName(name); err != nil { return err @@ -67,8 +69,7 @@ func DeleteVariableByName(ctx context.Context, ownerID, repoID int64, name strin return err } - _, err = actions_model.DeleteVariable(ctx, v.ID, ownerID, repoID) - return err + return actions_model.DeleteVariable(ctx, v.ID) } func GetVariable(ctx context.Context, opts actions_model.FindVariablesOpts) (*actions_model.ActionVariable, error) { diff --git a/services/actions/workflows.go b/services/actions/workflows.go index 7ec7c3abed..e2fb31622a 100644 --- a/services/actions/workflows.go +++ b/services/actions/workflows.go @@ -10,19 +10,18 @@ import ( "fmt" "strconv" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/perm" - "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/user" - "forgejo.org/modules/actions" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/modules/webhook" - "forgejo.org/services/convert" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/convert" "github.com/nektos/act/pkg/jobparser" act_model "github.com/nektos/act/pkg/model" @@ -50,15 +49,15 @@ type Workflow struct { type InputValueGetter func(key string) string -func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGetter, repo *repo_model.Repository, doer *user.User) (r *actions_model.ActionRun, j []string, err error) { +func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGetter, repo *repo_model.Repository, doer *user.User) error { content, err := actions.GetContentFromEntry(entry.GitEntry) if err != nil { - return nil, nil, err + return err } wf, err := act_model.ReadWorkflow(bytes.NewReader(content)) if err != nil { - return nil, nil, err + return err } fullWorkflowID := ".forgejo/workflows/" + entry.WorkflowID @@ -80,7 +79,7 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette if len(name) == 0 { name = key } - return nil, nil, InputRequiredErr{Name: name} + return InputRequiredErr{Name: name} } continue } @@ -93,11 +92,9 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette } if int64(len(inputs)) > setting.Actions.LimitDispatchInputs { - return nil, nil, errors.New("to many inputs") + return errors.New("to many inputs") } - jobNames := util.KeysOfMap(wf.Jobs) - payload := &structs.WorkflowDispatchPayload{ Inputs: inputs, Ref: entry.Ref, @@ -108,7 +105,7 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette p, err := json.Marshal(payload) if err != nil { - return nil, nil, err + return err } run := &actions_model.ActionRun{ @@ -129,15 +126,15 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette vars, err := actions_model.GetVariablesOfRun(ctx, run) if err != nil { - return nil, nil, err + return err } jobs, err := jobparser.Parse(content, jobparser.WithVars(vars)) if err != nil { - return nil, nil, err + return err } - return run, jobNames, actions_model.InsertRun(ctx, run, jobs) + return actions_model.InsertRun(ctx, run, jobs) } func GetWorkflowFromCommit(gitRepo *git.Repository, ref, workflowID string) (*Workflow, error) { diff --git a/services/agit/agit.go b/services/agit/agit.go index 20e87642c3..a18f9ef728 100644 --- a/services/agit/agit.go +++ b/services/agit/agit.go @@ -9,15 +9,15 @@ import ( "os" "strings" - 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/git/pushoptions" - "forgejo.org/modules/log" - "forgejo.org/modules/private" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" + 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/git/pushoptions" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" ) // ProcReceive handle proc receive work diff --git a/services/asymkey/deploy_key.go b/services/asymkey/deploy_key.go index 4a2cb53eec..e127cbfc6e 100644 --- a/services/asymkey/deploy_key.go +++ b/services/asymkey/deploy_key.go @@ -6,10 +6,10 @@ package asymkey import ( "context" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" ) // DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed. diff --git a/services/asymkey/main_test.go b/services/asymkey/main_test.go index 8ba76668b1..3505b26f69 100644 --- a/services/asymkey/main_test.go +++ b/services/asymkey/main_test.go @@ -6,11 +6,10 @@ package asymkey import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/services/asymkey/sign.go b/services/asymkey/sign.go index 0030523b22..8fb569939c 100644 --- a/services/asymkey/sign.go +++ b/services/asymkey/sign.go @@ -8,18 +8,18 @@ import ( "fmt" "strings" - 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" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" + 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" + 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" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" ) type signingMode string diff --git a/services/asymkey/ssh_key.go b/services/asymkey/ssh_key.go index f20445891d..83d7edafa3 100644 --- a/services/asymkey/ssh_key.go +++ b/services/asymkey/ssh_key.go @@ -6,9 +6,9 @@ package asymkey import ( "context" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" ) // DeletePublicKey deletes SSH key information both in database and authorized_keys file. diff --git a/services/asymkey/ssh_key_test.go b/services/asymkey/ssh_key_test.go index 24b28d295e..d667a02557 100644 --- a/services/asymkey/ssh_key_test.go +++ b/services/asymkey/ssh_key_test.go @@ -6,11 +6,11 @@ package asymkey import ( "testing" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/attachment/attachment.go b/services/attachment/attachment.go index 365bd7faf6..c911945e5d 100644 --- a/services/attachment/attachment.go +++ b/services/attachment/attachment.go @@ -9,12 +9,12 @@ import ( "fmt" "io" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/services/context/upload" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/services/context/upload" "github.com/google/uuid" ) diff --git a/services/attachment/attachment_test.go b/services/attachment/attachment_test.go index 70b1e80d6a..fe861c6dc8 100644 --- a/services/attachment/attachment_test.go +++ b/services/attachment/attachment_test.go @@ -8,13 +8,12 @@ import ( "path/filepath" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/auth/auth.go b/services/auth/auth.go index d0fa725854..ddd31917e2 100644 --- a/services/auth/auth.go +++ b/services/auth/auth.go @@ -10,15 +10,15 @@ import ( "regexp" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/webauthn" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/session" - "forgejo.org/modules/setting" - "forgejo.org/modules/web/middleware" - gitea_context "forgejo.org/services/context" - user_service "forgejo.org/services/user" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/webauthn" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/session" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web/middleware" + gitea_context "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" ) // Init should be called exactly once when the application starts to allow plugins diff --git a/services/auth/auth_test.go b/services/auth/auth_test.go index a6c6c74022..3adaa28664 100644 --- a/services/auth/auth_test.go +++ b/services/auth/auth_test.go @@ -8,7 +8,7 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) func Test_isGitRawOrLFSPath(t *testing.T) { diff --git a/services/auth/basic.go b/services/auth/basic.go index 7adcd8914a..8e8fbfc9c7 100644 --- a/services/auth/basic.go +++ b/services/auth/basic.go @@ -9,15 +9,15 @@ import ( "net/http" "strings" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/modules/web/middleware" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web/middleware" ) // Ensure the struct implements the interface. diff --git a/services/auth/group.go b/services/auth/group.go index b713301b50..aecf43cb24 100644 --- a/services/auth/group.go +++ b/services/auth/group.go @@ -7,7 +7,7 @@ import ( "net/http" "strings" - user_model "forgejo.org/models/user" + user_model "code.gitea.io/gitea/models/user" ) // Ensure the struct implements the interface. diff --git a/services/auth/httpsign.go b/services/auth/httpsign.go index d3cbb8aa60..b604349f80 100644 --- a/services/auth/httpsign.go +++ b/services/auth/httpsign.go @@ -11,13 +11,13 @@ import ( "net/http" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/setting" - "github.com/42wim/httpsig" + "github.com/go-fed/httpsig" "golang.org/x/crypto/ssh" ) @@ -205,7 +205,7 @@ func doVerify(verifier httpsig.Verifier, sshPublicKeys []ssh.PublicKey) error { case strings.HasPrefix(publicKey.Type(), "ssh-ed25519"): algos = []httpsig.Algorithm{httpsig.ED25519} case strings.HasPrefix(publicKey.Type(), "ssh-rsa"): - algos = []httpsig.Algorithm{httpsig.RSA_SHA256, httpsig.RSA_SHA512} + algos = []httpsig.Algorithm{httpsig.RSA_SHA1, httpsig.RSA_SHA256, httpsig.RSA_SHA512} } for _, algo := range algos { if err := verifier.Verify(cryptoPubkey, algo); err == nil { diff --git a/services/auth/interface.go b/services/auth/interface.go index 12b04a7abf..ece28af12d 100644 --- a/services/auth/interface.go +++ b/services/auth/interface.go @@ -7,9 +7,9 @@ import ( "context" "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/session" - "forgejo.org/modules/web/middleware" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/session" + "code.gitea.io/gitea/modules/web/middleware" ) // DataStore represents a data store diff --git a/services/auth/main_test.go b/services/auth/main_test.go index 0e6315b06e..b81c39a1f2 100644 --- a/services/auth/main_test.go +++ b/services/auth/main_test.go @@ -6,7 +6,7 @@ package auth import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/services/auth/oauth2.go b/services/auth/oauth2.go index e6d556d10b..b983e57ecd 100644 --- a/services/auth/oauth2.go +++ b/services/auth/oauth2.go @@ -11,15 +11,15 @@ import ( "strings" "time" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/actions" - "forgejo.org/services/auth/source/oauth2" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + 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/timeutil" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/services/auth/source/oauth2" ) // Ensure the struct implements the interface. diff --git a/services/auth/oauth2_test.go b/services/auth/oauth2_test.go index d6455b33ad..c9b4ed06cc 100644 --- a/services/auth/oauth2_test.go +++ b/services/auth/oauth2_test.go @@ -4,12 +4,13 @@ package auth import ( + "context" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/actions" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -26,7 +27,7 @@ func TestUserIDFromToken(t *testing.T) { ds := make(middleware.ContextData) o := OAuth2{} - uid := o.userIDFromToken(t.Context(), token, ds) + uid := o.userIDFromToken(context.Background(), token, ds) assert.Equal(t, int64(user_model.ActionsUserID), uid) assert.Equal(t, true, ds["IsActionsToken"]) assert.Equal(t, ds["ActionsTaskID"], int64(RunningTaskID)) @@ -47,7 +48,7 @@ func TestCheckTaskIsRunning(t *testing.T) { for name := range cases { c := cases[name] t.Run(name, func(t *testing.T) { - actual := CheckTaskIsRunning(t.Context(), c.TaskID) + actual := CheckTaskIsRunning(context.Background(), c.TaskID) assert.Equal(t, c.Expected, actual) }) } diff --git a/services/auth/reverseproxy.go b/services/auth/reverseproxy.go index eb9ceb8cf2..8a5a5dc992 100644 --- a/services/auth/reverseproxy.go +++ b/services/auth/reverseproxy.go @@ -8,11 +8,11 @@ import ( "net/http" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/web/middleware" + 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/web/middleware" gouuid "github.com/google/uuid" ) diff --git a/services/auth/reverseproxy_test.go b/services/auth/reverseproxy_test.go index 70ce1f8b0b..7f1b2a7782 100644 --- a/services/auth/reverseproxy_test.go +++ b/services/auth/reverseproxy_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "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/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/require" ) diff --git a/services/auth/session.go b/services/auth/session.go index a15c24c940..35d97e42da 100644 --- a/services/auth/session.go +++ b/services/auth/session.go @@ -6,8 +6,8 @@ package auth import ( "net/http" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" ) // Ensure the struct implements the interface. diff --git a/services/auth/signin.go b/services/auth/signin.go index 495b3d387e..e116a088e0 100644 --- a/services/auth/signin.go +++ b/services/auth/signin.go @@ -7,17 +7,18 @@ import ( "context" "strings" - "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/services/auth/source/oauth2" - "forgejo.org/services/auth/source/smtp" + "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/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/services/auth/source/oauth2" + "code.gitea.io/gitea/services/auth/source/smtp" - _ "forgejo.org/services/auth/source/db" // register the sources (and below) - _ "forgejo.org/services/auth/source/ldap" // register the ldap source - _ "forgejo.org/services/auth/source/pam" // register the pam source + _ "code.gitea.io/gitea/services/auth/source/db" // register the sources (and below) + _ "code.gitea.io/gitea/services/auth/source/ldap" // register the ldap source + _ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source + _ "code.gitea.io/gitea/services/auth/source/sspi" // register the sspi source ) // UserSignIn validates user name and password. diff --git a/services/auth/source.go b/services/auth/source.go index b13554efde..69b71a6dea 100644 --- a/services/auth/source.go +++ b/services/auth/source.go @@ -6,9 +6,9 @@ package auth import ( "context" - "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" ) // DeleteSource deletes a AuthSource record in DB. diff --git a/services/auth/source/db/assert_interface_test.go b/services/auth/source/db/assert_interface_test.go index 1422e9693c..62387c78f0 100644 --- a/services/auth/source/db/assert_interface_test.go +++ b/services/auth/source/db/assert_interface_test.go @@ -4,9 +4,9 @@ package db_test import ( - auth_model "forgejo.org/models/auth" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/db" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/db" ) // This test file exists to assert that our Source exposes the interfaces that we expect diff --git a/services/auth/source/db/authenticate.go b/services/auth/source/db/authenticate.go index 7c18540a10..8160141863 100644 --- a/services/auth/source/db/authenticate.go +++ b/services/auth/source/db/authenticate.go @@ -7,9 +7,9 @@ import ( "context" "fmt" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // ErrUserPasswordNotSet represents a "ErrUserPasswordNotSet" kind of error. diff --git a/services/auth/source/db/source.go b/services/auth/source/db/source.go index d158718bb2..bb2270cbd6 100644 --- a/services/auth/source/db/source.go +++ b/services/auth/source/db/source.go @@ -6,8 +6,8 @@ package db import ( "context" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" ) // Source is a password authentication service diff --git a/services/auth/source/ldap/assert_interface_test.go b/services/auth/source/ldap/assert_interface_test.go index 859143a3f8..33347687dc 100644 --- a/services/auth/source/ldap/assert_interface_test.go +++ b/services/auth/source/ldap/assert_interface_test.go @@ -4,9 +4,9 @@ package ldap_test import ( - auth_model "forgejo.org/models/auth" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/ldap" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/ldap" ) // This test file exists to assert that our Source exposes the interfaces that we expect diff --git a/services/auth/source/ldap/source.go b/services/auth/source/ldap/source.go index a094c1410c..ba407b351a 100644 --- a/services/auth/source/ldap/source.go +++ b/services/auth/source/ldap/source.go @@ -6,10 +6,10 @@ package ldap import ( "strings" - "forgejo.org/models/auth" - "forgejo.org/modules/json" - "forgejo.org/modules/secret" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/secret" + "code.gitea.io/gitea/modules/setting" ) // .____ ________ _____ __________ diff --git a/services/auth/source/ldap/source_authenticate.go b/services/auth/source/ldap/source_authenticate.go index a2ff10cd07..68ecd16342 100644 --- a/services/auth/source/ldap/source_authenticate.go +++ b/services/auth/source/ldap/source_authenticate.go @@ -8,13 +8,13 @@ import ( "fmt" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - auth_module "forgejo.org/modules/auth" - "forgejo.org/modules/optional" - source_service "forgejo.org/services/auth/source" - user_service "forgejo.org/services/user" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + auth_module "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/optional" + source_service "code.gitea.io/gitea/services/auth/source" + user_service "code.gitea.io/gitea/services/user" ) // Authenticate queries if login/password is valid against the LDAP directory pool, diff --git a/services/auth/source/ldap/source_search.go b/services/auth/source/ldap/source_search.go index da7e225428..2a61386ae1 100644 --- a/services/auth/source/ldap/source_search.go +++ b/services/auth/source/ldap/source_search.go @@ -11,8 +11,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/container" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" "github.com/go-ldap/ldap/v3" ) diff --git a/services/auth/source/ldap/source_sync.go b/services/auth/source/ldap/source_sync.go index cb6172ed1d..1f70edaa82 100644 --- a/services/auth/source/ldap/source_sync.go +++ b/services/auth/source/ldap/source_sync.go @@ -8,16 +8,16 @@ import ( "fmt" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - auth_module "forgejo.org/modules/auth" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - source_service "forgejo.org/services/auth/source" - user_service "forgejo.org/services/user" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" + auth_module "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + source_service "code.gitea.io/gitea/services/auth/source" + user_service "code.gitea.io/gitea/services/user" ) // Sync causes this ldap source to synchronize its users with the db diff --git a/services/auth/source/oauth2/assert_interface_test.go b/services/auth/source/oauth2/assert_interface_test.go index 12fce257cf..56fe0e4aa8 100644 --- a/services/auth/source/oauth2/assert_interface_test.go +++ b/services/auth/source/oauth2/assert_interface_test.go @@ -4,9 +4,9 @@ package oauth2_test import ( - auth_model "forgejo.org/models/auth" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/oauth2" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/oauth2" ) // This test file exists to assert that our Source exposes the interfaces that we expect diff --git a/services/auth/source/oauth2/init.go b/services/auth/source/oauth2/init.go index 6c78a14da4..5c25681548 100644 --- a/services/auth/source/oauth2/init.go +++ b/services/auth/source/oauth2/init.go @@ -9,11 +9,11 @@ import ( "net/http" "sync" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" "github.com/google/uuid" "github.com/gorilla/sessions" diff --git a/services/auth/source/oauth2/jwtsigningkey.go b/services/auth/source/oauth2/jwtsigningkey.go index 550945a812..92adfc4d84 100644 --- a/services/auth/source/oauth2/jwtsigningkey.go +++ b/services/auth/source/oauth2/jwtsigningkey.go @@ -18,9 +18,9 @@ import ( "path/filepath" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/golang-jwt/jwt/v5" ) diff --git a/services/auth/source/oauth2/jwtsigningkey_test.go b/services/auth/source/oauth2/jwtsigningkey_test.go index 7cf2833696..4db538b0e8 100644 --- a/services/auth/source/oauth2/jwtsigningkey_test.go +++ b/services/auth/source/oauth2/jwtsigningkey_test.go @@ -13,8 +13,8 @@ import ( "path/filepath" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/auth/source/oauth2/providers.go b/services/auth/source/oauth2/providers.go index 773ce19c12..f2c1bb4894 100644 --- a/services/auth/source/oauth2/providers.go +++ b/services/auth/source/oauth2/providers.go @@ -12,11 +12,11 @@ import ( "net/url" "sort" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" "github.com/markbates/goth" ) diff --git a/services/auth/source/oauth2/providers_base.go b/services/auth/source/oauth2/providers_base.go index 1ef8d0af72..9d4ab106e5 100644 --- a/services/auth/source/oauth2/providers_base.go +++ b/services/auth/source/oauth2/providers_base.go @@ -6,8 +6,8 @@ package oauth2 import ( "html/template" - "forgejo.org/modules/log" - "forgejo.org/modules/svg" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/svg" ) // BaseProvider represents a common base for Provider @@ -48,8 +48,4 @@ func (b *BaseProvider) CustomURLSettings() *CustomURLSettings { return nil } -func (b *BaseProvider) CanProvideSSHKeys() bool { - return false -} - var _ Provider = &BaseProvider{} diff --git a/services/auth/source/oauth2/providers_custom.go b/services/auth/source/oauth2/providers_custom.go index 51a412e0be..65cf538ad7 100644 --- a/services/auth/source/oauth2/providers_custom.go +++ b/services/auth/source/oauth2/providers_custom.go @@ -4,7 +4,7 @@ package oauth2 import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/markbates/goth" "github.com/markbates/goth/providers/azureadv2" diff --git a/services/auth/source/oauth2/providers_openid.go b/services/auth/source/oauth2/providers_openid.go index 7950506ab7..285876d5ac 100644 --- a/services/auth/source/oauth2/providers_openid.go +++ b/services/auth/source/oauth2/providers_openid.go @@ -6,9 +6,9 @@ package oauth2 import ( "html/template" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/svg" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/svg" "github.com/markbates/goth" "github.com/markbates/goth/providers/openidConnect" @@ -51,10 +51,6 @@ func (o *OpenIDProvider) CustomURLSettings() *CustomURLSettings { return nil } -func (o *OpenIDProvider) CanProvideSSHKeys() bool { - return true -} - var _ GothProvider = &OpenIDProvider{} func init() { diff --git a/services/auth/source/oauth2/providers_simple.go b/services/auth/source/oauth2/providers_simple.go index 8e2c0a7700..e95323a62a 100644 --- a/services/auth/source/oauth2/providers_simple.go +++ b/services/auth/source/oauth2/providers_simple.go @@ -4,7 +4,7 @@ package oauth2 import ( - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/markbates/goth" "github.com/markbates/goth/providers/azuread" diff --git a/services/auth/source/oauth2/source.go b/services/auth/source/oauth2/source.go index 5245f88270..675005e55a 100644 --- a/services/auth/source/oauth2/source.go +++ b/services/auth/source/oauth2/source.go @@ -4,10 +4,8 @@ package oauth2 import ( - "strings" - - "forgejo.org/models/auth" - "forgejo.org/modules/json" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" ) // Source holds configuration for the OAuth2 login source. @@ -19,16 +17,15 @@ type Source struct { CustomURLMapping *CustomURLMapping IconURL string - Scopes []string - AttributeSSHPublicKey string - RequiredClaimName string - RequiredClaimValue string - GroupClaimName string - AdminGroup string - GroupTeamMap string - GroupTeamMapRemoval bool - RestrictedGroup string - SkipLocalTwoFA bool `json:",omitempty"` + Scopes []string + RequiredClaimName string + RequiredClaimValue string + GroupClaimName string + AdminGroup string + GroupTeamMap string + GroupTeamMapRemoval bool + RestrictedGroup string + SkipLocalTwoFA bool `json:",omitempty"` // reference to the authSource authSource *auth.Source @@ -44,11 +41,6 @@ func (source *Source) ToDB() ([]byte, error) { return json.Marshal(source) } -// ProvidesSSHKeys returns if this source provides SSH Keys -func (source *Source) ProvidesSSHKeys() bool { - return len(strings.TrimSpace(source.AttributeSSHPublicKey)) > 0 -} - // SetAuthSource sets the related AuthSource func (source *Source) SetAuthSource(authSource *auth.Source) { source.authSource = authSource diff --git a/services/auth/source/oauth2/source_authenticate.go b/services/auth/source/oauth2/source_authenticate.go index 1efd7be02a..bbda35dee0 100644 --- a/services/auth/source/oauth2/source_authenticate.go +++ b/services/auth/source/oauth2/source_authenticate.go @@ -6,8 +6,8 @@ package oauth2 import ( "context" - user_model "forgejo.org/models/user" - "forgejo.org/services/auth/source/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/services/auth/source/db" ) // Authenticate falls back to the db authenticator diff --git a/services/auth/source/oauth2/store.go b/services/auth/source/oauth2/store.go index d52581ea2d..e031653119 100644 --- a/services/auth/source/oauth2/store.go +++ b/services/auth/source/oauth2/store.go @@ -8,8 +8,8 @@ import ( "fmt" "net/http" - "forgejo.org/modules/log" - session_module "forgejo.org/modules/session" + "code.gitea.io/gitea/modules/log" + session_module "code.gitea.io/gitea/modules/session" chiSession "code.forgejo.org/go-chi/session" "github.com/gorilla/sessions" diff --git a/services/auth/source/oauth2/token.go b/services/auth/source/oauth2/token.go index fba1fd8a01..3405619d3f 100644 --- a/services/auth/source/oauth2/token.go +++ b/services/auth/source/oauth2/token.go @@ -7,7 +7,7 @@ import ( "fmt" "time" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/modules/timeutil" "github.com/golang-jwt/jwt/v5" ) diff --git a/services/auth/source/pam/assert_interface_test.go b/services/auth/source/pam/assert_interface_test.go index 8c54b7e9e2..8e7648b8d3 100644 --- a/services/auth/source/pam/assert_interface_test.go +++ b/services/auth/source/pam/assert_interface_test.go @@ -4,9 +4,9 @@ package pam_test import ( - auth_model "forgejo.org/models/auth" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/pam" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/pam" ) // This test file exists to assert that our Source exposes the interfaces that we expect diff --git a/services/auth/source/pam/source.go b/services/auth/source/pam/source.go index e1dc83ba43..96b182e185 100644 --- a/services/auth/source/pam/source.go +++ b/services/auth/source/pam/source.go @@ -4,8 +4,8 @@ package pam import ( - "forgejo.org/models/auth" - "forgejo.org/modules/json" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" ) // __________ _____ _____ diff --git a/services/auth/source/pam/source_authenticate.go b/services/auth/source/pam/source_authenticate.go index 6f3ffc2d9d..addd1bd2c9 100644 --- a/services/auth/source/pam/source_authenticate.go +++ b/services/auth/source/pam/source_authenticate.go @@ -8,12 +8,11 @@ import ( "fmt" "strings" - "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/auth/pam" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/auth/pam" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" "github.com/google/uuid" ) @@ -40,13 +39,13 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u if idx > -1 { username = pamLogin[:idx] } - if validation.ValidateEmail(email) != nil { + if user_model.ValidateEmail(email) != nil { if source.EmailDomain != "" { email = fmt.Sprintf("%s@%s", username, source.EmailDomain) } else { email = fmt.Sprintf("%s@%s", username, setting.Service.NoReplyAddress) } - if validation.ValidateEmail(email) != nil { + if user_model.ValidateEmail(email) != nil { email = uuid.New().String() + "@localhost" } } diff --git a/services/auth/source/remote/source.go b/services/auth/source/remote/source.go index effbabc7d0..4165858a56 100644 --- a/services/auth/source/remote/source.go +++ b/services/auth/source/remote/source.go @@ -4,8 +4,8 @@ package remote import ( - "forgejo.org/models/auth" - "forgejo.org/modules/json" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" ) type Source struct { diff --git a/services/auth/source/smtp/assert_interface_test.go b/services/auth/source/smtp/assert_interface_test.go index 6826dae873..6c9cde66e1 100644 --- a/services/auth/source/smtp/assert_interface_test.go +++ b/services/auth/source/smtp/assert_interface_test.go @@ -4,9 +4,9 @@ package smtp_test import ( - auth_model "forgejo.org/models/auth" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/smtp" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/smtp" ) // This test file exists to assert that our Source exposes the interfaces that we expect diff --git a/services/auth/source/smtp/source.go b/services/auth/source/smtp/source.go index d44971bab0..2a648e421e 100644 --- a/services/auth/source/smtp/source.go +++ b/services/auth/source/smtp/source.go @@ -4,8 +4,8 @@ package smtp import ( - "forgejo.org/models/auth" - "forgejo.org/modules/json" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" ) // _________ __________________________ diff --git a/services/auth/source/smtp/source_authenticate.go b/services/auth/source/smtp/source_authenticate.go index 3d7ccd0669..1f0a61c789 100644 --- a/services/auth/source/smtp/source_authenticate.go +++ b/services/auth/source/smtp/source_authenticate.go @@ -10,10 +10,10 @@ import ( "net/textproto" "strings" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/util" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/util" ) // Authenticate queries if the provided login/password is authenticates against the SMTP server diff --git a/services/auth/source/source_group_sync.go b/services/auth/source/source_group_sync.go index 46be6937fb..3a2411ec55 100644 --- a/services/auth/source/source_group_sync.go +++ b/services/auth/source/source_group_sync.go @@ -7,11 +7,11 @@ import ( "context" "fmt" - "forgejo.org/models" - "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models" + "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/log" ) type syncType int diff --git a/services/auth/source/sspi/assert_interface_test.go b/services/auth/source/sspi/assert_interface_test.go new file mode 100644 index 0000000000..03d836dd6f --- /dev/null +++ b/services/auth/source/sspi/assert_interface_test.go @@ -0,0 +1,18 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package sspi_test + +import ( + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/services/auth/source/sspi" +) + +// This test file exists to assert that our Source exposes the interfaces that we expect +// It tightly binds the interfaces and implementation without breaking go import cycles + +type sourceInterface interface { + auth.Config +} + +var _ (sourceInterface) = &sspi.Source{} diff --git a/services/auth/source/sspi/source.go b/services/auth/source/sspi/source.go new file mode 100644 index 0000000000..bdd6ef451c --- /dev/null +++ b/services/auth/source/sspi/source.go @@ -0,0 +1,39 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package sspi + +import ( + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" +) + +// _________ ___________________.___ +// / _____// _____/\______ \ | +// \_____ \ \_____ \ | ___/ | +// / \/ \ | | | | +// /_______ /_______ / |____| |___| +// \/ \/ + +// Source holds configuration for SSPI single sign-on. +type Source struct { + AutoCreateUsers bool + AutoActivateUsers bool + StripDomainNames bool + SeparatorReplacement string + DefaultLanguage string +} + +// FromDB fills up an SSPIConfig from serialized format. +func (cfg *Source) FromDB(bs []byte) error { + return json.UnmarshalHandleDoubleEncode(bs, &cfg) +} + +// ToDB exports an SSPIConfig to a serialized format. +func (cfg *Source) ToDB() ([]byte, error) { + return json.Marshal(cfg) +} + +func init() { + auth.RegisterTypeConfig(auth.SSPI, &Source{}) +} diff --git a/services/auth/sspi.go b/services/auth/sspi.go new file mode 100644 index 0000000000..64a127e97a --- /dev/null +++ b/services/auth/sspi.go @@ -0,0 +1,223 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package auth + +import ( + "context" + "errors" + "net/http" + "strings" + "sync" + + "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/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/auth/source/sspi" + gitea_context "code.gitea.io/gitea/services/context" + + gouuid "github.com/google/uuid" +) + +const ( + tplSignIn base.TplName = "user/auth/signin" +) + +type SSPIAuth interface { + AppendAuthenticateHeader(w http.ResponseWriter, data string) + Authenticate(r *http.Request, w http.ResponseWriter) (userInfo *SSPIUserInfo, outToken string, err error) +} + +var ( + sspiAuth SSPIAuth // a global instance of the websspi authenticator to avoid acquiring the server credential handle on every request + sspiAuthOnce sync.Once + sspiAuthErrInit error + + // Ensure the struct implements the interface. + _ Method = &SSPI{} +) + +// SSPI implements the SingleSignOn interface and authenticates requests +// via the built-in SSPI module in Windows for SPNEGO authentication. +// The SSPI plugin is expected to be executed last, as it returns 401 status code if negotiation +// fails (or if negotiation should continue), which would prevent other authentication methods +// to execute at all. +type SSPI struct{} + +// Name represents the name of auth method +func (s *SSPI) Name() string { + return "sspi" +} + +// Verify uses SSPI (Windows implementation of SPNEGO) to authenticate the request. +// If authentication is successful, returns the corresponding user object. +// If negotiation should continue or authentication fails, immediately returns a 401 HTTP +// response code, as required by the SPNEGO protocol. +func (s *SSPI) Verify(req *http.Request, w http.ResponseWriter, store DataStore, sess SessionStore) (*user_model.User, error) { + sspiAuthOnce.Do(func() { sspiAuthErrInit = sspiAuthInit() }) + if sspiAuthErrInit != nil { + return nil, sspiAuthErrInit + } + if !s.shouldAuthenticate(req) { + return nil, nil + } + + cfg, err := s.getConfig(req.Context()) + if err != nil { + log.Error("could not get SSPI config: %v", err) + return nil, err + } + + log.Trace("SSPI Authorization: Attempting to authenticate") + userInfo, outToken, err := sspiAuth.Authenticate(req, w) + if err != nil { + log.Warn("Authentication failed with error: %v\n", err) + sspiAuth.AppendAuthenticateHeader(w, outToken) + + // Include the user login page in the 401 response to allow the user + // to login with another authentication method if SSPI authentication + // fails + store.GetData()["Flash"] = map[string]string{ + "ErrorMsg": err.Error(), + } + store.GetData()["EnableOpenIDSignIn"] = setting.Service.EnableOpenIDSignIn + store.GetData()["EnableSSPI"] = true + // in this case, the Verify function is called in Gitea's web context + // FIXME: it doesn't look good to render the page here, why not redirect? + gitea_context.GetWebContext(req).HTML(http.StatusUnauthorized, tplSignIn) + return nil, err + } + if outToken != "" { + sspiAuth.AppendAuthenticateHeader(w, outToken) + } + + username := sanitizeUsername(userInfo.Username, cfg) + if len(username) == 0 { + return nil, nil + } + log.Info("Authenticated as %s\n", username) + + user, err := user_model.GetUserByName(req.Context(), username) + if err != nil { + if !user_model.IsErrUserNotExist(err) { + log.Error("GetUserByName: %v", err) + return nil, err + } + if !cfg.AutoCreateUsers { + log.Error("User '%s' not found", username) + return nil, nil + } + user, err = s.newUser(req.Context(), username, cfg) + if err != nil { + log.Error("CreateUser: %v", err) + return nil, err + } + } + + // Make sure requests to API paths and PWA resources do not create a new session + if !middleware.IsAPIPath(req) && !isAttachmentDownload(req) { + handleSignIn(w, req, sess, user) + } + + log.Trace("SSPI Authorization: Logged in user %-v", user) + return user, nil +} + +// getConfig retrieves the SSPI configuration from login sources +func (s *SSPI) getConfig(ctx context.Context) (*sspi.Source, error) { + sources, err := db.Find[auth.Source](ctx, auth.FindSourcesOptions{ + IsActive: optional.Some(true), + LoginType: auth.SSPI, + }) + if err != nil { + return nil, err + } + if len(sources) == 0 { + return nil, errors.New("no active login sources of type SSPI found") + } + if len(sources) > 1 { + return nil, errors.New("more than one active login source of type SSPI found") + } + return sources[0].Cfg.(*sspi.Source), nil +} + +func (s *SSPI) shouldAuthenticate(req *http.Request) (shouldAuth bool) { + shouldAuth = false + path := strings.TrimSuffix(req.URL.Path, "/") + if path == "/user/login" { + if req.FormValue("user_name") != "" && req.FormValue("password") != "" { + shouldAuth = false + } else if req.FormValue("auth_with_sspi") == "1" { + shouldAuth = true + } + } else if middleware.IsAPIPath(req) || isAttachmentDownload(req) { + shouldAuth = true + } + return shouldAuth +} + +// newUser creates a new user object for the purpose of automatic registration +// and populates its name and email with the information present in request headers. +func (s *SSPI) newUser(ctx context.Context, username string, cfg *sspi.Source) (*user_model.User, error) { + email := gouuid.New().String() + "@localhost.localdomain" + user := &user_model.User{ + Name: username, + Email: email, + Language: cfg.DefaultLanguage, + } + emailNotificationPreference := user_model.EmailNotificationsDisabled + overwriteDefault := &user_model.CreateUserOverwriteOptions{ + IsActive: optional.Some(cfg.AutoActivateUsers), + KeepEmailPrivate: optional.Some(true), + EmailNotificationsPreference: &emailNotificationPreference, + } + if err := user_model.CreateUser(ctx, user, overwriteDefault); err != nil { + return nil, err + } + + return user, nil +} + +// stripDomainNames removes NETBIOS domain name and separator from down-level logon names +// (eg. "DOMAIN\user" becomes "user"), and removes the UPN suffix (domain name) and separator +// from UPNs (eg. "user@domain.local" becomes "user") +func stripDomainNames(username string) string { + if strings.Contains(username, "\\") { + parts := strings.SplitN(username, "\\", 2) + if len(parts) > 1 { + username = parts[1] + } + } else if strings.Contains(username, "@") { + parts := strings.Split(username, "@") + if len(parts) > 1 { + username = parts[0] + } + } + return username +} + +func replaceSeparators(username string, cfg *sspi.Source) string { + newSep := cfg.SeparatorReplacement + username = strings.ReplaceAll(username, "\\", newSep) + username = strings.ReplaceAll(username, "/", newSep) + username = strings.ReplaceAll(username, "@", newSep) + return username +} + +func sanitizeUsername(username string, cfg *sspi.Source) string { + if len(username) == 0 { + return "" + } + if cfg.StripDomainNames { + username = stripDomainNames(username) + } + // Replace separators even if we have already stripped the domain name part, + // as the username can contain several separators: eg. "MICROSOFT\useremail@live.com" + username = replaceSeparators(username, cfg) + return username +} diff --git a/services/auth/sspiauth_posix.go b/services/auth/sspiauth_posix.go new file mode 100644 index 0000000000..49b0ed4a52 --- /dev/null +++ b/services/auth/sspiauth_posix.go @@ -0,0 +1,30 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build !windows + +package auth + +import ( + "errors" + "net/http" +) + +type SSPIUserInfo struct { + Username string // Name of user, usually in the form DOMAIN\User + Groups []string // The global groups the user is a member of +} + +type sspiAuthMock struct{} + +func (s sspiAuthMock) AppendAuthenticateHeader(w http.ResponseWriter, data string) { +} + +func (s sspiAuthMock) Authenticate(r *http.Request, w http.ResponseWriter) (userInfo *SSPIUserInfo, outToken string, err error) { + return nil, "", errors.New("not implemented") +} + +func sspiAuthInit() error { + sspiAuth = &sspiAuthMock{} // TODO: we can mock the SSPI auth in tests + return nil +} diff --git a/services/auth/sspiauth_windows.go b/services/auth/sspiauth_windows.go new file mode 100644 index 0000000000..093caaed33 --- /dev/null +++ b/services/auth/sspiauth_windows.go @@ -0,0 +1,19 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//go:build windows + +package auth + +import ( + "github.com/quasoft/websspi" +) + +type SSPIUserInfo = websspi.UserInfo + +func sspiAuthInit() error { + var err error + config := websspi.NewConfig() + sspiAuth, err = websspi.New(config) + return err +} diff --git a/services/auth/sync.go b/services/auth/sync.go index c594be7a24..7562ac812b 100644 --- a/services/auth/sync.go +++ b/services/auth/sync.go @@ -6,9 +6,9 @@ package auth import ( "context" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" ) // SyncExternalUsers is used to synchronize users with external authorization source diff --git a/services/automerge/automerge.go b/services/automerge/automerge.go index 51a14edd9a..a1ee204882 100644 --- a/services/automerge/automerge.go +++ b/services/automerge/automerge.go @@ -7,34 +7,37 @@ import ( "context" "errors" "fmt" + "strconv" + "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - 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/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/queue" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" - shared_automerge "forgejo.org/services/shared/automerge" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + access_model "code.gitea.io/gitea/models/perm/access" + 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/gitrepo" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/queue" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" ) +// prAutoMergeQueue represents a queue to handle update pull request tests +var prAutoMergeQueue *queue.WorkerPoolQueue[string] + // Init runs the task queue to that handles auto merges func Init() error { notify_service.RegisterNotifier(NewNotifier()) - shared_automerge.PRAutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler) - if shared_automerge.PRAutoMergeQueue == nil { + prAutoMergeQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "pr_auto_merge", handler) + if prAutoMergeQueue == nil { return fmt.Errorf("unable to create pr_auto_merge queue") } - go graceful.GetManager().RunWithCancel(shared_automerge.PRAutoMergeQueue) + go graceful.GetManager().RunWithCancel(prAutoMergeQueue) return nil } @@ -52,10 +55,17 @@ func handler(items ...string) []string { return nil } +func addToQueue(pr *issues_model.PullRequest, sha string) { + log.Trace("Adding pullID: %d to the pull requests patch checking queue with sha %s", pr.ID, sha) + if err := prAutoMergeQueue.Push(fmt.Sprintf("%d_%s", pr.ID, sha)); err != nil { + log.Error("Error adding pullID: %d to the pull requests patch checking queue %v", pr.ID, err) + } +} + // ScheduleAutoMerge if schedule is false and no error, pull can be merged directly -func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string, deleteBranch bool) (scheduled bool, err error) { +func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string) (scheduled bool, err error) { err = db.WithTx(ctx, func(ctx context.Context) error { - if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message, deleteBranch); err != nil { + if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message); err != nil { return err } scheduled = true @@ -80,12 +90,94 @@ func RemoveScheduledAutoMerge(ctx context.Context, doer *user_model.User, pull * // StartPRCheckAndAutoMergeBySHA start an automerge check and auto merge task for all pull requests of repository and SHA func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_model.Repository) error { - return shared_automerge.StartPRCheckAndAutoMergeBySHA(ctx, sha, repo) + pulls, err := getPullRequestsByHeadSHA(ctx, sha, repo, func(pr *issues_model.PullRequest) bool { + return !pr.HasMerged && pr.CanAutoMerge() + }) + if err != nil { + return err + } + + for _, pr := range pulls { + addToQueue(pr, sha) + } + + return nil } // StartPRCheckAndAutoMerge start an automerge check and auto merge task for a pull request func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullRequest) { - shared_automerge.StartPRCheckAndAutoMerge(ctx, pull) + if pull == nil || pull.HasMerged || !pull.CanAutoMerge() { + return + } + + if err := pull.LoadBaseRepo(ctx); err != nil { + log.Error("LoadBaseRepo: %v", err) + return + } + + gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo) + if err != nil { + log.Error("OpenRepository: %v", err) + return + } + defer gitRepo.Close() + commitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName()) + if err != nil { + log.Error("GetRefCommitID: %v", err) + return + } + + addToQueue(pull, commitID) +} + +func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) { + gitRepo, err := gitrepo.OpenRepository(ctx, repo) + if err != nil { + return nil, err + } + defer gitRepo.Close() + + refs, err := gitRepo.GetRefsBySha(sha, "") + if err != nil { + return nil, err + } + + pulls := make(map[int64]*issues_model.PullRequest) + + for _, ref := range refs { + // Each pull branch starts with refs/pull/ we then go from there to find the index of the pr and then + // use that to get the pr. + if strings.HasPrefix(ref, git.PullPrefix) { + parts := strings.Split(ref[len(git.PullPrefix):], "/") + + // e.g. 'refs/pull/1/head' would be []string{"1", "head"} + if len(parts) != 2 { + log.Error("getPullRequestsByHeadSHA found broken pull ref [%s] on repo [%-v]", ref, repo) + continue + } + + prIndex, err := strconv.ParseInt(parts[0], 10, 64) + if err != nil { + log.Error("getPullRequestsByHeadSHA found broken pull ref [%s] on repo [%-v]", ref, repo) + continue + } + + p, err := issues_model.GetPullRequestByIndex(ctx, repo.ID, prIndex) + if err != nil { + // If there is no pull request for this branch, we don't try to merge it. + if issues_model.IsErrPullRequestNotExist(err) { + continue + } + return nil, err + } + + if filter(p) { + pulls[p.ID] = p + } + } + } + + return pulls, nil } // handlePullRequestAutoMerge merge the pull request if all checks are successful @@ -211,11 +303,4 @@ func handlePullRequestAutoMerge(pullID int64, sha string) { // on the pull request page. But this should not be finished in a bug fix PR which will be backport to release branch. return } - - if scheduledPRM.DeleteBranchAfterMerge { - err := repo_service.DeleteBranchAfterMerge(ctx, doer, pr, headGitRepo) - if err != nil { - log.Error("%d repo_service.DeleteBranchIfUnused: %v", pr.ID, err) - } - } } diff --git a/services/automerge/notify.go b/services/automerge/notify.go index 3b5eae9d48..cb078214f6 100644 --- a/services/automerge/notify.go +++ b/services/automerge/notify.go @@ -6,10 +6,10 @@ package automerge import ( "context" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + notify_service "code.gitea.io/gitea/services/notify" ) type automergeNotifier struct { diff --git a/services/context/access_log.go b/services/context/access_log.go index 7a54b746f6..0926748ac5 100644 --- a/services/context/access_log.go +++ b/services/context/access_log.go @@ -12,10 +12,10 @@ import ( "text/template" "time" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web/middleware" + 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/web/middleware" ) type routerLoggerOptions struct { diff --git a/services/context/api.go b/services/context/api.go index 37f0e0f559..396ceb520f 100644 --- a/services/context/api.go +++ b/services/context/api.go @@ -11,18 +11,18 @@ import ( "net/url" "strings" - issues_model "forgejo.org/models/issues" - quota_model "forgejo.org/models/quota" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - mc "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/web" - web_types "forgejo.org/modules/web/types" + issues_model "code.gitea.io/gitea/models/issues" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + mc "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/web" + web_types "code.gitea.io/gitea/modules/web/types" "code.forgejo.org/go-chi/cache" ) @@ -157,17 +157,6 @@ type swaggerAPIRepoArchivedError struct { Body APIRepoArchivedError `json:"body"` } -type APIInternalServerError struct { - APIError -} - -// APIInternalServerError is an error that is raised when an internal server error occurs -// swagger:response internalServerError -type swaggerAPIInternalServerError struct { - // in:body - Body APIInternalServerError `json:"body"` -} - // ServerError responds with error message, status is 500 func (ctx *APIContext) ServerError(title string, err error) { ctx.Error(http.StatusInternalServerError, title, err) @@ -364,11 +353,6 @@ func RepoRefForAPI(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { ctx := GetAPIContext(req) - if ctx.Repo.Repository.IsEmpty { - ctx.NotFound(fmt.Errorf("repository is empty")) - return - } - if ctx.Repo.GitRepo == nil { ctx.InternalServerError(fmt.Errorf("no open git repo")) return diff --git a/services/context/api_org.go b/services/context/api_org.go index acc9594e48..dad02b1719 100644 --- a/services/context/api_org.go +++ b/services/context/api_org.go @@ -3,7 +3,7 @@ package context -import "forgejo.org/models/organization" +import "code.gitea.io/gitea/models/organization" // APIOrganization contains organization and team type APIOrganization struct { diff --git a/services/context/api_test.go b/services/context/api_test.go index 90e4d5ec65..6064fee1c3 100644 --- a/services/context/api_test.go +++ b/services/context/api_test.go @@ -8,7 +8,7 @@ import ( "strconv" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/context/base.go b/services/context/base.go index 0275ea8a99..0259e0d806 100644 --- a/services/context/base.go +++ b/services/context/base.go @@ -14,12 +14,12 @@ import ( "strings" "time" - "forgejo.org/modules/httplib" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/translation" - "forgejo.org/modules/web/middleware" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/web/middleware" "github.com/go-chi/chi/v5" ) diff --git a/services/context/base_test.go b/services/context/base_test.go index 868ac00f8b..823f20e00b 100644 --- a/services/context/base_test.go +++ b/services/context/base_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/services/context/captcha.go b/services/context/captcha.go index 8ae8bdcae3..da837acb00 100644 --- a/services/context/captcha.go +++ b/services/context/captcha.go @@ -7,14 +7,14 @@ import ( "fmt" "sync" - "forgejo.org/modules/base" - "forgejo.org/modules/cache" - "forgejo.org/modules/hcaptcha" - "forgejo.org/modules/log" - "forgejo.org/modules/mcaptcha" - "forgejo.org/modules/recaptcha" - "forgejo.org/modules/setting" - "forgejo.org/modules/turnstile" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/hcaptcha" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/mcaptcha" + "code.gitea.io/gitea/modules/recaptcha" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/turnstile" mc "code.forgejo.org/go-chi/cache" "code.forgejo.org/go-chi/captcha" diff --git a/services/context/context.go b/services/context/context.go index 91484c5ba3..91e7b1849d 100644 --- a/services/context/context.go +++ b/services/context/context.go @@ -15,17 +15,17 @@ import ( "strings" "time" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - mc "forgejo.org/modules/cache" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/httpcache" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/translation" - "forgejo.org/modules/web" - "forgejo.org/modules/web/middleware" - web_types "forgejo.org/modules/web/types" + "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" + mc "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/httpcache" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/modules/web/middleware" + web_types "code.gitea.io/gitea/modules/web/types" "code.forgejo.org/go-chi/cache" "code.forgejo.org/go-chi/session" diff --git a/services/context/context_cookie.go b/services/context/context_cookie.go index 08ef84b5eb..3699f81071 100644 --- a/services/context/context_cookie.go +++ b/services/context/context_cookie.go @@ -7,11 +7,11 @@ import ( "net/http" "strings" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/web/middleware" + auth_model "code.gitea.io/gitea/models/auth" + 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/web/middleware" ) const CookieNameFlash = "gitea_flash" diff --git a/services/context/context_model.go b/services/context/context_model.go index 1a8751ee63..4f70aac516 100644 --- a/services/context/context_model.go +++ b/services/context/context_model.go @@ -4,7 +4,7 @@ package context import ( - "forgejo.org/models/unit" + "code.gitea.io/gitea/models/unit" ) // IsUserSiteAdmin returns true if current user is a site admin diff --git a/services/context/context_response.go b/services/context/context_response.go index e20e7dd852..f36b834a44 100644 --- a/services/context/context_response.go +++ b/services/context/context_response.go @@ -16,13 +16,13 @@ import ( "syscall" "time" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/httplib" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/web/middleware" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/web/middleware" ) // RedirectToUser redirect to a differently-named user diff --git a/services/context/context_test.go b/services/context/context_test.go index c2a271d2b7..033ce2ef0a 100644 --- a/services/context/context_test.go +++ b/services/context/context_test.go @@ -8,7 +8,7 @@ import ( "net/http/httptest" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/services/context/csrf.go b/services/context/csrf.go index 82dd9283ff..e0518a499b 100644 --- a/services/context/csrf.go +++ b/services/context/csrf.go @@ -25,8 +25,8 @@ import ( "strconv" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) const ( @@ -49,7 +49,7 @@ type csrfProtector struct { opt CsrfOptions // id must be unique per user. id string - // token is the valid one which will be used by end user and passed via header, cookie, or hidden form value. + // token is the valid one which wil be used by end user and passed via header, cookie, or hidden form value. token string } diff --git a/services/context/org.go b/services/context/org.go index 31ad60704f..018b76de43 100644 --- a/services/context/org.go +++ b/services/context/org.go @@ -7,14 +7,14 @@ package context import ( "strings" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/organization" + "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/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" ) // Organization contains organization context @@ -26,6 +26,7 @@ type Organization struct { Organization *organization.Organization OrgLink string CanCreateOrgRepo bool + PublicMemberOnly bool // Only display public members Team *organization.Team Teams []*organization.Team @@ -175,10 +176,10 @@ func HandleOrgAssignment(ctx *Context, args ...bool) { ctx.Data["OrgLink"] = ctx.Org.OrgLink // Member + ctx.Org.PublicMemberOnly = ctx.Doer == nil || !ctx.Org.IsMember && !ctx.Doer.IsAdmin opts := &organization.FindOrgMembersOpts{ - Doer: ctx.Doer, - OrgID: org.ID, - IsDoerMember: ctx.Org.IsMember, + OrgID: org.ID, + PublicOnly: ctx.Org.PublicMemberOnly, } ctx.Data["NumMembers"], err = organization.CountOrgMembers(ctx, opts) if err != nil { diff --git a/services/context/package.go b/services/context/package.go index e597249e2a..c452c657e7 100644 --- a/services/context/package.go +++ b/services/context/package.go @@ -7,14 +7,14 @@ import ( "fmt" "net/http" - "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - "forgejo.org/models/perm" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/templates" + "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + "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/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/templates" ) // Package contains owner, access mode and optional the package descriptor diff --git a/services/context/pagination.go b/services/context/pagination.go index b826e59dea..655a278f9f 100644 --- a/services/context/pagination.go +++ b/services/context/pagination.go @@ -9,7 +9,7 @@ import ( "net/url" "strings" - "forgejo.org/modules/paginator" + "code.gitea.io/gitea/modules/paginator" ) // Pagination provides a pagination via paginator.Paginator and additional configurations for the link params used in rendering diff --git a/services/context/permission.go b/services/context/permission.go index b6af87f912..14a9801dcc 100644 --- a/services/context/permission.go +++ b/services/context/permission.go @@ -6,10 +6,10 @@ package context import ( "net/http" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/log" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" ) // RequireRepoAdmin returns a middleware for requiring repository admin permission diff --git a/services/context/private.go b/services/context/private.go index 3d7ed694f1..8b41949f60 100644 --- a/services/context/private.go +++ b/services/context/private.go @@ -9,10 +9,10 @@ import ( "net/http" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/process" - "forgejo.org/modules/web" - web_types "forgejo.org/modules/web/types" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/web" + web_types "code.gitea.io/gitea/modules/web/types" ) // PrivateContext represents a context for private routes diff --git a/services/context/quota.go b/services/context/quota.go index f6e79e1ebe..94e8847696 100644 --- a/services/context/quota.go +++ b/services/context/quota.go @@ -8,8 +8,8 @@ import ( "net/http" "strings" - quota_model "forgejo.org/models/quota" - "forgejo.org/modules/base" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/modules/base" ) type QuotaTargetType int diff --git a/services/context/repo.go b/services/context/repo.go index a1e1cadf6c..d2cee086d6 100644 --- a/services/context/repo.go +++ b/services/context/repo.go @@ -15,26 +15,25 @@ import ( "path" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/card" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - asymkey_service "forgejo.org/services/asymkey" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + 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/gitrepo" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + asymkey_service "code.gitea.io/gitea/services/asymkey" "github.com/editorconfig/editorconfig-core-go/v2" ) @@ -414,7 +413,14 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) { } } + pushMirrors, _, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) + if err != nil { + ctx.ServerError("GetPushMirrorsByRepoID", err) + return + } + ctx.Repo.Repository = repo + ctx.Data["PushMirrors"] = pushMirrors ctx.Data["RepoName"] = ctx.Repo.Repository.Name ctx.Data["IsEmptyRepo"] = ctx.Repo.Repository.IsEmpty ctx.Data["DefaultWikiBranchName"] = setting.Repository.DefaultBranch @@ -633,16 +639,6 @@ func RepoAssignment(ctx *Context) context.CancelFunc { ctx.Data["IsStaringRepo"] = repo_model.IsStaring(ctx, ctx.Doer.ID, repo.ID) } - cardWidth, cardHeight := card.DefaultSize() - ctx.Data["OpenGraphTitle"] = repo.Name - ctx.Data["OpenGraphURL"] = repo.HTMLURL() - ctx.Data["OpenGraphType"] = "object" - ctx.Data["OpenGraphDescription"] = repo.Description - ctx.Data["OpenGraphImageURL"] = repo.SummaryCardURL() - ctx.Data["OpenGraphImageWidth"] = cardWidth - ctx.Data["OpenGraphImageHeight"] = cardHeight - ctx.Data["OpenGraphImageAltText"] = ctx.Tr("repo.summary_card_alt", repo.FullName()) - if repo.IsFork { RetrieveBaseRepo(ctx, repo) if ctx.Written() { @@ -937,9 +933,6 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string { // of repository reference func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context) context.CancelFunc { return func(ctx *Context) (cancel context.CancelFunc) { - if ctx.Repo.Repository.IsBeingCreated() { - return nil // no git repo, so do nothing - } // Empty repository does not have reference information. if ctx.Repo.Repository.IsEmpty { // assume the user is viewing the (non-existent) default branch diff --git a/services/context/repository.go b/services/context/repository.go index 7eef2c5068..422ac3f58d 100644 --- a/services/context/repository.go +++ b/services/context/repository.go @@ -6,7 +6,7 @@ package context import ( "net/http" - repo_model "forgejo.org/models/repo" + repo_model "code.gitea.io/gitea/models/repo" ) // RepositoryIDAssignmentAPI returns a middleware to handle context-repo assignment for api routes diff --git a/services/context/response.go b/services/context/response.go index 8fc631e671..2f271f211b 100644 --- a/services/context/response.go +++ b/services/context/response.go @@ -6,7 +6,7 @@ package context import ( "net/http" - web_types "forgejo.org/modules/web/types" + web_types "code.gitea.io/gitea/modules/web/types" ) // ResponseWriter represents a response writer for HTTP diff --git a/services/context/upload/upload.go b/services/context/upload/upload.go index 2fa177e604..77a7eb9377 100644 --- a/services/context/upload/upload.go +++ b/services/context/upload/upload.go @@ -11,9 +11,9 @@ import ( "regexp" "strings" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/context" ) // ErrFileTypeForbidden not allowed file type error diff --git a/services/context/user.go b/services/context/user.go index a82c90d7a6..4c9cd2928b 100644 --- a/services/context/user.go +++ b/services/context/user.go @@ -8,7 +8,7 @@ import ( "net/http" "strings" - user_model "forgejo.org/models/user" + user_model "code.gitea.io/gitea/models/user" ) // UserAssignmentWeb returns a middleware to handle context-user assignment for web routes diff --git a/services/contexttest/context_tests.go b/services/contexttest/context_tests.go index ebab04f620..7c829f3598 100644 --- a/services/contexttest/context_tests.go +++ b/services/contexttest/context_tests.go @@ -15,16 +15,16 @@ import ( "testing" "time" - org_model "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/templates" - "forgejo.org/modules/translation" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + org_model "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/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" diff --git a/services/convert/activity.go b/services/convert/activity.go index 213db13772..01fef73e58 100644 --- a/services/convert/activity.go +++ b/services/convert/activity.go @@ -6,12 +6,12 @@ package convert import ( "context" - activities_model "forgejo.org/models/activities" - perm_model "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" + activities_model "code.gitea.io/gitea/models/activities" + perm_model "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" ) func ToActivity(ctx context.Context, ac *activities_model.Action, doer *user_model.User) *api.Activity { diff --git a/services/convert/attachment.go b/services/convert/attachment.go index 6617aac906..d632c94c18 100644 --- a/services/convert/attachment.go +++ b/services/convert/attachment.go @@ -4,8 +4,8 @@ package convert import ( - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" ) func WebAssetDownloadURL(repo *repo_model.Repository, attach *repo_model.Attachment) string { diff --git a/services/convert/convert.go b/services/convert/convert.go index 2ea24a1b51..7a094494e4 100644 --- a/services/convert/convert.go +++ b/services/convert/convert.go @@ -11,24 +11,24 @@ import ( "strings" "time" - actions_model "forgejo.org/models/actions" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "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/container" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/gitdiff" + actions_model "code.gitea.io/gitea/models/actions" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/auth" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + "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/container" + "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/util" + "code.gitea.io/gitea/services/gitdiff" ) // ToEmail convert models.EmailAddress to api.Email diff --git a/services/convert/git_commit.go b/services/convert/git_commit.go index e041361737..e0efcddbcb 100644 --- a/services/convert/git_commit.go +++ b/services/convert/git_commit.go @@ -8,14 +8,14 @@ import ( "net/url" "time" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - ctx "forgejo.org/services/context" - "forgejo.org/services/gitdiff" + 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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + ctx "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/gitdiff" ) // ToCommitUser convert a git.Signature to an api.CommitUser diff --git a/services/convert/git_commit_test.go b/services/convert/git_commit_test.go index 463b93aac3..68d1b05168 100644 --- a/services/convert/git_commit_test.go +++ b/services/convert/git_commit_test.go @@ -7,11 +7,11 @@ import ( "testing" "time" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/convert/issue.go b/services/convert/issue.go index c7803794d0..f514dc4313 100644 --- a/services/convert/issue.go +++ b/services/convert/issue.go @@ -9,13 +9,13 @@ import ( "net/url" "strings" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/label" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" + 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/label" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" ) func ToIssue(ctx context.Context, doer *user_model.User, issue *issues_model.Issue) *api.Issue { diff --git a/services/convert/issue_comment.go b/services/convert/issue_comment.go index 9ea315aee6..9ec9ac7684 100644 --- a/services/convert/issue_comment.go +++ b/services/convert/issue_comment.go @@ -6,12 +6,12 @@ package convert import ( "context" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + 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/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" ) // ToAPIComment converts a issues_model.Comment to the api.Comment format for API usage diff --git a/services/convert/issue_test.go b/services/convert/issue_test.go index 97bacfb229..0aeb3e5612 100644 --- a/services/convert/issue_test.go +++ b/services/convert/issue_test.go @@ -8,12 +8,12 @@ import ( "testing" "time" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/convert/main_test.go b/services/convert/main_test.go index 5915d16be4..363cc4a97f 100644 --- a/services/convert/main_test.go +++ b/services/convert/main_test.go @@ -6,10 +6,9 @@ package convert import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/services/convert/mirror.go b/services/convert/mirror.go index 9e7d2659ab..85e0d1c856 100644 --- a/services/convert/mirror.go +++ b/services/convert/mirror.go @@ -6,8 +6,8 @@ package convert import ( "context" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" ) // ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse diff --git a/services/convert/notification.go b/services/convert/notification.go index 3a4239e0fe..41063cf399 100644 --- a/services/convert/notification.go +++ b/services/convert/notification.go @@ -7,10 +7,10 @@ import ( "context" "net/url" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - api "forgejo.org/modules/structs" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + api "code.gitea.io/gitea/modules/structs" ) // ToNotificationThread convert a Notification to api.NotificationThread diff --git a/services/convert/package.go b/services/convert/package.go index a28e60e1b1..b5fca21a3c 100644 --- a/services/convert/package.go +++ b/services/convert/package.go @@ -6,10 +6,10 @@ package convert import ( "context" - "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/packages" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" ) // ToPackage convert a packages.PackageDescriptor to api.Package diff --git a/services/convert/pull.go b/services/convert/pull.go index ca965a0d18..4ec24a8276 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -7,15 +7,15 @@ import ( "context" "fmt" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + 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/gitrepo" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" ) // ToAPIPullRequest assumes following fields have been assigned with valid values: @@ -29,11 +29,6 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u err error ) - if err = pr.LoadIssue(ctx); err != nil { - log.Error("pr.LoadIssue[%d]: %v", pr.ID, err) - return nil - } - if err = pr.Issue.LoadRepo(ctx); err != nil { log.Error("pr.Issue.LoadRepo[%d]: %v", pr.ID, err) return nil @@ -66,36 +61,33 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u } apiPullRequest := &api.PullRequest{ - ID: pr.ID, - URL: pr.Issue.HTMLURL(), - Index: pr.Index, - Poster: apiIssue.Poster, - Title: apiIssue.Title, - Body: apiIssue.Body, - Labels: apiIssue.Labels, - Milestone: apiIssue.Milestone, - Assignee: apiIssue.Assignee, - Assignees: apiIssue.Assignees, - State: apiIssue.State, - Draft: pr.IsWorkInProgress(ctx), - IsLocked: apiIssue.IsLocked, - Comments: apiIssue.Comments, - ReviewComments: pr.GetReviewCommentsCount(ctx), - HTMLURL: pr.Issue.HTMLURL(), - DiffURL: pr.Issue.DiffURL(), - PatchURL: pr.Issue.PatchURL(), - HasMerged: pr.HasMerged, - MergeBase: pr.MergeBase, - Mergeable: pr.Mergeable(ctx), - Deadline: apiIssue.Deadline, - Created: pr.Issue.CreatedUnix.AsTimePtr(), - Updated: pr.Issue.UpdatedUnix.AsTimePtr(), - PinOrder: apiIssue.PinOrder, - RequestedReviewers: []*api.User{}, - RequestedReviewersTeams: []*api.Team{}, + ID: pr.ID, + URL: pr.Issue.HTMLURL(), + Index: pr.Index, + Poster: apiIssue.Poster, + Title: apiIssue.Title, + Body: apiIssue.Body, + Labels: apiIssue.Labels, + Milestone: apiIssue.Milestone, + Assignee: apiIssue.Assignee, + Assignees: apiIssue.Assignees, + State: apiIssue.State, + Draft: pr.IsWorkInProgress(ctx), + IsLocked: apiIssue.IsLocked, + Comments: apiIssue.Comments, + ReviewComments: pr.GetReviewCommentsCount(ctx), + HTMLURL: pr.Issue.HTMLURL(), + DiffURL: pr.Issue.DiffURL(), + PatchURL: pr.Issue.PatchURL(), + HasMerged: pr.HasMerged, + MergeBase: pr.MergeBase, + Mergeable: pr.Mergeable(ctx), + Deadline: apiIssue.Deadline, + Created: pr.Issue.CreatedUnix.AsTimePtr(), + Updated: pr.Issue.UpdatedUnix.AsTimePtr(), + PinOrder: apiIssue.PinOrder, AllowMaintainerEdit: pr.AllowMaintainerEdit, - Flow: int64(pr.Flow), Base: &api.PRBranchInfo{ Name: pr.BaseBranch, diff --git a/services/convert/pull_review.go b/services/convert/pull_review.go index 08ccc0e1fc..f7990e7a5c 100644 --- a/services/convert/pull_review.go +++ b/services/convert/pull_review.go @@ -7,9 +7,9 @@ import ( "context" "strings" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" ) // ToPullReview convert a review to api format diff --git a/services/convert/pull_test.go b/services/convert/pull_test.go index 3e4875fc60..1339ed5cc0 100644 --- a/services/convert/pull_test.go +++ b/services/convert/pull_test.go @@ -6,15 +6,15 @@ package convert import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "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" - "forgejo.org/modules/git" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "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" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/convert/quota.go b/services/convert/quota.go index ba729feaac..791cd8e038 100644 --- a/services/convert/quota.go +++ b/services/convert/quota.go @@ -7,12 +7,12 @@ import ( "context" "strconv" - action_model "forgejo.org/models/actions" - issue_model "forgejo.org/models/issues" - package_model "forgejo.org/models/packages" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" + action_model "code.gitea.io/gitea/models/actions" + issue_model "code.gitea.io/gitea/models/issues" + package_model "code.gitea.io/gitea/models/packages" + quota_model "code.gitea.io/gitea/models/quota" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" ) func ToQuotaRuleInfo(rule quota_model.Rule, withName bool) api.QuotaRuleInfo { diff --git a/services/convert/release.go b/services/convert/release.go index 7773cf3b19..8c0f61b56c 100644 --- a/services/convert/release.go +++ b/services/convert/release.go @@ -6,8 +6,8 @@ package convert import ( "context" - repo_model "forgejo.org/models/repo" - api "forgejo.org/modules/structs" + repo_model "code.gitea.io/gitea/models/repo" + api "code.gitea.io/gitea/modules/structs" ) // ToAPIRelease convert a repo_model.Release to api.Release diff --git a/services/convert/release_test.go b/services/convert/release_test.go index 3abd2ff3ef..2e40bb9cdd 100644 --- a/services/convert/release_test.go +++ b/services/convert/release_test.go @@ -6,9 +6,9 @@ package convert import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/convert/repository.go b/services/convert/repository.go index 1b0f46b3da..2fb6f6d7c0 100644 --- a/services/convert/repository.go +++ b/services/convert/repository.go @@ -7,14 +7,14 @@ import ( "context" "time" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models" + "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" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" ) // ToRepo converts a Repository to api.Repository @@ -101,7 +101,6 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR allowRebaseUpdate := false defaultDeleteBranchAfterMerge := false defaultMergeStyle := repo_model.MergeStyleMerge - defaultUpdateStyle := repo_model.UpdateStyleMerge defaultAllowMaintainerEdit := false if unit, err := repo.GetUnit(ctx, unit_model.TypePullRequests); err == nil { config := unit.PullRequestsConfig() @@ -115,7 +114,6 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR allowRebaseUpdate = config.AllowRebaseUpdate defaultDeleteBranchAfterMerge = config.DefaultDeleteBranchAfterMerge defaultMergeStyle = config.GetDefaultMergeStyle() - defaultUpdateStyle = config.GetDefaultUpdateStyle() defaultAllowMaintainerEdit = config.DefaultAllowMaintainerEdit } hasProjects := false @@ -233,7 +231,6 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR AllowRebaseUpdate: allowRebaseUpdate, DefaultDeleteBranchAfterMerge: defaultDeleteBranchAfterMerge, DefaultMergeStyle: string(defaultMergeStyle), - DefaultUpdateStyle: string(defaultUpdateStyle), DefaultAllowMaintainerEdit: defaultAllowMaintainerEdit, AvatarURL: repo.AvatarLink(ctx), Internal: !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate, diff --git a/services/convert/secret.go b/services/convert/secret.go new file mode 100644 index 0000000000..dd7b9f0a6a --- /dev/null +++ b/services/convert/secret.go @@ -0,0 +1,18 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package convert + +import ( + secret_model "code.gitea.io/gitea/models/secret" + api "code.gitea.io/gitea/modules/structs" +) + +// ToSecret converts Secret to API format +func ToSecret(secret *secret_model.Secret) *api.Secret { + result := &api.Secret{ + Name: secret.Name, + } + + return result +} diff --git a/services/convert/status.go b/services/convert/status.go index 1a71e70a52..6cef63c1cd 100644 --- a/services/convert/status.go +++ b/services/convert/status.go @@ -6,9 +6,9 @@ package convert import ( "context" - git_model "forgejo.org/models/git" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + git_model "code.gitea.io/gitea/models/git" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" ) // ToCommitStatus converts git_model.CommitStatus to api.CommitStatus diff --git a/services/convert/user.go b/services/convert/user.go index 444089fd83..94a400de5d 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -6,9 +6,9 @@ package convert import ( "context" - "forgejo.org/models/perm" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/perm" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" ) // ToUser convert user_model.User to api.User @@ -57,7 +57,7 @@ func toUser(ctx context.Context, user *user_model.User, signed, authed bool) *ap Created: user.CreatedUnix.AsTime(), Restricted: user.IsRestricted, Location: user.Location, - Pronouns: user.GetPronouns(signed), + Pronouns: user.Pronouns, Website: user.Website, Description: user.Description, // counter's @@ -97,7 +97,6 @@ func User2UserSettings(user *user_model.User) api.UserSettings { Description: user.Description, Theme: user.Theme, HideEmail: user.KeepEmailPrivate, - HidePronouns: user.KeepPronounsPrivate, HideActivity: user.KeepActivityPrivate, DiffViewStyle: user.DiffViewStyle, EnableRepoUnitHints: user.EnableRepoUnitHints, diff --git a/services/convert/user_test.go b/services/convert/user_test.go index 01ce8101da..0f0b520c9b 100644 --- a/services/convert/user_test.go +++ b/services/convert/user_test.go @@ -6,10 +6,10 @@ package convert import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/convert/utils.go b/services/convert/utils.go index 3bbd4e39bd..fe35fd2dac 100644 --- a/services/convert/utils.go +++ b/services/convert/utils.go @@ -7,8 +7,8 @@ package convert import ( "strings" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" ) // ToCorrectPageSize makes sure page size is in allowed range. diff --git a/services/convert/wiki.go b/services/convert/wiki.go index adcbd52949..767bfdb88d 100644 --- a/services/convert/wiki.go +++ b/services/convert/wiki.go @@ -6,8 +6,8 @@ package convert import ( "time" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" ) // ToWikiCommit convert a git commit into a WikiCommit diff --git a/services/cron/cron.go b/services/cron/cron.go index d020f3fd6c..3c5737e371 100644 --- a/services/cron/cron.go +++ b/services/cron/cron.go @@ -9,10 +9,10 @@ import ( "runtime/pprof" "time" - "forgejo.org/modules/graceful" - "forgejo.org/modules/process" - "forgejo.org/modules/sync" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/sync" + "code.gitea.io/gitea/modules/translation" "github.com/go-co-op/gocron" ) diff --git a/services/cron/setting.go b/services/cron/setting.go index 7fd4c4e1d8..6dad88830a 100644 --- a/services/cron/setting.go +++ b/services/cron/setting.go @@ -6,7 +6,7 @@ package cron import ( "time" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/translation" ) // Config represents a basic configuration interface that cron task diff --git a/services/cron/tasks.go b/services/cron/tasks.go index b547acdf05..f8a7444c49 100644 --- a/services/cron/tasks.go +++ b/services/cron/tasks.go @@ -11,14 +11,14 @@ import ( "sync" "time" - "forgejo.org/models/db" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/models/db" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "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/translation" ) var ( diff --git a/services/cron/tasks_actions.go b/services/cron/tasks_actions.go index a7fd3cd0bc..59cfe36d14 100644 --- a/services/cron/tasks_actions.go +++ b/services/cron/tasks_actions.go @@ -6,9 +6,9 @@ package cron import ( "context" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - actions_service "forgejo.org/services/actions" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + actions_service "code.gitea.io/gitea/services/actions" ) func initActionsTasks() { diff --git a/services/cron/tasks_basic.go b/services/cron/tasks_basic.go index 5ada7a8f5c..2a213ae515 100644 --- a/services/cron/tasks_basic.go +++ b/services/cron/tasks_basic.go @@ -7,18 +7,18 @@ import ( "context" "time" - "forgejo.org/models" - git_model "forgejo.org/models/git" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/services/auth" - "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" - packages_cleanup_service "forgejo.org/services/packages/cleanup" - repo_service "forgejo.org/services/repository" - archiver_service "forgejo.org/services/repository/archiver" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" + packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup" + repo_service "code.gitea.io/gitea/services/repository" + archiver_service "code.gitea.io/gitea/services/repository/archiver" ) func registerUpdateMirrorTask() { @@ -54,7 +54,7 @@ func registerRepoHealthCheck() { RunAtStart: false, Schedule: "@midnight", }, - Timeout: time.Duration(setting.Git.Timeout.Default) * time.Second, + Timeout: 60 * time.Second, Args: []string{}, }, func(ctx context.Context, _ *user_model.User, config Config) error { rhcConfig := config.(*RepoHealthCheckConfig) diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go index 322fe27ca0..e1ba5274e6 100644 --- a/services/cron/tasks_extended.go +++ b/services/cron/tasks_extended.go @@ -7,17 +7,17 @@ import ( "context" "time" - activities_model "forgejo.org/models/activities" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - issue_indexer "forgejo.org/modules/indexer/issues" - "forgejo.org/modules/setting" - "forgejo.org/modules/updatechecker" - repo_service "forgejo.org/services/repository" - archiver_service "forgejo.org/services/repository/archiver" - user_service "forgejo.org/services/user" + activities_model "code.gitea.io/gitea/models/activities" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/updatechecker" + repo_service "code.gitea.io/gitea/services/repository" + archiver_service "code.gitea.io/gitea/services/repository/archiver" + user_service "code.gitea.io/gitea/services/user" ) func registerDeleteInactiveUsers() { diff --git a/services/doctor/actions.go b/services/doctor/actions.go deleted file mode 100644 index c382132265..0000000000 --- a/services/doctor/actions.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package doctor - -import ( - "context" - "fmt" - - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - repo_service "forgejo.org/services/repository" -) - -func disableMirrorActionsUnit(ctx context.Context, logger log.Logger, autofix bool) error { - var reposToFix []*repo_model.Repository - - for page := 1; ; page++ { - repos, _, err := repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{ - ListOptions: db.ListOptions{ - PageSize: repo_model.RepositoryListDefaultPageSize, - Page: page, - }, - Mirror: optional.Some(true), - }) - if err != nil { - return fmt.Errorf("SearchRepository: %w", err) - } - if len(repos) == 0 { - break - } - - for _, repo := range repos { - if repo.UnitEnabled(ctx, unit_model.TypeActions) { - reposToFix = append(reposToFix, repo) - } - } - } - - if len(reposToFix) == 0 { - logger.Info("Found no mirror with actions unit enabled") - } else { - logger.Warn("Found %d mirrors with actions unit enabled", len(reposToFix)) - } - if !autofix || len(reposToFix) == 0 { - return nil - } - - for _, repo := range reposToFix { - if err := repo_service.UpdateRepositoryUnits(ctx, repo, nil, []unit_model.Type{unit_model.TypeActions}); err != nil { - return err - } - } - logger.Info("Fixed %d mirrors with actions unit enabled", len(reposToFix)) - - return nil -} - -func init() { - Register(&Check{ - Title: "Disable the actions unit for all mirrors", - Name: "disable-mirror-actions-unit", - IsDefault: false, - Run: disableMirrorActionsUnit, - Priority: 9, - }) -} diff --git a/services/doctor/authorizedkeys.go b/services/doctor/authorizedkeys.go index 04a3680ff5..2920cf51d7 100644 --- a/services/doctor/authorizedkeys.go +++ b/services/doctor/authorizedkeys.go @@ -12,10 +12,10 @@ import ( "path/filepath" "strings" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) const tplCommentPrefix = `# gitea public key` diff --git a/services/doctor/breaking.go b/services/doctor/breaking.go index 339f8e847c..77e3d4e8ef 100644 --- a/services/doctor/breaking.go +++ b/services/doctor/breaking.go @@ -7,11 +7,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" "xorm.io/builder" ) @@ -31,11 +29,9 @@ func iterateUserAccounts(ctx context.Context, each func(*user.User) error) error // addresses would be currently facing a error due to their invalid email address. // Ref: https://github.com/go-gitea/gitea/pull/19085 & https://github.com/go-gitea/gitea/pull/17688 func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { - setting.LoadServiceSetting() - // We could use quirky SQL to get all users that start without a [a-zA-Z0-9], but that would mean // DB provider-specific SQL and only works _now_. So instead we iterate through all user accounts - // and use the validation.ValidateEmail function to be future-proof. + // and use the user.ValidateEmail function to be future-proof. var invalidUserCount int64 if err := iterateUserAccounts(ctx, func(u *user.User) error { // Only check for users, skip @@ -43,7 +39,7 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { return nil } - if err := validation.ValidateEmail(u.Email); err != nil { + if err := user.ValidateEmail(u.Email); err != nil { invalidUserCount++ logger.Warn("User[id=%d name=%q] have not a valid e-mail: %v", u.ID, u.Name, err) } @@ -64,8 +60,6 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error { // are allowed for various reasons. This check helps with detecting users that, according // to our reserved names, don't have a valid username. func checkUserName(ctx context.Context, logger log.Logger, _ bool) error { - setting.LoadServiceSetting() - var invalidUserCount int64 if err := iterateUserAccounts(ctx, func(u *user.User) error { if err := user.IsUsableUsername(u.Name); err != nil { diff --git a/services/doctor/checkOldArchives.go b/services/doctor/checkOldArchives.go index 301e99391b..390dfb43aa 100644 --- a/services/doctor/checkOldArchives.go +++ b/services/doctor/checkOldArchives.go @@ -8,9 +8,9 @@ import ( "os" "path/filepath" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/util" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" ) func checkOldArchives(ctx context.Context, logger log.Logger, autofix bool) error { diff --git a/services/doctor/dbconsistency.go b/services/doctor/dbconsistency.go index 6fcbd90940..80f538d670 100644 --- a/services/doctor/dbconsistency.go +++ b/services/doctor/dbconsistency.go @@ -6,16 +6,16 @@ package doctor import ( "context" - actions_model "forgejo.org/models/actions" - activities_model "forgejo.org/models/activities" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/migrations" - org_model "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + actions_model "code.gitea.io/gitea/models/actions" + activities_model "code.gitea.io/gitea/models/activities" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/migrations" + org_model "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) type consistencyCheck struct { @@ -246,9 +246,6 @@ func checkDBConsistency(ctx context.Context, logger log.Logger, autofix bool) er // find authorization tokens without existing user genericOrphanCheck("Authorization token without existing User", "forgejo_auth_token", "user", "forgejo_auth_token.uid=`user`.id"), - // find two_factor without existing user - genericOrphanCheck("Orphaned TwoFactor without existing User", - "two_factor", "user", "`two_factor`.uid=`user`.id"), ) for _, c := range consistencyChecks { diff --git a/services/doctor/dbversion.go b/services/doctor/dbversion.go index 9c02c732e5..2b20cb2340 100644 --- a/services/doctor/dbversion.go +++ b/services/doctor/dbversion.go @@ -6,13 +6,13 @@ package doctor import ( "context" - "forgejo.org/models/db" - "forgejo.org/models/migrations" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/migrations" + "code.gitea.io/gitea/modules/log" ) func checkDBVersion(ctx context.Context, logger log.Logger, autofix bool) error { - logger.Info("Expected database version: %d", migrations.ExpectedDBVersion()) + logger.Info("Expected database version: %d", migrations.ExpectedVersion()) if err := db.InitEngineWithMigration(ctx, migrations.EnsureUpToDate); err != nil { if !autofix { logger.Critical("Error: %v during ensure up to date", err) diff --git a/services/doctor/doctor.go b/services/doctor/doctor.go index 6d8e168bf2..a4eb5e16b9 100644 --- a/services/doctor/doctor.go +++ b/services/doctor/doctor.go @@ -10,11 +10,11 @@ import ( "sort" "strings" - "forgejo.org/models/db" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" ) // Check represents a Doctor check diff --git a/services/doctor/fix16961.go b/services/doctor/fix16961.go index 2212d9e903..50d9ac6621 100644 --- a/services/doctor/fix16961.go +++ b/services/doctor/fix16961.go @@ -9,12 +9,12 @@ import ( "errors" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/timeutil" "xorm.io/builder" ) diff --git a/services/doctor/fix16961_test.go b/services/doctor/fix16961_test.go index 7a83c808c3..498ed9c8d5 100644 --- a/services/doctor/fix16961_test.go +++ b/services/doctor/fix16961_test.go @@ -6,7 +6,7 @@ package doctor import ( "testing" - repo_model "forgejo.org/models/repo" + repo_model "code.gitea.io/gitea/models/repo" "github.com/stretchr/testify/assert" ) diff --git a/services/doctor/fix8312.go b/services/doctor/fix8312.go index 31cd6686d7..4fc049873a 100644 --- a/services/doctor/fix8312.go +++ b/services/doctor/fix8312.go @@ -6,11 +6,11 @@ package doctor import ( "context" - "forgejo.org/models" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/modules/log" "xorm.io/builder" ) diff --git a/services/doctor/heads.go b/services/doctor/heads.go index 7f9d1c73e8..41fca01d57 100644 --- a/services/doctor/heads.go +++ b/services/doctor/heads.go @@ -6,9 +6,9 @@ package doctor import ( "context" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) func synchronizeRepoHeads(ctx context.Context, logger log.Logger, autofix bool) error { diff --git a/services/doctor/lfs.go b/services/doctor/lfs.go index fed127de5d..8531b7bbe8 100644 --- a/services/doctor/lfs.go +++ b/services/doctor/lfs.go @@ -8,9 +8,9 @@ import ( "fmt" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/services/repository" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/repository" ) func init() { diff --git a/services/doctor/mergebase.go b/services/doctor/mergebase.go index bebde30bee..de460c4190 100644 --- a/services/doctor/mergebase.go +++ b/services/doctor/mergebase.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + "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/modules/git" + "code.gitea.io/gitea/modules/log" "xorm.io/builder" ) diff --git a/services/doctor/misc.go b/services/doctor/misc.go index 9b9c96b52b..9300c3a25c 100644 --- a/services/doctor/misc.go +++ b/services/doctor/misc.go @@ -11,17 +11,17 @@ import ( "path" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models" + "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/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" lru "github.com/hashicorp/golang-lru/v2" "xorm.io/builder" diff --git a/services/doctor/packages_nuget.go b/services/doctor/packages_nuget.go index f6a33db779..47fdb3ac12 100644 --- a/services/doctor/packages_nuget.go +++ b/services/doctor/packages_nuget.go @@ -9,12 +9,12 @@ import ( "slices" "strings" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - nuget_module "forgejo.org/modules/packages/nuget" - packages_service "forgejo.org/services/packages" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + nuget_module "code.gitea.io/gitea/modules/packages/nuget" + packages_service "code.gitea.io/gitea/services/packages" "xorm.io/builder" ) diff --git a/services/doctor/paths.go b/services/doctor/paths.go index 4fbe19ea04..8e37f01ef5 100644 --- a/services/doctor/paths.go +++ b/services/doctor/paths.go @@ -8,8 +8,8 @@ import ( "fmt" "os" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) type configurationFile struct { diff --git a/services/doctor/push_mirror_consistency.go b/services/doctor/push_mirror_consistency.go index 07986770b2..68b96d6415 100644 --- a/services/doctor/push_mirror_consistency.go +++ b/services/doctor/push_mirror_consistency.go @@ -7,9 +7,9 @@ import ( "context" "strings" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/log" "xorm.io/builder" ) diff --git a/services/doctor/repository.go b/services/doctor/repository.go index cd51483d88..6c33426636 100644 --- a/services/doctor/repository.go +++ b/services/doctor/repository.go @@ -6,11 +6,11 @@ package doctor import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" - repo_service "forgejo.org/services/repository" + "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/storage" + repo_service "code.gitea.io/gitea/services/repository" "xorm.io/builder" ) diff --git a/services/doctor/storage.go b/services/doctor/storage.go index 7dbe475d6c..3f3b562c37 100644 --- a/services/doctor/storage.go +++ b/services/doctor/storage.go @@ -9,16 +9,16 @@ import ( "io/fs" "strings" - "forgejo.org/models/git" - "forgejo.org/models/packages" - "forgejo.org/models/repo" - "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" ) type commonStorageCheckOptions struct { diff --git a/services/doctor/usertype.go b/services/doctor/usertype.go index 0a034d8f9d..ab32b78e62 100644 --- a/services/doctor/usertype.go +++ b/services/doctor/usertype.go @@ -6,8 +6,8 @@ package doctor import ( "context" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" ) func checkUserType(ctx context.Context, logger log.Logger, autofix bool) error { diff --git a/services/externalaccount/link.go b/services/externalaccount/link.go index f5d29b5ce5..d6e2ea7e94 100644 --- a/services/externalaccount/link.go +++ b/services/externalaccount/link.go @@ -7,7 +7,7 @@ import ( "context" "fmt" - user_model "forgejo.org/models/user" + user_model "code.gitea.io/gitea/models/user" "github.com/markbates/goth" ) diff --git a/services/externalaccount/user.go b/services/externalaccount/user.go index 68d085f6d0..3cfd8c81f9 100644 --- a/services/externalaccount/user.go +++ b/services/externalaccount/user.go @@ -8,11 +8,11 @@ import ( "strconv" "strings" - "forgejo.org/models/auth" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/auth" + 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/structs" "github.com/markbates/goth" ) diff --git a/services/f3/driver/asset.go b/services/f3/driver/asset.go index c9d2ecdf2f..6759cc645c 100644 --- a/services/f3/driver/asset.go +++ b/services/f3/driver/asset.go @@ -12,15 +12,14 @@ import ( "io" "os" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" - "forgejo.org/services/attachment" + "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/storage" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/services/attachment" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -132,7 +131,7 @@ func (o *asset) Patch(ctx context.Context) { } } -func (o *asset) Put(ctx context.Context) f3_id.NodeID { +func (o *asset) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -155,7 +154,7 @@ func (o *asset) Put(ctx context.Context) f3_id.NodeID { } o.Trace("asset created %d", o.forgejoAsset.ID) - return f3_id.NewNodeID(o.forgejoAsset.ID) + return generic.NewNodeID(o.forgejoAsset.ID) } func (o *asset) Delete(ctx context.Context) { diff --git a/services/f3/driver/assets.go b/services/f3/driver/assets.go index 106d5029f3..88a3979713 100644 --- a/services/f3/driver/assets.go +++ b/services/f3/driver/assets.go @@ -8,7 +8,7 @@ import ( "context" "fmt" - repo_model "forgejo.org/models/repo" + repo_model "code.gitea.io/gitea/models/repo" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/comment.go b/services/f3/driver/comment.go index bd924930b5..0c10fd744d 100644 --- a/services/f3/driver/comment.go +++ b/services/f3/driver/comment.go @@ -8,13 +8,12 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/timeutil" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -96,7 +95,7 @@ func (o *comment) Patch(ctx context.Context) { } } -func (o *comment) Put(ctx context.Context) f3_id.NodeID { +func (o *comment) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -106,7 +105,7 @@ func (o *comment) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("comment created %d", o.forgejoComment.ID) - return f3_id.NewNodeID(o.forgejoComment.ID) + return generic.NewNodeID(o.forgejoComment.ID) } func (o *comment) Delete(ctx context.Context) { diff --git a/services/f3/driver/comments.go b/services/f3/driver/comments.go index d8c84e290c..eb79b74066 100644 --- a/services/f3/driver/comments.go +++ b/services/f3/driver/comments.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/common.go b/services/f3/driver/common.go index 4c5dfd8b1a..104f91c977 100644 --- a/services/f3/driver/common.go +++ b/services/f3/driver/common.go @@ -7,7 +7,6 @@ package driver import ( "context" - f3_kind "code.forgejo.org/f3/gof3/v3/kind" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -38,7 +37,7 @@ func (o *common) getPageSize() int { return o.getTreeDriver().GetPageSize() } -func (o *common) getKind() f3_kind.Kind { +func (o *common) getKind() generic.Kind { return o.GetNode().GetKind() } diff --git a/services/f3/driver/container.go b/services/f3/driver/container.go index 1ca47ef285..153044416e 100644 --- a/services/f3/driver/container.go +++ b/services/f3/driver/container.go @@ -8,8 +8,8 @@ import ( "context" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" + "code.forgejo.org/f3/gof3/v3/tree/generic" ) type container struct { @@ -30,7 +30,7 @@ func (o *container) FromFormat(content f3.Interface) { func (o *container) Get(context.Context) bool { return true } -func (o *container) Put(ctx context.Context) f3_id.NodeID { +func (o *container) Put(ctx context.Context) generic.NodeID { return o.upsert(ctx) } @@ -38,6 +38,6 @@ func (o *container) Patch(ctx context.Context) { o.upsert(ctx) } -func (o *container) upsert(context.Context) f3_id.NodeID { - return f3_id.NewNodeID(o.getKind()) +func (o *container) upsert(context.Context) generic.NodeID { + return generic.NewNodeID(o.getKind()) } diff --git a/services/f3/driver/forge.go b/services/f3/driver/forge.go index 03acb41450..a4bcf61231 100644 --- a/services/f3/driver/forge.go +++ b/services/f3/driver/forge.go @@ -8,11 +8,9 @@ import ( "context" "fmt" - user_model "forgejo.org/models/user" + user_model "code.gitea.io/gitea/models/user" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" - f3_kind "code.forgejo.org/f3/gof3/v3/kind" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" "code.forgejo.org/f3/gof3/v3/util" @@ -21,16 +19,16 @@ import ( type forge struct { generic.NullDriver - ownersKind map[string]f3_kind.Kind + ownersKind map[string]generic.Kind } func newForge() generic.NodeDriverInterface { return &forge{ - ownersKind: make(map[string]f3_kind.Kind), + ownersKind: make(map[string]generic.Kind), } } -func (o *forge) getOwnersKind(ctx context.Context, id string) f3_kind.Kind { +func (o *forge) getOwnersKind(ctx context.Context, id string) generic.Kind { kind, ok := o.ownersKind[id] if !ok { user, err := user_model.GetUserByID(ctx, util.ParseInt(id)) @@ -52,7 +50,7 @@ func (o *forge) getOwnersPath(ctx context.Context, id string) f3_tree.Path { func (o *forge) Equals(context.Context, generic.NodeInterface) bool { return true } func (o *forge) Get(context.Context) bool { return true } -func (o *forge) Put(context.Context) f3_id.NodeID { return f3_id.NewNodeID("forge") } +func (o *forge) Put(context.Context) generic.NodeID { return generic.NewNodeID("forge") } func (o *forge) Patch(context.Context) {} func (o *forge) Delete(context.Context) {} func (o *forge) NewFormat() f3.Interface { return &f3.Forge{} } diff --git a/services/f3/driver/issue.go b/services/f3/driver/issue.go index 6308c4cc2d..7f1614deef 100644 --- a/services/f3/driver/issue.go +++ b/services/f3/driver/issue.go @@ -8,16 +8,15 @@ import ( "context" "fmt" - "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/timeutil" - issue_service "forgejo.org/services/issue" + "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/timeutil" + issue_service "code.gitea.io/gitea/services/issue" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -49,7 +48,7 @@ func (o *issue) ToFormat() f3.Interface { return o.NewFormat() } - milestone := &f3.Reference{} + var milestone *f3.Reference if o.forgejoIssue.Milestone != nil { milestone = f3_tree.NewIssueMilestoneReference(o.forgejoIssue.Milestone.ID) } @@ -83,11 +82,9 @@ func (o *issue) ToFormat() f3.Interface { func (o *issue) FromFormat(content f3.Interface) { issue := content.(*f3.Issue) var milestone *issues_model.Milestone - var milestoneID int64 if issue.Milestone != nil { - milestoneID = issue.Milestone.GetIDAsInt() milestone = &issues_model.Milestone{ - ID: milestoneID, + ID: issue.Milestone.GetIDAsInt(), } } o.forgejoIssue = &issues_model.Issue{ @@ -98,7 +95,6 @@ func (o *issue) FromFormat(content f3.Interface) { ID: issue.PosterID.GetIDAsInt(), }, Content: issue.Content, - MilestoneID: milestoneID, Milestone: milestone, IsClosed: issue.State == f3.IssueStateClosed, CreatedUnix: timeutil.TimeStamp(issue.Created.Unix()), @@ -138,7 +134,7 @@ func (o *issue) Get(ctx context.Context) bool { panic(fmt.Errorf("issue %v %w", id, err)) } if err := issue.LoadAttributes(ctx); err != nil { - panic(fmt.Errorf("LoadAttributes %v %w", id, err)) + panic(err) } o.forgejoIssue = issue @@ -148,74 +144,29 @@ func (o *issue) Get(ctx context.Context) bool { func (o *issue) Patch(ctx context.Context) { node := o.GetNode() project := f3_tree.GetProjectID(o.GetNode()) - index := node.GetID().Int64() - id := getIssueID(ctx, project, index) - o.Trace("id = %d, repo_id = %d, index = %d, assignees = %v", id, project, index, o.forgejoIssue.Assignees) - if _, err := db.GetEngine(ctx).Where("`id` = ?", id).Cols("name", "content", "is_closed", "milestone_id", "is_locked").Update(o.forgejoIssue); err != nil { + id := node.GetID().Int64() + o.Trace("repo_id = %d, index = %d", project, id) + if _, err := db.GetEngine(ctx).Where("`repo_id` = ? AND `index` = ?", project, id).Cols("name", "content", "is_closed").Update(o.forgejoIssue); err != nil { panic(fmt.Errorf("%v %v", o.forgejoIssue, err)) } - - updateIssueAssignees(ctx, id, o.forgejoIssue.Assignees) - updateIssueLabels(ctx, id, o.forgejoIssue.Labels) } -func getIssueID(ctx context.Context, repoID, index int64) int64 { - var id int64 - if _, err := db.GetEngine(ctx).Select("id").Table("issue").Where("`repo_id` = ? AND `index` = ?", repoID, index).Get(&id); err != nil { - panic(fmt.Errorf("%v %v: %w", repoID, index, err)) - } - return id -} - -func updateIssueAssignees(ctx context.Context, issueID int64, assignees []*user_model.User) { - sess := db.GetEngine(ctx) - - if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueAssignees)); err != nil { - panic(fmt.Errorf("delete IssueAssignees %v %w", issueID, err)) - } - - issueAssignees := make([]issues_model.IssueAssignees, 0, len(assignees)) - for _, assignee := range assignees { - issueAssignees = append(issueAssignees, issues_model.IssueAssignees{ - IssueID: issueID, - AssigneeID: assignee.ID, - }) - } - - if len(issueAssignees) > 0 { - if _, err := sess.Insert(issueAssignees); err != nil { - panic(fmt.Errorf("Insert %v %w", issueID, err)) - } - } -} - -func updateIssueLabels(ctx context.Context, issueID int64, labels []*issues_model.Label) { - sess := db.GetEngine(ctx) - - if _, err := sess.Where("issue_id = ?", issueID).Delete(new(issues_model.IssueLabel)); err != nil { - panic(fmt.Errorf("delete IssueLabel %v %w", issueID, err)) - } - - issueLabels := make([]issues_model.IssueLabel, 0, len(labels)) - for _, label := range labels { - issueLabels = append(issueLabels, issues_model.IssueLabel{ - IssueID: issueID, - LabelID: label.ID, - }) - } - - if len(issueLabels) > 0 { - if _, err := sess.Insert(issueLabels); err != nil { - panic(fmt.Errorf("Insert %v %w", issueID, err)) - } - } -} - -func (o *issue) Put(ctx context.Context) f3_id.NodeID { +func (o *issue) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) o.forgejoIssue.RepoID = f3_tree.GetProjectID(o.GetNode()) + makeLabels := func(issueID int64) []issues_model.IssueLabel { + labels := make([]issues_model.IssueLabel, 0, len(o.forgejoIssue.Labels)) + for _, label := range o.forgejoIssue.Labels { + o.Trace("%d with label %d", issueID, label.ID) + labels = append(labels, issues_model.IssueLabel{ + IssueID: issueID, + LabelID: label.ID, + }) + } + return labels + } idx, err := db.GetNextResourceIndex(ctx, "issue_index", o.forgejoIssue.RepoID) if err != nil { @@ -229,11 +180,34 @@ func (o *issue) Put(ctx context.Context) f3_id.NodeID { panic(err) } - updateIssueAssignees(ctx, o.forgejoIssue.ID, o.forgejoIssue.Assignees) - updateIssueLabels(ctx, o.forgejoIssue.ID, o.forgejoIssue.Labels) + labels := makeLabels(o.forgejoIssue.ID) + if len(labels) > 0 { + if _, err := sess.Insert(labels); err != nil { + panic(err) + } + } + + makeAssignees := func(issueID int64) []issues_model.IssueAssignees { + assignees := make([]issues_model.IssueAssignees, 0, len(o.forgejoIssue.Assignees)) + for _, assignee := range o.forgejoIssue.Assignees { + o.Trace("%d with assignee %d", issueID, assignee.ID) + assignees = append(assignees, issues_model.IssueAssignees{ + IssueID: issueID, + AssigneeID: assignee.ID, + }) + } + return assignees + } + + assignees := makeAssignees(o.forgejoIssue.ID) + if len(assignees) > 0 { + if _, err := sess.Insert(assignees); err != nil { + panic(err) + } + } o.Trace("issue created %d/%d", o.forgejoIssue.ID, o.forgejoIssue.Index) - return f3_id.NewNodeID(o.forgejoIssue.Index) + return generic.NewNodeID(o.forgejoIssue.Index) } func (o *issue) Delete(ctx context.Context) { diff --git a/services/f3/driver/issues.go b/services/f3/driver/issues.go index dd6828dc86..3a5a64e2b1 100644 --- a/services/f3/driver/issues.go +++ b/services/f3/driver/issues.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/label.go b/services/f3/driver/label.go index 707ac2bab3..6d1fcaad1a 100644 --- a/services/f3/driver/label.go +++ b/services/f3/driver/label.go @@ -7,13 +7,11 @@ package driver import ( "context" "fmt" - "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -47,7 +45,7 @@ func (o *label) ToFormat() f3.Interface { return &f3.Label{ Common: f3.NewCommon(fmt.Sprintf("%d", o.forgejoLabel.ID)), Name: o.forgejoLabel.Name, - Color: strings.TrimPrefix(o.forgejoLabel.Color, "#"), + Color: o.forgejoLabel.Color, Description: o.forgejoLabel.Description, } } @@ -58,7 +56,7 @@ func (o *label) FromFormat(content f3.Interface) { ID: f3_util.ParseInt(label.GetID()), Name: label.Name, Description: label.Description, - Color: "#" + label.Color, + Color: label.Color, } } @@ -87,7 +85,7 @@ func (o *label) Patch(ctx context.Context) { } } -func (o *label) Put(ctx context.Context) f3_id.NodeID { +func (o *label) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -96,7 +94,7 @@ func (o *label) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("label created %d", o.forgejoLabel.ID) - return f3_id.NewNodeID(o.forgejoLabel.ID) + return generic.NewNodeID(o.forgejoLabel.ID) } func (o *label) Delete(ctx context.Context) { diff --git a/services/f3/driver/labels.go b/services/f3/driver/labels.go index 4f705ed206..03f986b57a 100644 --- a/services/f3/driver/labels.go +++ b/services/f3/driver/labels.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/main.go b/services/f3/driver/main.go index eb6e4a6fb6..825d456692 100644 --- a/services/f3/driver/main.go +++ b/services/f3/driver/main.go @@ -5,7 +5,7 @@ package driver import ( - driver_options "forgejo.org/services/f3/driver/options" + driver_options "code.gitea.io/gitea/services/f3/driver/options" "code.forgejo.org/f3/gof3/v3/options" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" diff --git a/services/f3/driver/main_test.go b/services/f3/driver/main_test.go index b136fd5b23..8505b69b7e 100644 --- a/services/f3/driver/main_test.go +++ b/services/f3/driver/main_test.go @@ -7,14 +7,14 @@ package driver import ( "testing" - "forgejo.org/models/unittest" - driver_options "forgejo.org/services/f3/driver/options" + "code.gitea.io/gitea/models/unittest" + driver_options "code.gitea.io/gitea/services/f3/driver/options" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/perm/access" - _ "forgejo.org/services/f3/driver/tests" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" + _ "code.gitea.io/gitea/models/perm/access" + _ "code.gitea.io/gitea/services/f3/driver/tests" tests_f3 "code.forgejo.org/f3/gof3/v3/tree/tests/f3" "github.com/stretchr/testify/require" diff --git a/services/f3/driver/milestone.go b/services/f3/driver/milestone.go index d10e6918ac..222407fc30 100644 --- a/services/f3/driver/milestone.go +++ b/services/f3/driver/milestone.go @@ -9,13 +9,12 @@ import ( "fmt" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -118,12 +117,12 @@ func (o *milestone) Get(ctx context.Context) bool { func (o *milestone) Patch(ctx context.Context) { o.Trace("%d", o.forgejoMilestone.ID) - if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description", "is_closed", "deadline_unix").Update(o.forgejoMilestone); err != nil { + if _, err := db.GetEngine(ctx).ID(o.forgejoMilestone.ID).Cols("name", "description").Update(o.forgejoMilestone); err != nil { panic(fmt.Errorf("UpdateMilestoneCols: %v %v", o.forgejoMilestone, err)) } } -func (o *milestone) Put(ctx context.Context) f3_id.NodeID { +func (o *milestone) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -132,7 +131,7 @@ func (o *milestone) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("milestone created %d", o.forgejoMilestone.ID) - return f3_id.NewNodeID(o.forgejoMilestone.ID) + return generic.NewNodeID(o.forgejoMilestone.ID) } func (o *milestone) Delete(ctx context.Context) { diff --git a/services/f3/driver/milestones.go b/services/f3/driver/milestones.go index cf0b70c158..c816903bb1 100644 --- a/services/f3/driver/milestones.go +++ b/services/f3/driver/milestones.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/options.go b/services/f3/driver/options.go index 516f9baf7a..abc5015dd0 100644 --- a/services/f3/driver/options.go +++ b/services/f3/driver/options.go @@ -7,7 +7,7 @@ package driver import ( "net/http" - driver_options "forgejo.org/services/f3/driver/options" + driver_options "code.gitea.io/gitea/services/f3/driver/options" "code.forgejo.org/f3/gof3/v3/options" ) diff --git a/services/f3/driver/organization.go b/services/f3/driver/organization.go index af1eea4dda..76b240068d 100644 --- a/services/f3/driver/organization.go +++ b/services/f3/driver/organization.go @@ -8,12 +8,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -82,7 +81,7 @@ func (o *organization) Patch(ctx context.Context) { } } -func (o *organization) Put(ctx context.Context) f3_id.NodeID { +func (o *organization) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -95,7 +94,7 @@ func (o *organization) Put(ctx context.Context) f3_id.NodeID { panic(err) } - return f3_id.NewNodeID(o.forgejoOrganization.ID) + return generic.NewNodeID(o.forgejoOrganization.ID) } func (o *organization) Delete(ctx context.Context) { diff --git a/services/f3/driver/organizations.go b/services/f3/driver/organizations.go index eca6bfb9d4..98c4c1497d 100644 --- a/services/f3/driver/organizations.go +++ b/services/f3/driver/organizations.go @@ -8,11 +8,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -37,13 +36,13 @@ func (o *organizations) ListPage(ctx context.Context, page int) generic.Children return f3_tree.ConvertListed(ctx, o.GetNode(), f3_tree.ConvertToAny(organizations...)...) } -func (o *organizations) GetIDFromName(ctx context.Context, name string) f3_id.NodeID { +func (o *organizations) GetIDFromName(ctx context.Context, name string) generic.NodeID { organization, err := org_model.GetOrgByName(ctx, name) if err != nil { panic(fmt.Errorf("GetOrganizationByName: %v", err)) } - return f3_id.NewNodeID(organization.ID) + return generic.NewNodeID(organization.ID) } func newOrganizations() generic.NodeDriverInterface { diff --git a/services/f3/driver/project.go b/services/f3/driver/project.go index 5a3ec81e40..c2a2df38c4 100644 --- a/services/f3/driver/project.go +++ b/services/f3/driver/project.go @@ -9,12 +9,11 @@ import ( "fmt" "strings" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - repo_service "forgejo.org/services/repository" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + repo_service "code.gitea.io/gitea/services/repository" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -122,7 +121,7 @@ func (o *project) Patch(ctx context.Context) { } } -func (o *project) Put(ctx context.Context) f3_id.NodeID { +func (o *project) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -167,7 +166,7 @@ func (o *project) Put(ctx context.Context) f3_id.NodeID { o.forgejoProject = repo o.Trace("project created %d", o.forgejoProject.ID) } - return f3_id.NewNodeID(o.forgejoProject.ID) + return generic.NewNodeID(o.forgejoProject.ID) } func (o *project) Delete(ctx context.Context) { diff --git a/services/f3/driver/projects.go b/services/f3/driver/projects.go index 0c76854f43..a2dabc3f95 100644 --- a/services/f3/driver/projects.go +++ b/services/f3/driver/projects.go @@ -8,10 +8,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -20,18 +19,18 @@ type projects struct { container } -func (o *projects) GetIDFromName(ctx context.Context, name string) f3_id.NodeID { +func (o *projects) GetIDFromName(ctx context.Context, name string) generic.NodeID { owner := f3_tree.GetOwnerName(o.GetNode()) forgejoProject, err := repo_model.GetRepositoryByOwnerAndName(ctx, owner, name) if repo_model.IsErrRepoNotExist(err) { - return f3_id.NilID + return generic.NilID } if err != nil { panic(fmt.Errorf("error GetRepositoryByOwnerAndName(%s, %s): %v", owner, name, err)) } - return f3_id.NewNodeID(forgejoProject.ID) + return generic.NewNodeID(forgejoProject.ID) } func (o *projects) ListPage(ctx context.Context, page int) generic.ChildrenSlice { diff --git a/services/f3/driver/pullrequest.go b/services/f3/driver/pullrequest.go index 664ee6b13b..466b4bd576 100644 --- a/services/f3/driver/pullrequest.go +++ b/services/f3/driver/pullrequest.go @@ -9,17 +9,15 @@ import ( "fmt" "time" - "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/timeutil" - issue_service "forgejo.org/services/issue" + "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/timeutil" + issue_service "code.gitea.io/gitea/services/issue" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" - f3_path "code.forgejo.org/f3/gof3/v3/path" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -53,7 +51,7 @@ func (o *pullRequest) repositoryToReference(ctx context.Context, repository *rep if repository == nil { panic("unexpected nil repository") } - forge := o.getTree().GetRoot().GetChild(f3_id.NewNodeID(f3_tree.KindForge)).GetDriver().(*forge) + forge := o.getTree().GetRoot().GetChild(generic.NewNodeID(f3_tree.KindForge)).GetDriver().(*forge) owners := forge.getOwnersPath(ctx, fmt.Sprintf("%d", repository.OwnerID)) return f3_tree.NewRepositoryReference(owners.String(), repository.OwnerID, repository.ID) } @@ -63,7 +61,7 @@ func (o *pullRequest) referenceToRepository(reference *f3.Reference) int64 { if reference.Get() == "../../repository/vcs" { project = f3_tree.GetProjectID(o.GetNode()) } else { - p := f3_tree.ToPath(f3_path.PathAbsolute(generic.NewElementNode, o.GetNode().GetCurrentPath().String(), reference.Get())) + p := f3_tree.ToPath(generic.PathAbsolute(o.GetNode().GetCurrentPath().String(), reference.Get())) o.Trace("%v %v", o.GetNode().GetCurrentPath().String(), p) _, project = p.OwnerAndProjectID() } @@ -239,7 +237,7 @@ func (o *pullRequest) GetPullRequestRef() string { return fmt.Sprintf("refs/pull/%s/head", o.GetNativeID()) } -func (o *pullRequest) Put(ctx context.Context) f3_id.NodeID { +func (o *pullRequest) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -291,7 +289,7 @@ func (o *pullRequest) Put(ctx context.Context) f3_id.NodeID { } o.Trace("pullRequest created %d/%d", o.forgejoPullRequest.ID, o.forgejoPullRequest.Index) - return f3_id.NewNodeID(o.forgejoPullRequest.Index) + return generic.NewNodeID(o.forgejoPullRequest.Index) } func (o *pullRequest) Delete(ctx context.Context) { diff --git a/services/f3/driver/pullrequests.go b/services/f3/driver/pullrequests.go index 227171994c..e7f2910314 100644 --- a/services/f3/driver/pullrequests.go +++ b/services/f3/driver/pullrequests.go @@ -8,9 +8,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/optional" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/optional" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/reaction.go b/services/f3/driver/reaction.go index 74c50b9d13..0dc486c729 100644 --- a/services/f3/driver/reaction.go +++ b/services/f3/driver/reaction.go @@ -8,12 +8,11 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -88,7 +87,7 @@ func (o *reaction) Patch(ctx context.Context) { } } -func (o *reaction) Put(ctx context.Context) f3_id.NodeID { +func (o *reaction) Put(ctx context.Context) generic.NodeID { o.Error("%v", o.forgejoReaction.User) sess := db.GetEngine(ctx) @@ -116,7 +115,7 @@ func (o *reaction) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("reaction created %d", o.forgejoReaction.ID) - return f3_id.NewNodeID(o.forgejoReaction.ID) + return generic.NewNodeID(o.forgejoReaction.ID) } func (o *reaction) Delete(ctx context.Context) { diff --git a/services/f3/driver/reactions.go b/services/f3/driver/reactions.go index a546927b92..b7fd5e8f0a 100644 --- a/services/f3/driver/reactions.go +++ b/services/f3/driver/reactions.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/release.go b/services/f3/driver/release.go index df38bd8bc0..e937f84d05 100644 --- a/services/f3/driver/release.go +++ b/services/f3/driver/release.go @@ -9,15 +9,14 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/timeutil" - release_service "forgejo.org/services/release" + "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/timeutil" + release_service "code.gitea.io/gitea/services/release" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -116,7 +115,7 @@ func (o *release) Patch(ctx context.Context) { } } -func (o *release) Put(ctx context.Context) f3_id.NodeID { +func (o *release) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -134,7 +133,7 @@ func (o *release) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("release created %d", o.forgejoRelease.ID) - return f3_id.NewNodeID(o.forgejoRelease.ID) + return generic.NewNodeID(o.forgejoRelease.ID) } func (o *release) Delete(ctx context.Context) { diff --git a/services/f3/driver/releases.go b/services/f3/driver/releases.go index a631c0b60e..3b46bc7c54 100644 --- a/services/f3/driver/releases.go +++ b/services/f3/driver/releases.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/repository.go b/services/f3/driver/repository.go index e7f4e43723..da968b4c47 100644 --- a/services/f3/driver/repository.go +++ b/services/f3/driver/repository.go @@ -7,11 +7,10 @@ package driver import ( "context" - repo_model "forgejo.org/models/repo" + repo_model "code.gitea.io/gitea/models/repo" "code.forgejo.org/f3/gof3/v3/f3" helpers_repository "code.forgejo.org/f3/gof3/v3/forges/helpers/repository" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -58,7 +57,7 @@ func (o *repository) Get(ctx context.Context) bool { return o.h.Get(ctx) } -func (o *repository) Put(ctx context.Context) f3_id.NodeID { +func (o *repository) Put(ctx context.Context) generic.NodeID { return o.upsert(ctx) } @@ -66,13 +65,13 @@ func (o *repository) Patch(ctx context.Context) { o.upsert(ctx) } -func (o *repository) upsert(ctx context.Context) f3_id.NodeID { +func (o *repository) upsert(ctx context.Context) generic.NodeID { o.Trace("%s", o.GetNativeID()) o.h.Upsert(ctx, o.f) - return f3_id.NewNodeID(o.f.Name) + return generic.NewNodeID(o.f.Name) } -func (o *repository) SetFetchFunc(fetchFunc func(ctx context.Context, destination string, internalRefs []string)) { +func (o *repository) SetFetchFunc(fetchFunc func(ctx context.Context, destination string)) { o.f.FetchFunc = fetchFunc } @@ -93,10 +92,6 @@ func (o *repository) GetRepositoryPushURL() string { return o.getURL() } -func (o *repository) GetRepositoryInternalRefs() []string { - return []string{} -} - func newRepository(_ context.Context) generic.NodeDriverInterface { r := &repository{ f: &f3.Repository{}, diff --git a/services/f3/driver/review.go b/services/f3/driver/review.go index f4f5ff44b8..a3c074bd63 100644 --- a/services/f3/driver/review.go +++ b/services/f3/driver/review.go @@ -8,13 +8,12 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/timeutil" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -135,7 +134,7 @@ func (o *review) Patch(ctx context.Context) { } } -func (o *review) Put(ctx context.Context) f3_id.NodeID { +func (o *review) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -154,7 +153,7 @@ func (o *review) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("review created %d", o.forgejoReview.ID) - return f3_id.NewNodeID(o.forgejoReview.ID) + return generic.NewNodeID(o.forgejoReview.ID) } func (o *review) Delete(ctx context.Context) { diff --git a/services/f3/driver/reviewcomment.go b/services/f3/driver/reviewcomment.go index 22759b6df3..8e13d86b63 100644 --- a/services/f3/driver/reviewcomment.go +++ b/services/f3/driver/reviewcomment.go @@ -9,13 +9,12 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/timeutil" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -116,7 +115,7 @@ func (o *reviewComment) Patch(ctx context.Context) { } } -func (o *reviewComment) Put(ctx context.Context) f3_id.NodeID { +func (o *reviewComment) Put(ctx context.Context) generic.NodeID { node := o.GetNode() o.Trace("%s", node.GetID()) @@ -126,7 +125,7 @@ func (o *reviewComment) Put(ctx context.Context) f3_id.NodeID { panic(err) } o.Trace("reviewComment created %d", o.forgejoReviewComment.ID) - return f3_id.NewNodeID(o.forgejoReviewComment.ID) + return generic.NewNodeID(o.forgejoReviewComment.ID) } func (o *reviewComment) Delete(ctx context.Context) { diff --git a/services/f3/driver/reviewcomments.go b/services/f3/driver/reviewcomments.go index 2aa4dea22c..e11aaa489b 100644 --- a/services/f3/driver/reviewcomments.go +++ b/services/f3/driver/reviewcomments.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/reviews.go b/services/f3/driver/reviews.go index 7c3dcb37de..a20d5741d1 100644 --- a/services/f3/driver/reviews.go +++ b/services/f3/driver/reviews.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/root.go b/services/f3/driver/root.go index f4a6e6a7ca..0e8a67faf3 100644 --- a/services/f3/driver/root.go +++ b/services/f3/driver/root.go @@ -8,7 +8,6 @@ import ( "context" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -34,8 +33,8 @@ func (o *root) ToFormat() f3.Interface { func (o *root) Get(context.Context) bool { return true } -func (o *root) Put(context.Context) f3_id.NodeID { - return f3_id.NilID +func (o *root) Put(context.Context) generic.NodeID { + return generic.NilID } func (o *root) Patch(context.Context) { diff --git a/services/f3/driver/tests/init.go b/services/f3/driver/tests/init.go index 9035296dc0..d7bf23ac88 100644 --- a/services/f3/driver/tests/init.go +++ b/services/f3/driver/tests/init.go @@ -5,7 +5,7 @@ package tests import ( - driver_options "forgejo.org/services/f3/driver/options" + driver_options "code.gitea.io/gitea/services/f3/driver/options" tests_forge "code.forgejo.org/f3/gof3/v3/tree/tests/f3/forge" ) diff --git a/services/f3/driver/tests/new.go b/services/f3/driver/tests/new.go index 2f5c6c64db..2e3dfc3c95 100644 --- a/services/f3/driver/tests/new.go +++ b/services/f3/driver/tests/new.go @@ -7,10 +7,10 @@ package tests import ( "testing" - driver_options "forgejo.org/services/f3/driver/options" + driver_options "code.gitea.io/gitea/services/f3/driver/options" - f3_kind "code.forgejo.org/f3/gof3/v3/kind" "code.forgejo.org/f3/gof3/v3/options" + "code.forgejo.org/f3/gof3/v3/tree/generic" forge_test "code.forgejo.org/f3/gof3/v3/tree/tests/f3/forge" ) @@ -22,8 +22,8 @@ func (o *forgeTest) NewOptions(t *testing.T) options.Interface { return newTestOptions(t) } -func (o *forgeTest) GetExceptions() []f3_kind.Kind { - return []f3_kind.Kind{} +func (o *forgeTest) GetExceptions() []generic.Kind { + return []generic.Kind{} } func (o *forgeTest) GetNonTestUsers() []string { diff --git a/services/f3/driver/tests/options.go b/services/f3/driver/tests/options.go index f61b10c9ef..adaa1da588 100644 --- a/services/f3/driver/tests/options.go +++ b/services/f3/driver/tests/options.go @@ -7,9 +7,9 @@ package tests import ( "testing" - forgejo_log "forgejo.org/modules/log" - driver_options "forgejo.org/services/f3/driver/options" - "forgejo.org/services/f3/util" + forgejo_log "code.gitea.io/gitea/modules/log" + driver_options "code.gitea.io/gitea/services/f3/driver/options" + "code.gitea.io/gitea/services/f3/util" "code.forgejo.org/f3/gof3/v3/options" ) diff --git a/services/f3/driver/topic.go b/services/f3/driver/topic.go index cc94aa35fa..16b2eb3142 100644 --- a/services/f3/driver/topic.go +++ b/services/f3/driver/topic.go @@ -8,11 +8,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -80,14 +79,14 @@ func (o *topic) Patch(ctx context.Context) { } } -func (o *topic) Put(ctx context.Context) f3_id.NodeID { +func (o *topic) Put(ctx context.Context) generic.NodeID { sess := db.GetEngine(ctx) if _, err := sess.Insert(o.forgejoTopic); err != nil { panic(err) } o.Trace("topic created %d", o.forgejoTopic.ID) - return f3_id.NewNodeID(o.forgejoTopic.ID) + return generic.NewNodeID(o.forgejoTopic.ID) } func (o *topic) Delete(ctx context.Context) { diff --git a/services/f3/driver/topics.go b/services/f3/driver/topics.go index 38f03dbd2d..2685a47928 100644 --- a/services/f3/driver/topics.go +++ b/services/f3/driver/topics.go @@ -8,8 +8,8 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" diff --git a/services/f3/driver/tree.go b/services/f3/driver/tree.go index ff927df9d4..0302ed74ae 100644 --- a/services/f3/driver/tree.go +++ b/services/f3/driver/tree.go @@ -8,9 +8,8 @@ import ( "context" "fmt" - forgejo_options "forgejo.org/services/f3/driver/options" + forgejo_options "code.gitea.io/gitea/services/f3/driver/options" - f3_kind "code.forgejo.org/f3/gof3/v3/kind" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -25,7 +24,7 @@ func (o *treeDriver) Init() { o.NullTreeDriver.Init() } -func (o *treeDriver) Factory(ctx context.Context, kind f3_kind.Kind) generic.NodeDriverInterface { +func (o *treeDriver) Factory(ctx context.Context, kind generic.Kind) generic.NodeDriverInterface { switch kind { case f3_tree.KindForge: return newForge() @@ -89,7 +88,7 @@ func (o *treeDriver) Factory(ctx context.Context, kind f3_kind.Kind) generic.Nod return newRepositories() case f3_tree.KindRepository: return newRepository(ctx) - case f3_kind.KindRoot: + case generic.KindRoot: return newRoot(o.GetTree().(f3_tree.TreeInterface).NewFormat(kind)) default: panic(fmt.Errorf("unexpected kind %s", kind)) diff --git a/services/f3/driver/user.go b/services/f3/driver/user.go index bf8bfaf9c9..221b06e834 100644 --- a/services/f3/driver/user.go +++ b/services/f3/driver/user.go @@ -9,12 +9,11 @@ import ( "fmt" "strings" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - user_service "forgejo.org/services/user" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + user_service "code.gitea.io/gitea/services/user" "code.forgejo.org/f3/gof3/v3/f3" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" f3_util "code.forgejo.org/f3/gof3/v3/util" @@ -97,9 +96,9 @@ func (o *user) Get(ctx context.Context) bool { func (o *user) Patch(context.Context) { } -func (o *user) Put(ctx context.Context) f3_id.NodeID { +func (o *user) Put(ctx context.Context) generic.NodeID { if user := getSystemUserByName(o.forgejoUser.Name); user != nil { - return f3_id.NewNodeID(user.ID) + return generic.NewNodeID(user.ID) } o.forgejoUser.LowerName = strings.ToLower(o.forgejoUser.Name) @@ -112,7 +111,7 @@ func (o *user) Put(ctx context.Context) f3_id.NodeID { panic(err) } - return f3_id.NewNodeID(o.forgejoUser.ID) + return generic.NewNodeID(o.forgejoUser.ID) } func (o *user) Delete(ctx context.Context) { diff --git a/services/f3/driver/users.go b/services/f3/driver/users.go index cb413ae05d..92ed0bcbc5 100644 --- a/services/f3/driver/users.go +++ b/services/f3/driver/users.go @@ -8,10 +8,9 @@ import ( "context" "fmt" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" - f3_id "code.forgejo.org/f3/gof3/v3/id" f3_tree "code.forgejo.org/f3/gof3/v3/tree/f3" "code.forgejo.org/f3/gof3/v3/tree/generic" ) @@ -35,13 +34,13 @@ func (o *users) ListPage(ctx context.Context, page int) generic.ChildrenSlice { return f3_tree.ConvertListed(ctx, o.GetNode(), f3_tree.ConvertToAny(users...)...) } -func (o *users) GetIDFromName(ctx context.Context, name string) f3_id.NodeID { +func (o *users) GetIDFromName(ctx context.Context, name string) generic.NodeID { user, err := user_model.GetUserByName(ctx, name) if err != nil { panic(fmt.Errorf("GetUserByName: %v", err)) } - return f3_id.NewNodeID(user.ID) + return generic.NewNodeID(user.ID) } func newUsers() generic.NodeDriverInterface { diff --git a/services/f3/util/logger.go b/services/f3/util/logger.go index 9a1409ae84..21d8d6bbfa 100644 --- a/services/f3/util/logger.go +++ b/services/f3/util/logger.go @@ -6,8 +6,8 @@ package util import ( "fmt" - forgejo_log "forgejo.org/modules/log" - "forgejo.org/modules/migration" + forgejo_log "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/migration" "code.forgejo.org/f3/gof3/v3/logger" ) diff --git a/services/f3/util/logger_test.go b/services/f3/util/logger_test.go index 4afd5dd57f..db880aa439 100644 --- a/services/f3/util/logger_test.go +++ b/services/f3/util/logger_test.go @@ -8,8 +8,8 @@ import ( "testing" "time" - forgejo_log "forgejo.org/modules/log" - "forgejo.org/modules/test" + forgejo_log "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/test" "code.forgejo.org/f3/gof3/v3/logger" "github.com/stretchr/testify/assert" diff --git a/services/federation/federation_service.go b/services/federation/federation_service.go index 21c7be855b..4c6f5ca0ca 100644 --- a/services/federation/federation_service.go +++ b/services/federation/federation_service.go @@ -11,15 +11,15 @@ import ( "strings" "time" - "forgejo.org/models/forgefed" - "forgejo.org/models/repo" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/auth/password" - fm "forgejo.org/modules/forgefed" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/validation" + "code.gitea.io/gitea/models/forgefed" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/auth/password" + fm "code.gitea.io/gitea/modules/forgefed" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/validation" "github.com/google/uuid" ) diff --git a/services/feed/action.go b/services/feed/action.go index a2cd0551a3..83daaa1438 100644 --- a/services/feed/action.go +++ b/services/feed/action.go @@ -9,17 +9,16 @@ import ( "path" "strings" - activities_model "forgejo.org/models/activities" - 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/json" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + activities_model "code.gitea.io/gitea/models/activities" + 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/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" ) type actionNotifier struct { @@ -320,10 +319,6 @@ func (*actionNotifier) NotifyPullRevieweDismiss(ctx context.Context, doer *user_ } func (a *actionNotifier) PushCommits(ctx context.Context, pusher *user_model.User, repo *repo_model.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { - if len(commits.Commits) > setting.UI.FeedMaxCommitNum { - commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum] - } - data, err := json.Marshal(commits) if err != nil { log.Error("Marshal: %v", err) @@ -395,10 +390,6 @@ func (a *actionNotifier) DeleteRef(ctx context.Context, doer *user_model.User, r } func (a *actionNotifier) SyncPushCommits(ctx context.Context, pusher *user_model.User, repo *repo_model.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { - if len(commits.Commits) > setting.UI.FeedMaxCommitNum { - commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum] - } - data, err := json.Marshal(commits) if err != nil { log.Error("json.Marshal: %v", err) diff --git a/services/feed/action_test.go b/services/feed/action_test.go index b0bbcdc3b6..404d89c7b8 100644 --- a/services/feed/action_test.go +++ b/services/feed/action_test.go @@ -7,20 +7,14 @@ import ( "strings" "testing" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + 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" + user_model "code.gitea.io/gitea/models/user" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -56,89 +50,3 @@ func TestRenameRepoAction(t *testing.T) { unittest.AssertExistsAndLoadBean(t, actionBean) unittest.CheckConsistencyFor(t, &activities_model.Action{}) } - -func pushCommits() *repository.PushCommits { - pushCommits := repository.NewPushCommits() - pushCommits.Commits = []*repository.PushCommit{ - { - Sha1: "69554a6", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "not signed commit", - }, - { - Sha1: "27566bd", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "good signed commit (with not yet validated email)", - }, - { - Sha1: "5099b81", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "good signed commit", - }, - } - pushCommits.HeadCommit = &repository.PushCommit{Sha1: "69554a6"} - return pushCommits -} - -func TestSyncPushCommits(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID}) - - t.Run("All commits", func(t *testing.T) { - defer test.MockVariableValue(&setting.UI.FeedMaxCommitNum, 10)() - - maxID := unittest.GetCount(t, &activities_model.Action{}) - NewNotifier().SyncPushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("master")}, pushCommits()) - - newNotification := unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ActUserID: user.ID, RefName: "refs/heads/master"}, unittest.Cond("id > ?", maxID)) - assert.JSONEq(t, `{"Commits":[{"Sha1":"69554a6","Message":"not signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"},{"Sha1":"27566bd","Message":"good signed commit (with not yet validated email)","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"},{"Sha1":"5099b81","Message":"good signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"}],"HeadCommit":{"Sha1":"69554a6","Message":"","AuthorEmail":"","AuthorName":"","CommitterEmail":"","CommitterName":"","Timestamp":"0001-01-01T00:00:00Z"},"CompareURL":"","Len":0}`, newNotification.Content) - }) - - t.Run("Only one commit", func(t *testing.T) { - defer test.MockVariableValue(&setting.UI.FeedMaxCommitNum, 1)() - - maxID := unittest.GetCount(t, &activities_model.Action{}) - NewNotifier().SyncPushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("main")}, pushCommits()) - - newNotification := unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ActUserID: user.ID, RefName: "refs/heads/main"}, unittest.Cond("id > ?", maxID)) - assert.JSONEq(t, `{"Commits":[{"Sha1":"69554a6","Message":"not signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"}],"HeadCommit":{"Sha1":"69554a6","Message":"","AuthorEmail":"","AuthorName":"","CommitterEmail":"","CommitterName":"","Timestamp":"0001-01-01T00:00:00Z"},"CompareURL":"","Len":0}`, newNotification.Content) - }) -} - -func TestPushCommits(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID}) - - t.Run("All commits", func(t *testing.T) { - defer test.MockVariableValue(&setting.UI.FeedMaxCommitNum, 10)() - - maxID := unittest.GetCount(t, &activities_model.Action{}) - NewNotifier().PushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("master")}, pushCommits()) - - newNotification := unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ActUserID: user.ID, RefName: "refs/heads/master"}, unittest.Cond("id > ?", maxID)) - assert.JSONEq(t, `{"Commits":[{"Sha1":"69554a6","Message":"not signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"},{"Sha1":"27566bd","Message":"good signed commit (with not yet validated email)","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"},{"Sha1":"5099b81","Message":"good signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"}],"HeadCommit":{"Sha1":"69554a6","Message":"","AuthorEmail":"","AuthorName":"","CommitterEmail":"","CommitterName":"","Timestamp":"0001-01-01T00:00:00Z"},"CompareURL":"","Len":0}`, newNotification.Content) - }) - - t.Run("Only one commit", func(t *testing.T) { - defer test.MockVariableValue(&setting.UI.FeedMaxCommitNum, 1)() - - maxID := unittest.GetCount(t, &activities_model.Action{}) - NewNotifier().PushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("main")}, pushCommits()) - - newNotification := unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ActUserID: user.ID, RefName: "refs/heads/main"}, unittest.Cond("id > ?", maxID)) - assert.JSONEq(t, `{"Commits":[{"Sha1":"69554a6","Message":"not signed commit","AuthorEmail":"user2@example.com","AuthorName":"User2","CommitterEmail":"user2@example.com","CommitterName":"User2","Timestamp":"0001-01-01T00:00:00Z"}],"HeadCommit":{"Sha1":"69554a6","Message":"","AuthorEmail":"","AuthorName":"","CommitterEmail":"","CommitterName":"","Timestamp":"0001-01-01T00:00:00Z"},"CompareURL":"","Len":0}`, newNotification.Content) - }) -} diff --git a/services/forgejo/main_test.go b/services/forgejo/main_test.go index 5523ed1aab..e88b7d0263 100644 --- a/services/forgejo/main_test.go +++ b/services/forgejo/main_test.go @@ -5,12 +5,11 @@ package forgejo import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/services/forgejo/sanity.go b/services/forgejo/sanity.go index 70f15889d4..5e817d67f5 100644 --- a/services/forgejo/sanity.go +++ b/services/forgejo/sanity.go @@ -3,9 +3,9 @@ package forgejo import ( - "forgejo.org/models/db" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) var ( diff --git a/services/forgejo/sanity_test.go b/services/forgejo/sanity_test.go index 065a9fda4d..657f7e2720 100644 --- a/services/forgejo/sanity_test.go +++ b/services/forgejo/sanity_test.go @@ -7,9 +7,9 @@ import ( "path/filepath" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/require" ) diff --git a/services/forgejo/sanity_v1TOv5_0_1Included.go b/services/forgejo/sanity_v1TOv5_0_1Included.go index 1d3f07d8e1..49de636f33 100644 --- a/services/forgejo/sanity_v1TOv5_0_1Included.go +++ b/services/forgejo/sanity_v1TOv5_0_1Included.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "forgejo.org/models/db" - "forgejo.org/models/forgejo/semver" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/forgejo/semver" + "code.gitea.io/gitea/modules/setting" "github.com/hashicorp/go-version" ) diff --git a/services/forgejo/sanity_v1TOv5_0_1Included_test.go b/services/forgejo/sanity_v1TOv5_0_1Included_test.go index 2521afb496..56618ebd5f 100644 --- a/services/forgejo/sanity_v1TOv5_0_1Included_test.go +++ b/services/forgejo/sanity_v1TOv5_0_1Included_test.go @@ -6,10 +6,10 @@ import ( "fmt" "testing" - "forgejo.org/models/db" - "forgejo.org/models/forgejo/semver" - "forgejo.org/models/unittest" - "forgejo.org/modules/log" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/forgejo/semver" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/log" "github.com/stretchr/testify/require" ) diff --git a/services/forms/admin.go b/services/forms/admin.go index 5a5d46634b..7d46904440 100644 --- a/services/forms/admin.go +++ b/services/forms/admin.go @@ -6,11 +6,11 @@ package forms import ( "net/http" - "forgejo.org/modules/structs" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // AdminCreateUserForm form for admin to create user @@ -18,7 +18,7 @@ type AdminCreateUserForm struct { LoginType string `binding:"Required"` LoginName string UserName string `binding:"Required;Username;MaxSize(40)"` - Email string `binding:"Required;EmailForAdmin;MaxSize(254)"` + Email string `binding:"Required;Email;MaxSize(254)"` Password string `binding:"MaxSize(255)"` SendNotify bool MustChangePassword bool @@ -37,7 +37,7 @@ type AdminEditUserForm struct { UserName string `binding:"Username;MaxSize(40)"` LoginName string FullName string `binding:"MaxSize(100)"` - Email string `binding:"Required;EmailForAdmin;MaxSize(254)"` + Email string `binding:"Required;Email;MaxSize(254)"` Password string `binding:"MaxSize(255)"` Website string `binding:"ValidUrl;MaxSize(255)"` Location string `binding:"MaxSize(50)"` diff --git a/services/forms/auth_form.go b/services/forms/auth_form.go index e665ca0d19..a3eca9473b 100644 --- a/services/forms/auth_form.go +++ b/services/forms/auth_form.go @@ -6,10 +6,10 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // AuthenticationForm form for authentication @@ -75,8 +75,12 @@ type AuthenticationForm struct { Oauth2RestrictedGroup string Oauth2GroupTeamMap string `binding:"ValidGroupTeamMap"` Oauth2GroupTeamMapRemoval bool - Oauth2AttributeSSHPublicKey string SkipLocalTwoFA bool + SSPIAutoCreateUsers bool + SSPIAutoActivateUsers bool + SSPIStripDomainNames bool + SSPISeparatorReplacement string `binding:"AlphaDashDot;MaxSize(5)"` + SSPIDefaultLanguage string GroupTeamMap string `binding:"ValidGroupTeamMap"` GroupTeamMapRemoval bool } diff --git a/services/forms/org.go b/services/forms/org.go index a6e4e72c4a..db182f7e96 100644 --- a/services/forms/org.go +++ b/services/forms/org.go @@ -7,11 +7,11 @@ package forms import ( "net/http" - "forgejo.org/modules/structs" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // ________ .__ __ .__ diff --git a/services/forms/package_form.go b/services/forms/package_form.go index 82e5a09f86..9b6f907164 100644 --- a/services/forms/package_form.go +++ b/services/forms/package_form.go @@ -6,16 +6,16 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) type PackageCleanupRuleForm struct { ID int64 Enabled bool - Type string `binding:"Required;In(alpine,arch,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,alt,rubygems,swift,vagrant)"` + Type string `binding:"Required;In(alpine,arch,cargo,chef,composer,conan,conda,container,cran,debian,generic,go,helm,maven,npm,nuget,pub,pypi,rpm,rubygems,swift,vagrant)"` KeepCount int `binding:"In(0,1,5,10,25,50,100)"` KeepPattern string `binding:"RegexPattern"` RemoveDays int `binding:"In(0,7,14,30,60,90,180)"` diff --git a/services/forms/repo_branch_form.go b/services/forms/repo_branch_form.go index c34e7c6d17..42e6c85c37 100644 --- a/services/forms/repo_branch_form.go +++ b/services/forms/repo_branch_form.go @@ -6,10 +6,10 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // NewBranchForm form for creating a new branch diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go index c39c6a7b36..c3d9c3edc9 100644 --- a/services/forms/repo_form.go +++ b/services/forms/repo_form.go @@ -12,22 +12,22 @@ import ( "regexp" "strings" - "forgejo.org/models" - issues_model "forgejo.org/models/issues" - project_model "forgejo.org/models/project" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/models" + issues_model "code.gitea.io/gitea/models/issues" + project_model "code.gitea.io/gitea/models/project" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // CreateRepoForm form for creating repository type CreateRepoForm struct { UID int64 `binding:"Required"` - RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)" preprocess:"TrimSpace"` + RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"` Private bool Description string `binding:"MaxSize(2048)"` DefaultBranch string `binding:"GitRefName;MaxSize(100)"` @@ -188,8 +188,7 @@ type RepoUnitSettingForm struct { PullsAllowSquash bool PullsAllowFastForwardOnly bool PullsAllowManualMerge bool - PullsDefaultMergeStyle string `binding:"In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged,rebase-update-only)"` - PullsDefaultUpdateStyle string `binding:"In(merge,rebase)"` + PullsDefaultMergeStyle string EnableAutodetectManualMerge bool PullsAllowRebaseUpdate bool DefaultDeleteBranchAfterMerge bool @@ -740,6 +739,13 @@ type SaveTopicForm struct { Topics []string `binding:"topics;Required;"` } -type CommitNotesForm struct { - Notes string +// DeadlineForm hold the validation rules for deadlines +type DeadlineForm struct { + DateString string `form:"date" binding:"Required;Size(10)"` +} + +// Validate validates the fields +func (f *DeadlineForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { + ctx := context.GetValidateContext(req) + return middleware.Validate(errs, ctx.Data, f, ctx.Locale) } diff --git a/services/forms/repo_form_test.go b/services/forms/repo_form_test.go index 4047762096..2c5a8e2c0f 100644 --- a/services/forms/repo_form_test.go +++ b/services/forms/repo_form_test.go @@ -6,7 +6,7 @@ package forms import ( "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" ) diff --git a/services/forms/repo_tag_form.go b/services/forms/repo_tag_form.go index 1254c84d07..0135684737 100644 --- a/services/forms/repo_tag_form.go +++ b/services/forms/repo_tag_form.go @@ -6,10 +6,10 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // ProtectTagForm form for changing protected tag settings diff --git a/services/forms/runner.go b/services/forms/runner.go index fcf6c5a694..6abfc66fc2 100644 --- a/services/forms/runner.go +++ b/services/forms/runner.go @@ -6,10 +6,10 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // EditRunnerForm form for admin to create runner diff --git a/services/forms/user_form.go b/services/forms/user_form.go index dfd5b3da9b..cc93b27e2a 100644 --- a/services/forms/user_form.go +++ b/services/forms/user_form.go @@ -9,14 +9,14 @@ import ( "net/http" "strings" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/validation" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // InstallForm form for installation page @@ -110,7 +110,7 @@ func (f *RegisterForm) Validate(req *http.Request, errs binding.Errors) binding. // domains in the whitelist or if it doesn't match any of // domains in the blocklist, if any such list is not empty. func (f *RegisterForm) IsEmailDomainAllowed() bool { - return validation.IsEmailDomainAllowed(f.Email) + return user_model.IsEmailDomainAllowed(f.Email) } // MustChangePasswordForm form for updating your password after account creation @@ -224,7 +224,6 @@ type UpdateProfileForm struct { Biography string `binding:"MaxSize(255)"` Visibility structs.VisibleType KeepActivityPrivate bool - KeepPronounsPrivate bool } // Validate validates the fields @@ -259,7 +258,7 @@ const ( type AvatarForm struct { Source string Avatar *multipart.FileHeader - Gravatar string `binding:"OmitEmpty;EmailWithAllowedDomain;MaxSize(254)"` + Gravatar string `binding:"OmitEmpty;Email;MaxSize(254)"` Federavatar bool } @@ -271,7 +270,7 @@ func (f *AvatarForm) Validate(req *http.Request, errs binding.Errors) binding.Er // AddEmailForm form for adding new email type AddEmailForm struct { - Email string `binding:"Required;EmailWithAllowedDomain;MaxSize(254)"` + Email string `binding:"Required;Email;MaxSize(254)"` } // Validate validates the fields @@ -291,7 +290,7 @@ func (f *UpdateThemeForm) Validate(req *http.Request, errs binding.Errors) bindi return middleware.Validate(errs, ctx.Data, f, ctx.Locale) } -// IsThemeExists checks if the theme is available in the config. +// IsThemeExists checks if the theme is a theme available in the config. func (f UpdateThemeForm) IsThemeExists() bool { var exists bool @@ -389,7 +388,7 @@ func (f *NewAccessTokenForm) GetScope() (auth_model.AccessTokenScope, error) { // EditOAuth2ApplicationForm form for editing oauth2 applications type EditOAuth2ApplicationForm struct { Name string `binding:"Required;MaxSize(255)" form:"application_name"` - RedirectURIs string `binding:"Required;ValidUrlList" form:"redirect_uris"` + RedirectURIs string `binding:"Required" form:"redirect_uris"` ConfidentialClient bool `form:"confidential_client"` } diff --git a/services/forms/user_form_auth_openid.go b/services/forms/user_form_auth_openid.go index 02d4f873bc..ca1c77e320 100644 --- a/services/forms/user_form_auth_openid.go +++ b/services/forms/user_form_auth_openid.go @@ -6,10 +6,10 @@ package forms import ( "net/http" - "forgejo.org/modules/web/middleware" - "forgejo.org/services/context" + "code.gitea.io/gitea/modules/web/middleware" + "code.gitea.io/gitea/services/context" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) // SignInOpenIDForm form for signing in with OpenID @@ -27,7 +27,7 @@ func (f *SignInOpenIDForm) Validate(req *http.Request, errs binding.Errors) bind // SignUpOpenIDForm form for signin up with OpenID type SignUpOpenIDForm struct { UserName string `binding:"Required;Username;MaxSize(40)"` - Email string `binding:"Required;EmailWithAllowedDomain;MaxSize(254)"` + Email string `binding:"Required;Email;MaxSize(254)"` } // Validate validates the fields diff --git a/services/forms/user_form_hidden_comments.go b/services/forms/user_form_hidden_comments.go index 74a1aaccb0..b9677c1800 100644 --- a/services/forms/user_form_hidden_comments.go +++ b/services/forms/user_form_hidden_comments.go @@ -6,9 +6,9 @@ package forms import ( "math/big" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/log" - "forgejo.org/services/context" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/services/context" ) type hiddenCommentTypeGroupsType map[string][]issues_model.CommentType diff --git a/services/forms/user_form_test.go b/services/forms/user_form_test.go index 67fb64cabf..66050187c9 100644 --- a/services/forms/user_form_test.go +++ b/services/forms/user_form_test.go @@ -7,8 +7,8 @@ import ( "strconv" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/setting" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/setting" "github.com/gobwas/glob" "github.com/stretchr/testify/assert" diff --git a/services/gitdiff/csv_test.go b/services/gitdiff/csv_test.go index 9bffba33fd..1dbe616374 100644 --- a/services/gitdiff/csv_test.go +++ b/services/gitdiff/csv_test.go @@ -8,9 +8,9 @@ import ( "strings" "testing" - "forgejo.org/models/db" - csv_module "forgejo.org/modules/csv" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + csv_module "code.gitea.io/gitea/modules/csv" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go index 2e1fecda2a..8f376a1045 100644 --- a/services/gitdiff/gitdiff.go +++ b/services/gitdiff/gitdiff.go @@ -17,19 +17,19 @@ import ( "strings" "time" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - pull_model "forgejo.org/models/pull" - user_model "forgejo.org/models/user" - "forgejo.org/modules/analyze" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/highlight" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + pull_model "code.gitea.io/gitea/models/pull" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/analyze" + "code.gitea.io/gitea/modules/charset" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/highlight" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" "github.com/sergi/go-diff/diffmatchpatch" stdcharset "golang.org/x/net/html/charset" @@ -379,11 +379,18 @@ func (diffFile *DiffFile) GetType() int { } // GetTailSection creates a fake DiffLineSection if the last section is not the end of the file -func (diffFile *DiffFile) GetTailSection(gitRepo *git.Repository, leftCommit, rightCommit *git.Commit) *DiffSection { +func (diffFile *DiffFile) GetTailSection(gitRepo *git.Repository, leftCommitID, rightCommitID string) *DiffSection { if len(diffFile.Sections) == 0 || diffFile.Type != DiffFileChange || diffFile.IsBin || diffFile.IsLFSFile { return nil } - + leftCommit, err := gitRepo.GetCommit(leftCommitID) + if err != nil { + return nil + } + rightCommit, err := gitRepo.GetCommit(rightCommitID) + if err != nil { + return nil + } lastSection := diffFile.Sections[len(diffFile.Sections)-1] lastLine := lastSection.Lines[len(lastSection.Lines)-1] leftLineCount := getCommitFileLineCount(leftCommit, diffFile.Name) @@ -525,6 +532,11 @@ parsingLoop: lastFile := createDiffFile(diff, line) diff.End = lastFile.Name diff.IsIncomplete = true + _, err := io.Copy(io.Discard, reader) + if err != nil { + // By the definition of io.Copy this never returns io.EOF + return diff, fmt.Errorf("error during io.Copy: %w", err) + } break parsingLoop } @@ -1085,7 +1097,6 @@ type DiffOptions struct { MaxFiles int WhitespaceBehavior git.TrustedCmdArgs DirectComparison bool - FileOnly bool } // GetDiff builds a Diff between two commits of a repository. @@ -1094,16 +1105,12 @@ type DiffOptions struct { func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, files ...string) (*Diff, error) { repoPath := gitRepo.Path - var beforeCommit *git.Commit commit, err := gitRepo.GetCommit(opts.AfterCommitID) if err != nil { return nil, err } - cmdCtx, cmdCancel := context.WithCancel(ctx) - defer cmdCancel() - - cmdDiff := git.NewCommand(cmdCtx) + cmdDiff := git.NewCommand(gitRepo.Ctx) objectFormat, err := gitRepo.GetObjectFormat() if err != nil { return nil, err @@ -1117,10 +1124,7 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi } else { actualBeforeCommitID := opts.BeforeCommitID if len(actualBeforeCommitID) == 0 { - parentCommit, err := commit.Parent(0) - if err != nil { - return nil, err - } + parentCommit, _ := commit.Parent(0) actualBeforeCommitID = parentCommit.ID.String() } @@ -1128,11 +1132,6 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi AddArguments(opts.WhitespaceBehavior...). AddDynamicArguments(actualBeforeCommitID, opts.AfterCommitID) opts.BeforeCommitID = actualBeforeCommitID - - beforeCommit, err = gitRepo.GetCommit(opts.BeforeCommitID) - if err != nil { - return nil, err - } } // In git 2.31, git diff learned --skip-to which we can use to shortcut skip to file @@ -1160,16 +1159,14 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi Dir: repoPath, Stdout: writer, Stderr: stderr, - }); err != nil && !git.IsErrCanceledOrKilled(err) { + }); err != nil { log.Error("error during GetDiff(git diff dir: %s): %v, stderr: %s", repoPath, err, stderr.String()) } _ = writer.Close() }() - diff, err := ParsePatch(cmdCtx, opts.MaxLines, opts.MaxLineCharacters, opts.MaxFiles, reader, parsePatchSkipToFile) - // Ensure the git process is killed if it didn't exit already - cmdCancel() + diff, err := ParsePatch(ctx, opts.MaxLines, opts.MaxLineCharacters, opts.MaxFiles, reader, parsePatchSkipToFile) if err != nil { return nil, fmt.Errorf("unable to ParsePatch: %w", err) } @@ -1210,28 +1207,37 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi diffFile.IsGenerated = analyze.IsGenerated(diffFile.Name) } - tailSection := diffFile.GetTailSection(gitRepo, beforeCommit, commit) + tailSection := diffFile.GetTailSection(gitRepo, opts.BeforeCommitID, opts.AfterCommitID) if tailSection != nil { diffFile.Sections = append(diffFile.Sections, tailSection) } } - if opts.FileOnly { - return diff, nil + separator := "..." + if opts.DirectComparison { + separator = ".." } - stats, err := GetPullDiffStats(gitRepo, opts) + diffPaths := []string{opts.BeforeCommitID + separator + opts.AfterCommitID} + if len(opts.BeforeCommitID) == 0 || opts.BeforeCommitID == objectFormat.EmptyObjectID().String() { + diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID} + } + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) + if err != nil && strings.Contains(err.Error(), "no merge base") { + // git >= 2.28 now returns an error if base and head have become unrelated. + // previously it would return the results of git diff --shortstat base head so let's try that... + diffPaths = []string{opts.BeforeCommitID, opts.AfterCommitID} + diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) + } if err != nil { return nil, err } - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion = stats.NumFiles, stats.TotalAddition, stats.TotalDeletion - return diff, nil } type PullDiffStats struct { - NumFiles, TotalAddition, TotalDeletion int + TotalAddition, TotalDeletion int } // GetPullDiffStats @@ -1255,12 +1261,12 @@ func GetPullDiffStats(gitRepo *git.Repository, opts *DiffOptions) (*PullDiffStat diffPaths = []string{objectFormat.EmptyTree().String(), opts.AfterCommitID} } - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) + _, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) if err != nil && strings.Contains(err.Error(), "no merge base") { // git >= 2.28 now returns an error if base and head have become unrelated. // previously it would return the results of git diff --shortstat base head so let's try that... diffPaths = []string{opts.BeforeCommitID, opts.AfterCommitID} - diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) + _, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(gitRepo.Ctx, repoPath, nil, diffPaths...) } if err != nil { return nil, err @@ -1381,8 +1387,10 @@ func GetWhitespaceFlag(whitespaceBehavior string) git.TrustedCmdArgs { "ignore-eol": {"--ignore-space-at-eol"}, "show-all": nil, } + if flag, ok := whitespaceFlags[whitespaceBehavior]; ok { return flag } + log.Warn("unknown whitespace behavior: %q, default to 'show-all'", whitespaceBehavior) return nil } diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index 532255fe84..f2c099d554 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -9,13 +9,13 @@ import ( "strings" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" + "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/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" dmp "github.com/sergi/go-diff/diffmatchpatch" "github.com/stretchr/testify/assert" diff --git a/services/gitdiff/highlightdiff.go b/services/gitdiff/highlightdiff.go index 08681b8617..c72959ea16 100644 --- a/services/gitdiff/highlightdiff.go +++ b/services/gitdiff/highlightdiff.go @@ -6,7 +6,7 @@ package gitdiff import ( "strings" - "forgejo.org/modules/highlight" + "code.gitea.io/gitea/modules/highlight" "github.com/sergi/go-diff/diffmatchpatch" ) diff --git a/services/gitdiff/main_test.go b/services/gitdiff/main_test.go index cd7a6a4a6b..cd9dcd8cd6 100644 --- a/services/gitdiff/main_test.go +++ b/services/gitdiff/main_test.go @@ -6,12 +6,11 @@ package gitdiff import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/activities" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" ) func TestMain(m *testing.M) { diff --git a/services/indexer/indexer.go b/services/indexer/indexer.go index 92036f95c3..38dd012a51 100644 --- a/services/indexer/indexer.go +++ b/services/indexer/indexer.go @@ -4,10 +4,10 @@ package indexer import ( - code_indexer "forgejo.org/modules/indexer/code" - issue_indexer "forgejo.org/modules/indexer/issues" - stats_indexer "forgejo.org/modules/indexer/stats" - notify_service "forgejo.org/services/notify" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + stats_indexer "code.gitea.io/gitea/modules/indexer/stats" + notify_service "code.gitea.io/gitea/services/notify" ) // Init initialize the repo indexer diff --git a/services/indexer/notify.go b/services/indexer/notify.go index ddd89f733c..e2cfe477d3 100644 --- a/services/indexer/notify.go +++ b/services/indexer/notify.go @@ -6,16 +6,16 @@ package indexer import ( "context" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - code_indexer "forgejo.org/modules/indexer/code" - issue_indexer "forgejo.org/modules/indexer/issues" - stats_indexer "forgejo.org/modules/indexer/stats" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - notify_service "forgejo.org/services/notify" + 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_indexer "code.gitea.io/gitea/modules/indexer/code" + issue_indexer "code.gitea.io/gitea/modules/indexer/issues" + stats_indexer "code.gitea.io/gitea/modules/indexer/stats" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + notify_service "code.gitea.io/gitea/services/notify" ) type indexerNotifier struct { diff --git a/services/issue/assignee.go b/services/issue/assignee.go index a5f9c2731f..9c2ef74bb0 100644 --- a/services/issue/assignee.go +++ b/services/issue/assignee.go @@ -6,15 +6,15 @@ package issue import ( "context" - issues_model "forgejo.org/models/issues" - "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" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + "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" + notify_service "code.gitea.io/gitea/services/notify" ) // DeleteNotPassedAssignee deletes all assignees who aren't passed via the "assignees" array @@ -72,8 +72,7 @@ func ReviewRequest(ctx context.Context, issue *issues_model.Issue, doer, reviewe return nil, err } - // don't notify if the user is requesting itself as reviewer - if comment != nil && doer.ID != reviewer.ID { + if comment != nil { notify_service.PullRequestReviewRequest(ctx, doer, issue, reviewer, isAdd, comment) } diff --git a/services/issue/assignee_test.go b/services/issue/assignee_test.go index 66a66459cb..2b70b8c8ce 100644 --- a/services/issue/assignee_test.go +++ b/services/issue/assignee_test.go @@ -6,10 +6,10 @@ package issue import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/issue/comments.go b/services/issue/comments.go index dedef6cc87..3ab577b83f 100644 --- a/services/issue/comments.go +++ b/services/issue/comments.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - "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/timeutil" - notify_service "forgejo.org/services/notify" + "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/timeutil" + notify_service "code.gitea.io/gitea/services/notify" ) // CreateRefComment creates a commit reference comment to issue. diff --git a/services/issue/comments_test.go b/services/issue/comments_test.go index 728af15529..62547a584a 100644 --- a/services/issue/comments_test.go +++ b/services/issue/comments_test.go @@ -6,17 +6,17 @@ package issue_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - issue_service "forgejo.org/services/issue" - "forgejo.org/tests" + "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" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + issue_service "code.gitea.io/gitea/services/issue" + "code.gitea.io/gitea/tests" - _ "forgejo.org/services/webhook" + _ "code.gitea.io/gitea/services/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/issue/commit.go b/services/issue/commit.go index 1e51fb32b7..8b927d52b6 100644 --- a/services/issue/commit.go +++ b/services/issue/commit.go @@ -13,15 +13,15 @@ import ( "strings" "time" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - 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/references" - "forgejo.org/modules/repository" + 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" + 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/log" + "code.gitea.io/gitea/modules/references" + "code.gitea.io/gitea/modules/repository" ) const ( diff --git a/services/issue/commit_test.go b/services/issue/commit_test.go index e3a41d2305..c3c3e4c042 100644 --- a/services/issue/commit_test.go +++ b/services/issue/commit_test.go @@ -6,14 +6,14 @@ package issue import ( "testing" - activities_model "forgejo.org/models/activities" - "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/repository" - "forgejo.org/modules/setting" + activities_model "code.gitea.io/gitea/models/activities" + "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/repository" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/require" ) diff --git a/services/issue/content.go b/services/issue/content.go index d5c79e5fde..612a9a6b4c 100644 --- a/services/issue/content.go +++ b/services/issue/content.go @@ -6,9 +6,9 @@ package issue import ( "context" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" ) // ChangeContent changes issue content, as the given user. diff --git a/services/issue/issue.go b/services/issue/issue.go index f6a3e90b10..5e726176d0 100644 --- a/services/issue/issue.go +++ b/services/issue/issue.go @@ -8,19 +8,19 @@ import ( "fmt" "time" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - 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" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" - notify_service "forgejo.org/services/notify" + activities_model "code.gitea.io/gitea/models/activities" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + 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" + 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/storage" + "code.gitea.io/gitea/modules/timeutil" + notify_service "code.gitea.io/gitea/services/notify" ) // NewIssue creates new issue with labels for repository. diff --git a/services/issue/issue_test.go b/services/issue/issue_test.go index e15a0118ad..a0bb88e387 100644 --- a/services/issue/issue_test.go +++ b/services/issue/issue_test.go @@ -6,11 +6,11 @@ package issue import ( "testing" - "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" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/issue/label.go b/services/issue/label.go index bcac54272a..6b8070d8aa 100644 --- a/services/issue/label.go +++ b/services/issue/label.go @@ -6,11 +6,11 @@ package issue import ( "context" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - user_model "forgejo.org/models/user" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + access_model "code.gitea.io/gitea/models/perm/access" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" ) // ClearLabels clears all of an issue's labels diff --git a/services/issue/label_test.go b/services/issue/label_test.go index 73a028684b..b9d26345c1 100644 --- a/services/issue/label_test.go +++ b/services/issue/label_test.go @@ -6,10 +6,10 @@ package issue import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/require" ) diff --git a/services/issue/main_test.go b/services/issue/main_test.go index 673ec5e4cc..c3da441537 100644 --- a/services/issue/main_test.go +++ b/services/issue/main_test.go @@ -6,11 +6,11 @@ package issue import ( "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/services/webhook" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/webhook" - _ "forgejo.org/models/actions" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/services/issue/milestone.go b/services/issue/milestone.go index 3fa7083812..31490c7b03 100644 --- a/services/issue/milestone.go +++ b/services/issue/milestone.go @@ -7,10 +7,10 @@ import ( "context" "fmt" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" ) func updateMilestoneCounters(ctx context.Context, issue *issues_model.Issue, id int64) error { @@ -85,10 +85,6 @@ func changeMilestoneAssign(ctx context.Context, doer *user_model.User, issue *is } } - if issue.MilestoneID == 0 { - issue.Milestone = nil - } - return nil } diff --git a/services/issue/milestone_test.go b/services/issue/milestone_test.go index 4123433c2a..1c06572f8e 100644 --- a/services/issue/milestone_test.go +++ b/services/issue/milestone_test.go @@ -6,10 +6,10 @@ package issue import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,7 +24,6 @@ func TestChangeMilestoneAssign(t *testing.T) { oldMilestoneID := issue.MilestoneID issue.MilestoneID = 2 - require.NoError(t, issue.LoadMilestone(db.DefaultContext)) require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID)) unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ IssueID: issue.ID, @@ -33,11 +32,4 @@ func TestChangeMilestoneAssign(t *testing.T) { OldMilestoneID: oldMilestoneID, }) unittest.CheckConsistencyFor(t, &issues_model.Milestone{}, &issues_model.Issue{}) - assert.NotNil(t, issue.Milestone) - - oldMilestoneID = issue.MilestoneID - issue.MilestoneID = 0 - require.NoError(t, ChangeMilestoneAssign(db.DefaultContext, issue, doer, oldMilestoneID)) - assert.EqualValues(t, 0, issue.MilestoneID) - assert.Nil(t, issue.Milestone) } diff --git a/services/issue/pull.go b/services/issue/pull.go index b0a0c47d88..3b61c00afa 100644 --- a/services/issue/pull.go +++ b/services/issue/pull.go @@ -8,15 +8,15 @@ import ( "fmt" "time" - issues_model "forgejo.org/models/issues" - org_model "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + issues_model "code.gitea.io/gitea/models/issues" + org_model "code.gitea.io/gitea/models/organization" + 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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) func getMergeBase(repo *git.Repository, pr *issues_model.PullRequest, baseBranch, headBranch string) (string, error) { diff --git a/services/issue/reaction.go b/services/issue/reaction.go index c6a11aa0f0..dbb4735de2 100644 --- a/services/issue/reaction.go +++ b/services/issue/reaction.go @@ -5,8 +5,8 @@ package issue import ( "context" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" ) // CreateIssueReaction creates a reaction on issue. diff --git a/services/issue/status.go b/services/issue/status.go index 6664da7daa..9b6c683f4f 100644 --- a/services/issue/status.go +++ b/services/issue/status.go @@ -6,10 +6,10 @@ package issue import ( "context" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + notify_service "code.gitea.io/gitea/services/notify" ) // ChangeStatus changes issue status to open or closed. diff --git a/services/issue/template.go b/services/issue/template.go index 67a01825d2..47633e5d85 100644 --- a/services/issue/template.go +++ b/services/issue/template.go @@ -10,11 +10,11 @@ import ( "path" "strings" - "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/issue/template" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/issue/template" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" "gopkg.in/yaml.v3" ) @@ -56,6 +56,8 @@ func GetTemplateConfig(gitRepo *git.Repository, path string, commit *git.Commit) return GetDefaultTemplateConfig(), nil } + var err error + treeEntry, err := commit.GetTreeEntryByPath(path) if err != nil { return GetDefaultTemplateConfig(), err diff --git a/services/lfs/locks.go b/services/lfs/locks.go index a45b2cc93b..2a362b1c0d 100644 --- a/services/lfs/locks.go +++ b/services/lfs/locks.go @@ -8,16 +8,16 @@ import ( "strconv" "strings" - auth_model "forgejo.org/models/auth" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/json" - lfs_module "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" - "forgejo.org/services/convert" + auth_model "code.gitea.io/gitea/models/auth" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/json" + lfs_module "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/convert" ) func handleLockListOut(ctx *context.Context, repo *repo_model.Repository, lock *git_model.LFSLock, err error) { diff --git a/services/lfs/server.go b/services/lfs/server.go index 8eef62eabe..a300de19c4 100644 --- a/services/lfs/server.go +++ b/services/lfs/server.go @@ -18,21 +18,21 @@ import ( "strconv" "strings" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - git_model "forgejo.org/models/git" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - lfs_module "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/services/context" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/models/perm" + access_model "code.gitea.io/gitea/models/perm/access" + quota_model "code.gitea.io/gitea/models/quota" + 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/json" + lfs_module "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/services/context" "github.com/golang-jwt/jwt/v5" ) @@ -192,11 +192,6 @@ func BatchHandler(ctx *context.Context) { } } - if setting.LFS.MaxBatchSize != 0 && len(br.Objects) > setting.LFS.MaxBatchSize { - writeStatus(ctx, http.StatusRequestEntityTooLarge) - return - } - contentStore := lfs_module.NewContentStore() var responseObjects []*lfs_module.ObjectResponse @@ -485,7 +480,7 @@ func buildObjectResponse(rc *requestContext, pointer lfs_module.Pointer, downloa var link *lfs_module.Link if setting.LFS.Storage.MinioConfig.ServeDirect { // If we have a signed url (S3, object storage), redirect to this directly. - u, err := storage.LFS.URL(pointer.RelativePath(), pointer.Oid, nil) + u, err := storage.LFS.URL(pointer.RelativePath(), pointer.Oid) if u != nil && err == nil { // Presigned url does not need the Authorization header // https://github.com/go-gitea/gitea/issues/21525 diff --git a/services/mailer/incoming/incoming.go b/services/mailer/incoming/incoming.go index b1b9191df3..ac6f32c540 100644 --- a/services/mailer/incoming/incoming.go +++ b/services/mailer/incoming/incoming.go @@ -7,22 +7,20 @@ import ( "context" "crypto/tls" "fmt" - "mime" net_mail "net/mail" "regexp" - "slices" "strings" "time" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/services/mailer/token" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/mailer/token" "code.forgejo.org/forgejo/reply" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" - "github.com/jhillyerd/enmime/v2" + "github.com/jhillyerd/enmime" ) var ( @@ -299,10 +297,6 @@ func isAutomaticReply(env *enmime.Envelope) bool { if autoReply == "yes" { return true } - precedence := env.GetHeader("Precedence") - if precedence == "auto_reply" { - return true - } autoRespond := env.GetHeader("X-Autorespond") return autoRespond != "" } @@ -376,56 +370,25 @@ type Attachment struct { // getContentFromMailReader grabs the plain content and the attachments from the mail. // A potential reply/signature gets stripped from the content. func getContentFromMailReader(env *enmime.Envelope) *MailContent { - // get attachments attachments := make([]*Attachment, 0, len(env.Attachments)) for _, attachment := range env.Attachments { attachments = append(attachments, &Attachment{ - Name: constructFilename(attachment), + Name: attachment.FileName, Content: attachment.Content, }) } - // get inlines inlineAttachments := make([]*Attachment, 0, len(env.Inlines)) for _, inline := range env.Inlines { if inline.FileName != "" && inline.ContentType != "text/plain" { inlineAttachments = append(inlineAttachments, &Attachment{ - Name: constructFilename(inline), + Name: inline.FileName, Content: inline.Content, }) } } - // get other parts (mostly multipart/related files, these are for example embedded images in an html mail) - otherParts := make([]*Attachment, 0, len(env.Inlines)) - for _, otherPart := range env.OtherParts { - otherParts = append(otherParts, &Attachment{ - Name: constructFilename(otherPart), - Content: otherPart.Content, - }) - } return &MailContent{ Content: reply.FromText(env.Text), - Attachments: slices.Concat(attachments, inlineAttachments, otherParts), + Attachments: append(attachments, inlineAttachments...), } } - -// constructFilename interprets the mime part as an (inline) attachment and returns its filename -// If no filename is given it guesses a sensible filename for it based on the filetype. -func constructFilename(part *enmime.Part) string { - if strings.TrimSpace(part.FileName) != "" { - return part.FileName - } - - filenameWOExtension := "unnamed_file" - if strings.TrimSpace(part.ContentID) != "" { - filenameWOExtension = part.ContentID - } - - fileExtension := ".unknown" - mimeExtensions, err := mime.ExtensionsByType(part.ContentType) - if err == nil && len(mimeExtensions) != 0 { - // just use the first one we find - fileExtension = mimeExtensions[0] - } - return filenameWOExtension + fileExtension -} diff --git a/services/mailer/incoming/incoming_handler.go b/services/mailer/incoming/incoming_handler.go index 7505148978..dc3c4ec69b 100644 --- a/services/mailer/incoming/incoming_handler.go +++ b/services/mailer/incoming/incoming_handler.go @@ -8,19 +8,19 @@ import ( "context" "fmt" - issues_model "forgejo.org/models/issues" - 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" - attachment_service "forgejo.org/services/attachment" - "forgejo.org/services/context/upload" - issue_service "forgejo.org/services/issue" - incoming_payload "forgejo.org/services/mailer/incoming/payload" - "forgejo.org/services/mailer/token" - pull_service "forgejo.org/services/pull" + 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" + 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" + attachment_service "code.gitea.io/gitea/services/attachment" + "code.gitea.io/gitea/services/context/upload" + issue_service "code.gitea.io/gitea/services/issue" + incoming_payload "code.gitea.io/gitea/services/mailer/incoming/payload" + "code.gitea.io/gitea/services/mailer/token" + pull_service "code.gitea.io/gitea/services/pull" ) type MailHandler interface { diff --git a/services/mailer/incoming/incoming_test.go b/services/mailer/incoming/incoming_test.go index 2ffaac57ae..1ff12d0e67 100644 --- a/services/mailer/incoming/incoming_test.go +++ b/services/mailer/incoming/incoming_test.go @@ -4,12 +4,11 @@ package incoming import ( - "encoding/base64" "strings" "testing" "github.com/emersion/go-imap" - "github.com/jhillyerd/enmime/v2" + "github.com/jhillyerd/enmime" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -66,12 +65,6 @@ func TestIsAutomaticReply(t *testing.T) { }, Expected: true, }, - { - Headers: map[string]string{ - "Precedence": "auto_reply", - }, - Expected: true, - }, } for _, c := range cases { @@ -195,191 +188,4 @@ func TestGetContentFromMailReader(t *testing.T) { require.NoError(t, err) assert.Equal(t, "mail content without signature", content.Content) assert.Empty(t, content.Attachments) - - // Some versions of Outlook send inline attachments like this, inside a multipart/related part. - // the attached image is from: https://openmoji.org/library/emoji-1F684 - mailString = "Content-Type: multipart/related; boundary=\"=_related boundary=\"\r\n" + - "\r\n" + - "This text is for clients unable to decode multipart/related with multipart/alternative.\r\n" + - "\r\n" + - "--=_related boundary=\r\n" + - "Content-Type: multipart/alternative; boundary=\"=_alternative boundary=\"\r\n" + - "\r\n" + - "\r\n" + - "\r\n" + - "--=_alternative boundary=\r\n" + - "Content-Type: text/plain\r\n" + - "\r\n" + - "This is the plaintext.\r\n" + - "\r\n" + - "--=_alternative boundary=\r\n" + - "Content-Type: text/html\r\n" + - "\r\n" + - "

      This is a mail with multipart/related. Here is an image sent with a filename.

      \r\n" + - "\r\n" + - "\r\n" + - "--=_alternative boundary=--\r\n" + - "\r\n" + - "--=_related boundary=\r\n" + - "Content-Transfer-Encoding: base64\r\n" + - "Content-Type: image/png;\r\n" + - " name=\"image001.png\"\r\n" + - "Content-ID: <_1_2845>\r\n" + - "\r\n" + - "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAiCAYAAADvVd+PAAAFLUlEQVRo3t2ZX0iTXxjHP3u35qvT\r\n" + - "6ZzhzKFuzPQq9WKQZS6FvLQf3Wh30ViBQXnViC5+LVKEiC6DjMQgCCy6NChoIKwghhcR1bJ5s5Ei\r\n" + - "LmtNs/05XYT7Vercaps/94Xn4uU95znvOc/3+XdehRBCsM1YXl7G6/Xi8Xh49uwZMzMzhEIhFhcX\r\n" + - "+fbtW87WbW1tRbVdmxZC8PTpU8bGxrh//z5fv37dcJxGo2HXrl1ZWVOhUPzybDAYUOSbAYlEgjt3\r\n" + - "7nD58mVmZ2cBkCSJ1tZWDhw4wP79+2lpaUGv16PX61Gr1Tm3RN7w/Plz0d7eLgABCKPRKJxOp3j/\r\n" + - "/r3YLuTlAD5+/ChOnDiR3HhdXZ24e/euiMfjYruRcxe4evUqV65c4fPnz6hUKrq7uzl06NA6v157\r\n" + - "19bWlrbueDzOq1evmJ6eJhQKZRww9+3blzsXWFpaEqdOnUpaPV2ZmJjYUveLFy+Ew+EQFRUVGev/\r\n" + - "WTQaTW4Y8OjRIxwOB4FAAEmS0Gq1lJWVpZwTjUaZm5vDZrPhdrs3HOP3+3E6nTx48IC1zy4uLqas\r\n" + - "rAy1Wr0uym8FnU6X3TT46dMnzp8/z82bNwHQarU0NTVRUlKScl44HMbn8wFQU1Oz7n0sFuP69etc\r\n" + - "unSJ5eVllEole/bswWAwbKk7FSRJyl4a/NnqSqWS+vp6jEZjSqskEglmZ2cJBoMIIbBYLExNTWEw\r\n" + - "GJJjvF4vDoeD6elpAKqrqzGbzVlJj5Ik/T0D/tTqS0tL+Hw+VlZWUKlUDAwMMDQ0RGlpKQArKyu4\r\n" + - "XC6uXbtGLBZDlmUaGxuprKzMajGmyrfVY7EYfr+fDx8+ANDS0sLo6ChWqzU5xu12c/r0aXw+HwqF\r\n" + - "gtraWkwmE0qlMutZSpVPq8/NzeH3+4lGo5SUlOByuRgcHESl+u8zLly4wMjICAClpaU0NTUlWZEL\r\n" + - "ZBwDfo/wDQ0NKa0ej8dZWFggEAgQiUQA6Onp4caNG5jN5l/GTk1N0dnZmTab8sqA+fl5jh07hsfj\r\n" + - "AUCWZXbv3g1AIBBYR/NoNEokEuHLly8kEgkATCYTQ0NDHD9+fFOGrKW2jfRmGxqNJr1CaHJyUuj1\r\n" + - "+j8qNiRJEp2dneL27dtidXU15TrhcFhYLJa/Km4ykeLi4tSF0O++Xl9fz5EjR9Dr9SlPtry8nKqq\r\n" + - "KsxmM1arFa1Wm7ZVQqEQDx8+5N27dznvTG022+YMmJycFEajUQBClmUxMjIiYrGYKDSwVQ3f3t4u\r\n" + - "3rx5k1LJy5cvhd1uF83NzaKoqChvFP5b6e3t/fUAMrX64uKiOHnypFAoFDtm0z9Ll14nVACRSIQz\r\n" + - "Z84wPj4OwMGDBxkbG6OxsXFT/7l37x6Dg4PMz89TJEn0VVXwT2U5dUVq1DlOXdmCsrwcVTQapaen\r\n" + - "B4/HgyzLDA8Pc+7cOSRJ2nTixYsXGR4eBsBaWsK/xmrqitTsSIyOjgpAmEwm8fbt27QCx969e3ck\r\n" + - "5TdyAfr6+gQgxsfH046ct27dEjqdbscfQG9vr1CtNRiZVMR2ux273U4hQOru7gbA5XLh9Xr5H/wn\r\n" + - "yS9WV1dFR0dHQfh0ptLR0fGjDgiHw8LpdIqGhoYdm9P/RCwWS3qXok+ePOHs2bO8fv06eZ3c39+X\r\n" + - "7AZ3MlK2wzMzMwwMDPD48WMAamtr6e/vo7m5uWBCwKYMWFhYoK2tjWAwiEaj4ejRXmw2W8oCqaAO\r\n" + - "wO1209XVhSzLHD5s+3F5UGAwGo2bt8OhUEjU1NQUdBDc8s9QMBhkYmIieVVVaLDZbHwHmmIQk3rD\r\n" + - "exgAAAAASUVORK5CYII=\r\n" + - "\r\n" + - "--=_related boundary=--\r\n" + - "\r\n" - - env, err = enmime.ReadEnvelope(strings.NewReader(mailString)) - require.NoError(t, err) - content = getContentFromMailReader(env) - assert.Equal(t, "This is the plaintext.", content.Content) - assert.Len(t, content.Attachments, 1) - assert.Equal(t, "image001.png", content.Attachments[0].Name) - expectedAttachment, err := base64.StdEncoding.DecodeString( - "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAiCAYAAADvVd+PAAAFLUlEQVRo3t2ZX0iTXxjHP3u35qvT\r\n" + - "6ZzhzKFuzPQq9WKQZS6FvLQf3Wh30ViBQXnViC5+LVKEiC6DjMQgCCy6NChoIKwghhcR1bJ5s5Ei\r\n" + - "LmtNs/05XYT7Vercaps/94Xn4uU95znvOc/3+XdehRBCsM1YXl7G6/Xi8Xh49uwZMzMzhEIhFhcX\r\n" + - "+fbtW87WbW1tRbVdmxZC8PTpU8bGxrh//z5fv37dcJxGo2HXrl1ZWVOhUPzybDAYUOSbAYlEgjt3\r\n" + - "7nD58mVmZ2cBkCSJ1tZWDhw4wP79+2lpaUGv16PX61Gr1Tm3RN7w/Plz0d7eLgABCKPRKJxOp3j/\r\n" + - "/r3YLuTlAD5+/ChOnDiR3HhdXZ24e/euiMfjYruRcxe4evUqV65c4fPnz6hUKrq7uzl06NA6v157\r\n" + - "19bWlrbueDzOq1evmJ6eJhQKZRww9+3blzsXWFpaEqdOnUpaPV2ZmJjYUveLFy+Ew+EQFRUVGev/\r\n" + - "WTQaTW4Y8OjRIxwOB4FAAEmS0Gq1lJWVpZwTjUaZm5vDZrPhdrs3HOP3+3E6nTx48IC1zy4uLqas\r\n" + - "rAy1Wr0uym8FnU6X3TT46dMnzp8/z82bNwHQarU0NTVRUlKScl44HMbn8wFQU1Oz7n0sFuP69etc\r\n" + - "unSJ5eVllEole/bswWAwbKk7FSRJyl4a/NnqSqWS+vp6jEZjSqskEglmZ2cJBoMIIbBYLExNTWEw\r\n" + - "GJJjvF4vDoeD6elpAKqrqzGbzVlJj5Ik/T0D/tTqS0tL+Hw+VlZWUKlUDAwMMDQ0RGlpKQArKyu4\r\n" + - "XC6uXbtGLBZDlmUaGxuprKzMajGmyrfVY7EYfr+fDx8+ANDS0sLo6ChWqzU5xu12c/r0aXw+HwqF\r\n" + - "gtraWkwmE0qlMutZSpVPq8/NzeH3+4lGo5SUlOByuRgcHESl+u8zLly4wMjICAClpaU0NTUlWZEL\r\n" + - "ZBwDfo/wDQ0NKa0ej8dZWFggEAgQiUQA6Onp4caNG5jN5l/GTk1N0dnZmTab8sqA+fl5jh07hsfj\r\n" + - "AUCWZXbv3g1AIBBYR/NoNEokEuHLly8kEgkATCYTQ0NDHD9+fFOGrKW2jfRmGxqNJr1CaHJyUuj1\r\n" + - "+j8qNiRJEp2dneL27dtidXU15TrhcFhYLJa/Km4ykeLi4tSF0O++Xl9fz5EjR9Dr9SlPtry8nKqq\r\n" + - "KsxmM1arFa1Wm7ZVQqEQDx8+5N27dznvTG022+YMmJycFEajUQBClmUxMjIiYrGYKDSwVQ3f3t4u\r\n" + - "3rx5k1LJy5cvhd1uF83NzaKoqChvFP5b6e3t/fUAMrX64uKiOHnypFAoFDtm0z9Ll14nVACRSIQz\r\n" + - "Z84wPj4OwMGDBxkbG6OxsXFT/7l37x6Dg4PMz89TJEn0VVXwT2U5dUVq1DlOXdmCsrwcVTQapaen\r\n" + - "B4/HgyzLDA8Pc+7cOSRJ2nTixYsXGR4eBsBaWsK/xmrqitTsSIyOjgpAmEwm8fbt27QCx969e3ck\r\n" + - "5TdyAfr6+gQgxsfH046ct27dEjqdbscfQG9vr1CtNRiZVMR2ux273U4hQOru7gbA5XLh9Xr5H/wn\r\n" + - "yS9WV1dFR0dHQfh0ptLR0fGjDgiHw8LpdIqGhoYdm9P/RCwWS3qXok+ePOHs2bO8fv06eZ3c39+X\r\n" + - "7AZ3MlK2wzMzMwwMDPD48WMAamtr6e/vo7m5uWBCwKYMWFhYoK2tjWAwiEaj4ejRXmw2W8oCqaAO\r\n" + - "wO1209XVhSzLHD5s+3F5UGAwGo2bt8OhUEjU1NQUdBDc8s9QMBhkYmIieVVVaLDZbHwHmmIQk3rD\r\n" + - "exgAAAAASUVORK5CYII=\r\n") - require.NoError(t, err) - assert.Equal(t, expectedAttachment, content.Attachments[0].Content) - - // HCL Notes inlines attachments like this: without a filename. - // the attached image is from: https://openmoji.org/library/emoji-1F684 - mailString = "Content-Type: multipart/related; boundary=\"=_related boundary=\"\r\n" + - "\r\n" + - "This text is for clients unable to decode multipart/related with multipart/alternative.\r\n" + - "\r\n" + - "--=_related boundary=\r\n" + - "Content-Type: multipart/alternative; boundary=\"=_alternative boundary=\"\r\n" + - "\r\n" + - "\r\n" + - "\r\n" + - "--=_alternative boundary=\r\n" + - "Content-Type: text/plain\r\n" + - "\r\n" + - "This is the plaintext.\r\n" + - "\r\n" + - "--=_alternative boundary=\r\n" + - "Content-Type: text/html\r\n" + - "\r\n" + - "

      This is a mail with multipart/related. Here is an image sent without a filename.

      \r\n" + - "\r\n" + - "\r\n" + - "--=_alternative boundary=--\r\n" + - "\r\n" + - "--=_related boundary=\r\n" + - "Content-Transfer-Encoding: base64\r\n" + - "Content-Type: image/png\r\n" + - "Content-ID: <_1_2845>\r\n" + - "\r\n" + - "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAiCAYAAADvVd+PAAAFLUlEQVRo3t2ZX0iTXxjHP3u35qvT\r\n" + - "6ZzhzKFuzPQq9WKQZS6FvLQf3Wh30ViBQXnViC5+LVKEiC6DjMQgCCy6NChoIKwghhcR1bJ5s5Ei\r\n" + - "LmtNs/05XYT7Vercaps/94Xn4uU95znvOc/3+XdehRBCsM1YXl7G6/Xi8Xh49uwZMzMzhEIhFhcX\r\n" + - "+fbtW87WbW1tRbVdmxZC8PTpU8bGxrh//z5fv37dcJxGo2HXrl1ZWVOhUPzybDAYUOSbAYlEgjt3\r\n" + - "7nD58mVmZ2cBkCSJ1tZWDhw4wP79+2lpaUGv16PX61Gr1Tm3RN7w/Plz0d7eLgABCKPRKJxOp3j/\r\n" + - "/r3YLuTlAD5+/ChOnDiR3HhdXZ24e/euiMfjYruRcxe4evUqV65c4fPnz6hUKrq7uzl06NA6v157\r\n" + - "19bWlrbueDzOq1evmJ6eJhQKZRww9+3blzsXWFpaEqdOnUpaPV2ZmJjYUveLFy+Ew+EQFRUVGev/\r\n" + - "WTQaTW4Y8OjRIxwOB4FAAEmS0Gq1lJWVpZwTjUaZm5vDZrPhdrs3HOP3+3E6nTx48IC1zy4uLqas\r\n" + - "rAy1Wr0uym8FnU6X3TT46dMnzp8/z82bNwHQarU0NTVRUlKScl44HMbn8wFQU1Oz7n0sFuP69etc\r\n" + - "unSJ5eVllEole/bswWAwbKk7FSRJyl4a/NnqSqWS+vp6jEZjSqskEglmZ2cJBoMIIbBYLExNTWEw\r\n" + - "GJJjvF4vDoeD6elpAKqrqzGbzVlJj5Ik/T0D/tTqS0tL+Hw+VlZWUKlUDAwMMDQ0RGlpKQArKyu4\r\n" + - "XC6uXbtGLBZDlmUaGxuprKzMajGmyrfVY7EYfr+fDx8+ANDS0sLo6ChWqzU5xu12c/r0aXw+HwqF\r\n" + - "gtraWkwmE0qlMutZSpVPq8/NzeH3+4lGo5SUlOByuRgcHESl+u8zLly4wMjICAClpaU0NTUlWZEL\r\n" + - "ZBwDfo/wDQ0NKa0ej8dZWFggEAgQiUQA6Onp4caNG5jN5l/GTk1N0dnZmTab8sqA+fl5jh07hsfj\r\n" + - "AUCWZXbv3g1AIBBYR/NoNEokEuHLly8kEgkATCYTQ0NDHD9+fFOGrKW2jfRmGxqNJr1CaHJyUuj1\r\n" + - "+j8qNiRJEp2dneL27dtidXU15TrhcFhYLJa/Km4ykeLi4tSF0O++Xl9fz5EjR9Dr9SlPtry8nKqq\r\n" + - "KsxmM1arFa1Wm7ZVQqEQDx8+5N27dznvTG022+YMmJycFEajUQBClmUxMjIiYrGYKDSwVQ3f3t4u\r\n" + - "3rx5k1LJy5cvhd1uF83NzaKoqChvFP5b6e3t/fUAMrX64uKiOHnypFAoFDtm0z9Ll14nVACRSIQz\r\n" + - "Z84wPj4OwMGDBxkbG6OxsXFT/7l37x6Dg4PMz89TJEn0VVXwT2U5dUVq1DlOXdmCsrwcVTQapaen\r\n" + - "B4/HgyzLDA8Pc+7cOSRJ2nTixYsXGR4eBsBaWsK/xmrqitTsSIyOjgpAmEwm8fbt27QCx969e3ck\r\n" + - "5TdyAfr6+gQgxsfH046ct27dEjqdbscfQG9vr1CtNRiZVMR2ux273U4hQOru7gbA5XLh9Xr5H/wn\r\n" + - "yS9WV1dFR0dHQfh0ptLR0fGjDgiHw8LpdIqGhoYdm9P/RCwWS3qXok+ePOHs2bO8fv06eZ3c39+X\r\n" + - "7AZ3MlK2wzMzMwwMDPD48WMAamtr6e/vo7m5uWBCwKYMWFhYoK2tjWAwiEaj4ejRXmw2W8oCqaAO\r\n" + - "wO1209XVhSzLHD5s+3F5UGAwGo2bt8OhUEjU1NQUdBDc8s9QMBhkYmIieVVVaLDZbHwHmmIQk3rD\r\n" + - "exgAAAAASUVORK5CYII=\r\n" + - "\r\n" + - "--=_related boundary=--\r\n" + - "\r\n" - - env, err = enmime.ReadEnvelope(strings.NewReader(mailString)) - require.NoError(t, err) - content = getContentFromMailReader(env) - assert.Equal(t, "This is the plaintext.", content.Content) - assert.Len(t, content.Attachments, 1) - assert.Equal(t, "_1_2845.png", content.Attachments[0].Name) - expectedAttachment, err = base64.StdEncoding.DecodeString( - "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAiCAYAAADvVd+PAAAFLUlEQVRo3t2ZX0iTXxjHP3u35qvT\r\n" + - "6ZzhzKFuzPQq9WKQZS6FvLQf3Wh30ViBQXnViC5+LVKEiC6DjMQgCCy6NChoIKwghhcR1bJ5s5Ei\r\n" + - "LmtNs/05XYT7Vercaps/94Xn4uU95znvOc/3+XdehRBCsM1YXl7G6/Xi8Xh49uwZMzMzhEIhFhcX\r\n" + - "+fbtW87WbW1tRbVdmxZC8PTpU8bGxrh//z5fv37dcJxGo2HXrl1ZWVOhUPzybDAYUOSbAYlEgjt3\r\n" + - "7nD58mVmZ2cBkCSJ1tZWDhw4wP79+2lpaUGv16PX61Gr1Tm3RN7w/Plz0d7eLgABCKPRKJxOp3j/\r\n" + - "/r3YLuTlAD5+/ChOnDiR3HhdXZ24e/euiMfjYruRcxe4evUqV65c4fPnz6hUKrq7uzl06NA6v157\r\n" + - "19bWlrbueDzOq1evmJ6eJhQKZRww9+3blzsXWFpaEqdOnUpaPV2ZmJjYUveLFy+Ew+EQFRUVGev/\r\n" + - "WTQaTW4Y8OjRIxwOB4FAAEmS0Gq1lJWVpZwTjUaZm5vDZrPhdrs3HOP3+3E6nTx48IC1zy4uLqas\r\n" + - "rAy1Wr0uym8FnU6X3TT46dMnzp8/z82bNwHQarU0NTVRUlKScl44HMbn8wFQU1Oz7n0sFuP69etc\r\n" + - "unSJ5eVllEole/bswWAwbKk7FSRJyl4a/NnqSqWS+vp6jEZjSqskEglmZ2cJBoMIIbBYLExNTWEw\r\n" + - "GJJjvF4vDoeD6elpAKqrqzGbzVlJj5Ik/T0D/tTqS0tL+Hw+VlZWUKlUDAwMMDQ0RGlpKQArKyu4\r\n" + - "XC6uXbtGLBZDlmUaGxuprKzMajGmyrfVY7EYfr+fDx8+ANDS0sLo6ChWqzU5xu12c/r0aXw+HwqF\r\n" + - "gtraWkwmE0qlMutZSpVPq8/NzeH3+4lGo5SUlOByuRgcHESl+u8zLly4wMjICAClpaU0NTUlWZEL\r\n" + - "ZBwDfo/wDQ0NKa0ej8dZWFggEAgQiUQA6Onp4caNG5jN5l/GTk1N0dnZmTab8sqA+fl5jh07hsfj\r\n" + - "AUCWZXbv3g1AIBBYR/NoNEokEuHLly8kEgkATCYTQ0NDHD9+fFOGrKW2jfRmGxqNJr1CaHJyUuj1\r\n" + - "+j8qNiRJEp2dneL27dtidXU15TrhcFhYLJa/Km4ykeLi4tSF0O++Xl9fz5EjR9Dr9SlPtry8nKqq\r\n" + - "KsxmM1arFa1Wm7ZVQqEQDx8+5N27dznvTG022+YMmJycFEajUQBClmUxMjIiYrGYKDSwVQ3f3t4u\r\n" + - "3rx5k1LJy5cvhd1uF83NzaKoqChvFP5b6e3t/fUAMrX64uKiOHnypFAoFDtm0z9Ll14nVACRSIQz\r\n" + - "Z84wPj4OwMGDBxkbG6OxsXFT/7l37x6Dg4PMz89TJEn0VVXwT2U5dUVq1DlOXdmCsrwcVTQapaen\r\n" + - "B4/HgyzLDA8Pc+7cOSRJ2nTixYsXGR4eBsBaWsK/xmrqitTsSIyOjgpAmEwm8fbt27QCx969e3ck\r\n" + - "5TdyAfr6+gQgxsfH046ct27dEjqdbscfQG9vr1CtNRiZVMR2ux273U4hQOru7gbA5XLh9Xr5H/wn\r\n" + - "yS9WV1dFR0dHQfh0ptLR0fGjDgiHw8LpdIqGhoYdm9P/RCwWS3qXok+ePOHs2bO8fv06eZ3c39+X\r\n" + - "7AZ3MlK2wzMzMwwMDPD48WMAamtr6e/vo7m5uWBCwKYMWFhYoK2tjWAwiEaj4ejRXmw2W8oCqaAO\r\n" + - "wO1209XVhSzLHD5s+3F5UGAwGo2bt8OhUEjU1NQUdBDc8s9QMBhkYmIieVVVaLDZbHwHmmIQk3rD\r\n" + - "exgAAAAASUVORK5CYII=\r\n") - require.NoError(t, err) - assert.Equal(t, expectedAttachment, content.Attachments[0].Content) } diff --git a/services/mailer/incoming/payload/payload.go b/services/mailer/incoming/payload/payload.go index bb7a65e3d5..00ada7826b 100644 --- a/services/mailer/incoming/payload/payload.go +++ b/services/mailer/incoming/payload/payload.go @@ -6,8 +6,8 @@ package payload import ( "context" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/util" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/util" ) const replyPayloadVersion1 byte = 1 diff --git a/services/mailer/mail.go b/services/mailer/mail.go index 4269686f2d..bfede28bbe 100644 --- a/services/mailer/mail.go +++ b/services/mailer/mail.go @@ -16,21 +16,21 @@ import ( texttmpl "text/template" "time" - activities_model "forgejo.org/models/activities" - auth_model "forgejo.org/models/auth" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/emoji" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/translation" - incoming_payload "forgejo.org/services/mailer/incoming/payload" - "forgejo.org/services/mailer/token" + activities_model "code.gitea.io/gitea/models/activities" + auth_model "code.gitea.io/gitea/models/auth" + 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/base" + "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/timeutil" + "code.gitea.io/gitea/modules/translation" + incoming_payload "code.gitea.io/gitea/services/mailer/incoming/payload" + "code.gitea.io/gitea/services/mailer/token" "gopkg.in/gomail.v2" ) @@ -689,7 +689,7 @@ func SendRemovedSecurityKey(ctx context.Context, u *user_model.User, securityKey if err != nil { return err } - hasTOTP, err := auth_model.HasTOTPByUID(ctx, u.ID) + hasTOTP, err := auth_model.HasTwoFactorByUID(ctx, u.ID) if err != nil { return err } diff --git a/services/mailer/mail_admin_new_user.go b/services/mailer/mail_admin_new_user.go index ffb03197b7..0713de8a95 100644 --- a/services/mailer/mail_admin_new_user.go +++ b/services/mailer/mail_admin_new_user.go @@ -7,12 +7,12 @@ import ( "context" "strconv" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/translation" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/translation" ) const ( diff --git a/services/mailer/mail_admin_new_user_test.go b/services/mailer/mail_admin_new_user_test.go index 9273691792..f7f27832f9 100644 --- a/services/mailer/mail_admin_new_user_test.go +++ b/services/mailer/mail_admin_new_user_test.go @@ -8,10 +8,10 @@ import ( "strconv" "testing" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + "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/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -45,7 +45,7 @@ func cleanUpUsers(ctx context.Context, users []*user_model.User) { } func TestAdminNotificationMail_test(t *testing.T) { - ctx := t.Context() + ctx := context.Background() users := getTestUsers(t) diff --git a/services/mailer/mail_auth_test.go b/services/mailer/mail_auth_test.go index e40a0d6fa0..38e3721a22 100644 --- a/services/mailer/mail_auth_test.go +++ b/services/mailer/mail_auth_test.go @@ -6,14 +6,14 @@ package mailer_test import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" - "forgejo.org/services/mailer" - user_service "forgejo.org/services/user" + "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" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/services/mailer" + user_service "code.gitea.io/gitea/services/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/mailer/mail_comment.go b/services/mailer/mail_comment.go index b4ed3145ed..1812441d5a 100644 --- a/services/mailer/mail_comment.go +++ b/services/mailer/mail_comment.go @@ -6,12 +6,12 @@ package mailer import ( "context" - activities_model "forgejo.org/models/activities" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + activities_model "code.gitea.io/gitea/models/activities" + issues_model "code.gitea.io/gitea/models/issues" + 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" ) // MailParticipantsComment sends new comment emails to repository watchers and mentioned people. diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go index b0329caa0b..fab3315be2 100644 --- a/services/mailer/mail_issue.go +++ b/services/mailer/mail_issue.go @@ -7,22 +7,19 @@ import ( "context" "fmt" - activities_model "forgejo.org/models/activities" - 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" - "forgejo.org/modules/setting" + activities_model "code.gitea.io/gitea/models/activities" + 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" + "code.gitea.io/gitea/modules/setting" ) func fallbackMailSubject(issue *issues_model.Issue) string { - if issue.IsPull { - return fmt.Sprintf("[%s] %s (PR #%d)", issue.Repo.FullName(), issue.Title, issue.Index) - } - return fmt.Sprintf("[%s] %s (Issue #%d)", issue.Repo.FullName(), issue.Title, issue.Index) + return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.FullName(), issue.Title, issue.Index) } type mailCommentContext struct { diff --git a/services/mailer/mail_release.go b/services/mailer/mail_release.go index 0f2ef33fe1..0b8b97e9cd 100644 --- a/services/mailer/mail_release.go +++ b/services/mailer/mail_release.go @@ -7,14 +7,14 @@ import ( "bytes" "context" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "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" ) const ( diff --git a/services/mailer/mail_repo.go b/services/mailer/mail_repo.go index eed650f3ac..7003584786 100644 --- a/services/mailer/mail_repo.go +++ b/services/mailer/mail_repo.go @@ -8,11 +8,11 @@ import ( "context" "fmt" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + "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/translation" ) // SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created diff --git a/services/mailer/mail_team_invite.go b/services/mailer/mail_team_invite.go index a2a871d3c3..ceecefa50f 100644 --- a/services/mailer/mail_team_invite.go +++ b/services/mailer/mail_team_invite.go @@ -9,12 +9,12 @@ import ( "fmt" "net/url" - org_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/translation" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" ) const ( diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go index 616eea2d85..1a9bbc9f16 100644 --- a/services/mailer/mail_test.go +++ b/services/mailer/mail_test.go @@ -15,15 +15,15 @@ import ( "testing" texttmpl "text/template" - activities_model "forgejo.org/models/activities" - "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/markup" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + activities_model "code.gitea.io/gitea/models/activities" + "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/markup" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -79,7 +79,7 @@ func TestComposeIssueCommentMessage(t *testing.T) { recipients := []*user_model.User{{Name: "Test", Email: "test@gitea.com"}, {Name: "Test2", Email: "test2@gitea.com"}} msgs, err := composeIssueCommentMessages(&mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: activities_model.ActionCommentIssue, Content: fmt.Sprintf("test @%s %s#%d body", doer.Name, issue.Repo.FullName(), issue.Index), Comment: comment, @@ -123,7 +123,7 @@ func TestComposeIssueMessage(t *testing.T) { recipients := []*user_model.User{{Name: "Test", Email: "test@gitea.com"}, {Name: "Test2", Email: "test2@gitea.com"}} msgs, err := composeIssueCommentMessages(&mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: activities_model.ActionCreateIssue, Content: "test body", }, "en-US", recipients, false, "issue create") @@ -138,7 +138,7 @@ func TestComposeIssueMessage(t *testing.T) { references := gomailMsg.GetHeader("References") assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field") - assert.Equal(t, "[user2/repo1] issue1 (Issue #1)", subject[0]) + assert.Equal(t, "[user2/repo1] issue1 (#1)", subject[0]) assert.Equal(t, "", inReplyTo[0], "In-Reply-To header doesn't match") assert.Equal(t, "", references[0], "References header doesn't match") assert.Equal(t, "", messageID[0], "Message-ID header doesn't match") @@ -168,7 +168,7 @@ func TestMailerIssueTemplate(t *testing.T) { t.Helper() recipients := []*user_model.User{{Name: "Test", Email: "test@gitea.com"}} - ctx.Context = t.Context() + ctx.Context = context.Background() fromMention := false msgs, err := composeIssueCommentMessages(ctx, "en-US", recipients, fromMention, "TestMailerIssueTemplate") require.NoError(t, err) @@ -266,14 +266,14 @@ func TestTemplateSelection(t *testing.T) { } msg := testComposeIssueCommentMessage(t, &mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: activities_model.ActionCreateIssue, Content: "test body", }, recipients, false, "TestTemplateSelection") expect(t, msg, "issue/new/subject", "issue/new/body") msg = testComposeIssueCommentMessage(t, &mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: activities_model.ActionCommentIssue, Content: "test body", Comment: comment, }, recipients, false, "TestTemplateSelection") @@ -282,18 +282,18 @@ func TestTemplateSelection(t *testing.T) { pull := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 2, Repo: repo, Poster: doer}) comment = unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 4, Issue: pull}) msg = testComposeIssueCommentMessage(t, &mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: pull, Doer: doer, ActionType: activities_model.ActionCommentPull, Content: "test body", Comment: comment, }, recipients, false, "TestTemplateSelection") expect(t, msg, "pull/comment/subject", "pull/comment/body") msg = testComposeIssueCommentMessage(t, &mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: activities_model.ActionCloseIssue, Content: "test body", Comment: comment, }, recipients, false, "TestTemplateSelection") - expect(t, msg, "Re: [user2/repo1] issue1 (Issue #1)", "issue/close/body") + expect(t, msg, "Re: [user2/repo1] issue1 (#1)", "issue/close/body") } func TestTemplateServices(t *testing.T) { @@ -309,7 +309,7 @@ func TestTemplateServices(t *testing.T) { recipients := []*user_model.User{{Name: "Test", Email: "test@gitea.com"}} msg := testComposeIssueCommentMessage(t, &mailCommentContext{ - Context: t.Context(), // TODO: use a correct context + Context: context.TODO(), // TODO: use a correct context Issue: issue, Doer: doer, ActionType: actionType, Content: "test body", Comment: comment, }, recipients, fromMention, "TestTemplateServices") @@ -338,7 +338,7 @@ func TestTemplateServices(t *testing.T) { expect(t, issue, comment, doer, activities_model.ActionCommentIssue, true, "{{.FallbackSubject}}", "//{{.SubjectPrefix}}//", - "Re: [user2/repo1] issue1 (Issue #1)", + "Re: [user2/repo1] issue1 (#1)", "//Re: //") } @@ -353,7 +353,7 @@ func TestGenerateAdditionalHeaders(t *testing.T) { defer MockMailSettings(nil)() doer, _, issue, _ := prepareMailerTest(t) - ctx := &mailCommentContext{Context: t.Context() /* TODO: use a correct context */, Issue: issue, Doer: doer} + ctx := &mailCommentContext{Context: context.TODO() /* TODO: use a correct context */, Issue: issue, Doer: doer} recipient := &user_model.User{Name: "test", Email: "test@gitea.com"} headers := generateAdditionalHeaders(ctx, "dummy-reason", recipient) @@ -538,11 +538,3 @@ func TestFromDisplayName(t *testing.T) { assert.EqualValues(t, "Mister X (by Code IT on [code.it])", fromDisplayName(&user_model.User{FullName: "Mister X", Name: "tmp"})) }) } - -func TestFallbackSubjectType(t *testing.T) { - _, _, issue, _ := prepareMailerTest(t) - assert.Contains(t, fallbackMailSubject(issue), "Issue") - _, _, pr, _ := prepareMailerTest(t) - pr.IsPull = true - assert.Contains(t, fallbackMailSubject(pr), "PR") -} diff --git a/services/mailer/mailer.go b/services/mailer/mailer.go index 4561240df5..0a723f974a 100644 --- a/services/mailer/mailer.go +++ b/services/mailer/mailer.go @@ -18,14 +18,14 @@ import ( "strings" "time" - "forgejo.org/modules/base" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + notify_service "code.gitea.io/gitea/services/notify" ntlmssp "github.com/Azure/go-ntlmssp" "github.com/jaytaylor/html2text" diff --git a/services/mailer/mailer_test.go b/services/mailer/mailer_test.go index aef242d908..045701f3a5 100644 --- a/services/mailer/mailer_test.go +++ b/services/mailer/mailer_test.go @@ -8,9 +8,9 @@ import ( "testing" "time" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/mailer/main_test.go b/services/mailer/main_test.go index 9ef71dbdb3..908976e7ef 100644 --- a/services/mailer/main_test.go +++ b/services/mailer/main_test.go @@ -7,13 +7,13 @@ import ( "context" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/templates" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" - _ "forgejo.org/models/actions" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" ) diff --git a/services/mailer/notify.go b/services/mailer/notify.go index e61ecd0511..54ab80aab9 100644 --- a/services/mailer/notify.go +++ b/services/mailer/notify.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - activities_model "forgejo.org/models/activities" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - notify_service "forgejo.org/services/notify" + activities_model "code.gitea.io/gitea/models/activities" + 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/log" + notify_service "code.gitea.io/gitea/services/notify" ) type mailNotifier struct { diff --git a/services/mailer/token/token.go b/services/mailer/token/token.go index f3d7286cb0..1a52bce803 100644 --- a/services/mailer/token/token.go +++ b/services/mailer/token/token.go @@ -11,8 +11,8 @@ import ( "fmt" "time" - user_model "forgejo.org/models/user" - "forgejo.org/modules/util" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/util" ) // A token is a verifiable container describing an action. diff --git a/services/markup/main_test.go b/services/markup/main_test.go index 1b085b4929..89fe3e7e34 100644 --- a/services/markup/main_test.go +++ b/services/markup/main_test.go @@ -6,7 +6,7 @@ package markup import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/services/markup/processorhelper.go b/services/markup/processorhelper.go index b5fcd78cb7..40bf1d65da 100644 --- a/services/markup/processorhelper.go +++ b/services/markup/processorhelper.go @@ -7,16 +7,16 @@ import ( "context" "fmt" - "forgejo.org/models/perm/access" - "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - gitea_context "forgejo.org/services/context" - file_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models/perm/access" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + gitea_context "code.gitea.io/gitea/services/context" + file_service "code.gitea.io/gitea/services/repository/files" ) func ProcessorHelper() *markup.ProcessorHelper { diff --git a/services/markup/processorhelper_test.go b/services/markup/processorhelper_test.go index 8195451746..fafde746d2 100644 --- a/services/markup/processorhelper_test.go +++ b/services/markup/processorhelper_test.go @@ -4,15 +4,16 @@ package markup import ( + "context" "net/http" "net/http/httptest" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/models/user" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -32,10 +33,10 @@ func TestProcessorHelper(t *testing.T) { unittest.AssertCount(t, &user.User{Name: userNoSuch}, 0) // when using general context, use user's visibility to check - assert.True(t, ProcessorHelper().IsUsernameMentionable(t.Context(), userPublic)) - assert.False(t, ProcessorHelper().IsUsernameMentionable(t.Context(), userLimited)) - assert.False(t, ProcessorHelper().IsUsernameMentionable(t.Context(), userPrivate)) - assert.False(t, ProcessorHelper().IsUsernameMentionable(t.Context(), userNoSuch)) + assert.True(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPublic)) + assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userLimited)) + assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userPrivate)) + assert.False(t, ProcessorHelper().IsUsernameMentionable(context.Background(), userNoSuch)) // when using web context, use user.IsUserVisibleToViewer to check req, err := http.NewRequest("GET", "/", nil) diff --git a/services/migrations/codebase.go b/services/migrations/codebase.go index 843df0f973..492fc908e9 100644 --- a/services/migrations/codebase.go +++ b/services/migrations/codebase.go @@ -13,10 +13,10 @@ import ( "strings" "time" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/proxy" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/structs" ) var ( diff --git a/services/migrations/codebase_test.go b/services/migrations/codebase_test.go index 315c7be709..23626d16d7 100644 --- a/services/migrations/codebase_test.go +++ b/services/migrations/codebase_test.go @@ -4,12 +4,13 @@ package migrations import ( + "context" "net/url" "os" "testing" "time" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -32,7 +33,7 @@ func TestCodebaseDownloadRepo(t *testing.T) { } factory := &CodebaseDownloaderFactory{} - downloader, err := factory.New(t.Context(), base.MigrateOptions{ + downloader, err := factory.New(context.Background(), base.MigrateOptions{ CloneAddr: u.String(), AuthUsername: apiUser, AuthPassword: apiPassword, diff --git a/services/migrations/common.go b/services/migrations/common.go index ee74461447..d88518899d 100644 --- a/services/migrations/common.go +++ b/services/migrations/common.go @@ -7,10 +7,10 @@ import ( "fmt" "strings" - system_model "forgejo.org/models/system" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" + system_model "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" ) // WarnAndNotice will log the provided message and send a repository notice diff --git a/services/migrations/dump.go b/services/migrations/dump.go index cbf6b87668..07812002af 100644 --- a/services/migrations/dump.go +++ b/services/migrations/dump.go @@ -16,13 +16,13 @@ import ( "strings" "time" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" "github.com/google/uuid" "gopkg.in/yaml.v3" @@ -128,7 +128,6 @@ func (g *RepositoryDumper) CreateRepo(repo *base.Repository, opts base.MigrateOp "comments": opts.Comments, "pulls": opts.PullRequests, "assets": opts.ReleaseAssets, - "website": repo.Website, }) if err != nil { return err diff --git a/services/migrations/forgejo_downloader.go b/services/migrations/forgejo_downloader.go index 5f809b82be..25dbb6ec51 100644 --- a/services/migrations/forgejo_downloader.go +++ b/services/migrations/forgejo_downloader.go @@ -4,7 +4,7 @@ package migrations import ( - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/structs" ) func init() { diff --git a/services/migrations/forgejo_downloader_test.go b/services/migrations/forgejo_downloader_test.go index db1930ebba..5bd37551cc 100644 --- a/services/migrations/forgejo_downloader_test.go +++ b/services/migrations/forgejo_downloader_test.go @@ -6,7 +6,7 @@ package migrations import ( "testing" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/require" ) diff --git a/services/migrations/git.go b/services/migrations/git.go index 46710b0abe..22ffd5e765 100644 --- a/services/migrations/git.go +++ b/services/migrations/git.go @@ -6,7 +6,7 @@ package migrations import ( "context" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" ) var _ base.Downloader = &PlainGitDownloader{} diff --git a/services/migrations/gitbucket.go b/services/migrations/gitbucket.go index b68fc01083..4fe9e30a39 100644 --- a/services/migrations/gitbucket.go +++ b/services/migrations/gitbucket.go @@ -9,9 +9,9 @@ import ( "net/url" "strings" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/structs" ) var ( diff --git a/services/migrations/gitea_downloader.go b/services/migrations/gitea_downloader.go index 133cc5c928..272bf02e11 100644 --- a/services/migrations/gitea_downloader.go +++ b/services/migrations/gitea_downloader.go @@ -13,9 +13,9 @@ import ( "strings" "time" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/structs" gitea_sdk "code.gitea.io/sdk/gitea" ) @@ -160,7 +160,6 @@ func (g *GiteaDownloader) GetRepoInfo() (*base.Repository, error) { CloneURL: repo.CloneURL, OriginalURL: repo.HTMLURL, DefaultBranch: repo.DefaultBranch, - Website: repo.Website, }, nil } @@ -504,28 +503,6 @@ func (g *GiteaDownloader) GetComments(commentable base.Commentable) ([]*base.Com return allComments, true, nil } -type ForgejoPullRequest struct { - gitea_sdk.PullRequest - Flow int64 `json:"flow"` -} - -// Extracted from https://gitea.com/gitea/go-sdk/src/commit/164e3358bc02213954fb4380b821bed80a14824d/gitea/pull.go#L347-L364 -func (g *GiteaDownloader) fixPullHeadSha(pr *ForgejoPullRequest) error { - if pr.Base != nil && pr.Base.Repository != nil && pr.Base.Repository.Owner != nil && pr.Head != nil && pr.Head.Ref != "" && pr.Head.Sha == "" { - owner := pr.Base.Repository.Owner.UserName - repo := pr.Base.Repository.Name - refs, _, err := g.client.GetRepoRefs(owner, repo, pr.Head.Ref) - if err != nil { - return err - } - if len(refs) == 0 { - return fmt.Errorf("unable to resolve PR ref %q", pr.Head.Ref) - } - pr.Head.Sha = refs[0].Object.SHA - } - return nil -} - // GetPullRequests returns pull requests according page and perPage func (g *GiteaDownloader) GetPullRequests(page, perPage int) ([]*base.PullRequest, bool, error) { if perPage > g.maxPerPage { @@ -533,30 +510,16 @@ func (g *GiteaDownloader) GetPullRequests(page, perPage int) ([]*base.PullReques } allPRs := make([]*base.PullRequest, 0, perPage) - prs := make([]*ForgejoPullRequest, 0, perPage) - opt := gitea_sdk.ListPullRequestsOptions{ + prs, _, err := g.client.ListRepoPullRequests(g.repoOwner, g.repoName, gitea_sdk.ListPullRequestsOptions{ ListOptions: gitea_sdk.ListOptions{ Page: page, PageSize: perPage, }, State: gitea_sdk.StateAll, - } - - link, _ := url.Parse(fmt.Sprintf("/repos/%s/%s/pulls", url.PathEscape(g.repoOwner), url.PathEscape(g.repoName))) - link.RawQuery = opt.QueryEncode() - _, err := getParsedResponse(g.client, "GET", link.String(), http.Header{"content-type": []string{"application/json"}}, nil, &prs) + }) if err != nil { return nil, false, fmt.Errorf("error while listing pull requests (page: %d, pagesize: %d). Error: %w", page, perPage, err) } - - if g.client.CheckServerVersionConstraint(">= 1.14.0") != nil { - for i := range prs { - if err := g.fixPullHeadSha(prs[i]); err != nil { - return nil, false, fmt.Errorf("error while listing pull requests (page: %d, pagesize: %d). Error: %w", page, perPage, err) - } - } - } - for _, pr := range prs { var milestone string if pr.Milestone != nil { @@ -634,7 +597,6 @@ func (g *GiteaDownloader) GetPullRequests(page, perPage int) ([]*base.PullReques MergeCommitSHA: mergeCommitSHA, IsLocked: pr.IsLocked, PatchURL: pr.PatchURL, - Flow: pr.Flow, Head: base.PullRequestBranch{ Ref: headRef, SHA: headSHA, diff --git a/services/migrations/gitea_downloader_test.go b/services/migrations/gitea_downloader_test.go index 24c53af023..28a52c202d 100644 --- a/services/migrations/gitea_downloader_test.go +++ b/services/migrations/gitea_downloader_test.go @@ -4,26 +4,32 @@ package migrations import ( + "context" + "net/http" "os" "sort" "testing" "time" - "forgejo.org/models/unittest" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestGiteaDownloadRepo(t *testing.T) { + // Skip tests if Gitea token is not found giteaToken := os.Getenv("GITEA_TOKEN") + if giteaToken == "" { + t.Skip("skipped test because GITEA_TOKEN was not in the environment") + } - fixturePath := "./testdata/gitea/full_download" - server := unittest.NewMockWebServer(t, "https://gitea.com", fixturePath, giteaToken != "") - defer server.Close() + resp, err := http.Get("https://gitea.com/gitea") + if err != nil || resp.StatusCode != http.StatusOK { + t.Skipf("Can't reach https://gitea.com, skipping %s", t.Name()) + } - downloader, err := NewGiteaDownloader(t.Context(), server.URL, "gitea/test_repo", "", "", giteaToken) + downloader, err := NewGiteaDownloader(context.Background(), "https://gitea.com", "gitea/test_repo", "", "", giteaToken) if downloader == nil { t.Fatal("NewGitlabDownloader is nil") } @@ -36,10 +42,9 @@ func TestGiteaDownloadRepo(t *testing.T) { Owner: "gitea", IsPrivate: false, Description: "Test repository for testing migration from gitea to gitea", - CloneURL: server.URL + "/gitea/test_repo.git", - OriginalURL: server.URL + "/gitea/test_repo", + CloneURL: "https://gitea.com/gitea/test_repo.git", + OriginalURL: "https://gitea.com/gitea/test_repo", DefaultBranch: "master", - Website: "https://codeberg.org/forgejo/forgejo/", }, repo) topics, err := downloader.GetTopics() @@ -84,7 +89,7 @@ func TestGiteaDownloadRepo(t *testing.T) { Title: "V2 Finalize", Created: time.Unix(0, 0), Deadline: timePtr(time.Unix(1599263999, 0)), - Updated: timePtr(time.Date(2022, 11, 13, 5, 29, 15, 0, time.UTC)), + Updated: timePtr(time.Unix(0, 0)), State: "open", }, { @@ -111,7 +116,7 @@ func TestGiteaDownloadRepo(t *testing.T) { Published: time.Date(2020, 9, 1, 18, 2, 43, 0, time.UTC), PublisherID: 689, PublisherName: "6543", - PublisherEmail: "6543@noreply.gitea.com", + PublisherEmail: "6543@obermui.de", }, { Name: "First Release", @@ -124,7 +129,7 @@ func TestGiteaDownloadRepo(t *testing.T) { Published: time.Date(2020, 9, 1, 17, 30, 32, 0, time.UTC), PublisherID: 689, PublisherName: "6543", - PublisherEmail: "6543@noreply.gitea.com", + PublisherEmail: "6543@obermui.de", }, }, releases) @@ -198,7 +203,7 @@ func TestGiteaDownloadRepo(t *testing.T) { IssueIndex: 4, PosterID: 689, PosterName: "6543", - PosterEmail: "6543@noreply.gitea.com", + PosterEmail: "6543@obermui.de", Created: time.Unix(1598975370, 0), Updated: time.Unix(1599070865, 0), Content: "a really good question!\n\nIt is the used as TESTSET for gitea2gitea repo migration function", @@ -207,7 +212,7 @@ func TestGiteaDownloadRepo(t *testing.T) { IssueIndex: 4, PosterID: -1, PosterName: "Ghost", - PosterEmail: "ghost@noreply.gitea.com", + PosterEmail: "", Created: time.Unix(1598975393, 0), Updated: time.Unix(1598975393, 0), Content: "Oh!", @@ -234,7 +239,7 @@ func TestGiteaDownloadRepo(t *testing.T) { IsLocked: false, Created: time.Unix(1598982759, 0), Updated: time.Unix(1599023425, 0), - Closed: timePtr(time.Date(2020, 9, 1, 17, 55, 33, 0, time.UTC)), + Closed: timePtr(time.Unix(1598982934, 0)), Assignees: []string{"techknowlogick"}, Base: base.PullRequestBranch{ CloneURL: "", @@ -244,7 +249,7 @@ func TestGiteaDownloadRepo(t *testing.T) { OwnerName: "gitea", }, Head: base.PullRequestBranch{ - CloneURL: server.URL + "/6543-forks/test_repo.git", + CloneURL: "https://gitea.com/6543-forks/test_repo.git", Ref: "refs/pull/12/head", SHA: "b6ab5d9ae000b579a5fff03f92c486da4ddf48b6", RepoName: "test_repo", @@ -253,7 +258,7 @@ func TestGiteaDownloadRepo(t *testing.T) { Merged: true, MergedTime: timePtr(time.Unix(1598982934, 0)), MergeCommitSHA: "827aa28a907853e5ddfa40c8f9bc52471a2685fd", - PatchURL: server.URL + "/gitea/test_repo/pulls/12.patch", + PatchURL: "https://gitea.com/gitea/test_repo/pulls/12.patch", }, prs[1]) reviews, err := downloader.GetReviews(&base.Issue{Number: 7, ForeignIndex: 7}) @@ -280,7 +285,7 @@ func TestGiteaDownloadRepo(t *testing.T) { PosterID: 689, Reactions: nil, CreatedAt: time.Date(2020, 9, 1, 16, 12, 58, 0, time.UTC), - UpdatedAt: time.Date(2024, 6, 3, 1, 18, 36, 0, time.UTC), + UpdatedAt: time.Date(2020, 9, 1, 16, 12, 58, 0, time.UTC), }, }, }, @@ -307,46 +312,3 @@ func TestGiteaDownloadRepo(t *testing.T) { }, }, reviews) } - -func TestForgejoDownloadRepo(t *testing.T) { - token := os.Getenv("CODE_FORGEJO_TOKEN") - - fixturePath := "./testdata/code-forgejo-org/full_download" - server := unittest.NewMockWebServer(t, "https://code.forgejo.org", fixturePath, token != "") - defer server.Close() - - downloader, err := NewGiteaDownloader(t.Context(), server.URL, "Gusted/agit-test", "", "", token) - require.NoError(t, err) - require.NotNil(t, downloader) - - prs, _, err := downloader.GetPullRequests(1, 50) - require.NoError(t, err) - assert.Len(t, prs, 1) - - assertPullRequestEqual(t, &base.PullRequest{ - Number: 1, - PosterID: 63, - PosterName: "Gusted", - PosterEmail: "postmaster@gusted.xyz", - Title: "Add extra information", - State: "open", - Created: time.Date(2025, time.April, 1, 20, 28, 45, 0, time.UTC), - Updated: time.Date(2025, time.April, 1, 20, 28, 45, 0, time.UTC), - Base: base.PullRequestBranch{ - CloneURL: "", - Ref: "main", - SHA: "79ebb873a6497c8847141ba9706b3f757196a1e6", - RepoName: "agit-test", - OwnerName: "Gusted", - }, - Head: base.PullRequestBranch{ - CloneURL: server.URL + "/Gusted/agit-test.git", - Ref: "refs/pull/1/head", - SHA: "667e9317ec37b977e6d3d7d43e3440636970563c", - RepoName: "agit-test", - OwnerName: "Gusted", - }, - PatchURL: server.URL + "/Gusted/agit-test/pulls/1.patch", - Flow: 1, - }, prs[0]) -} diff --git a/services/migrations/gitea_sdk_hack.go b/services/migrations/gitea_sdk_hack.go deleted file mode 100644 index f3959717a8..0000000000 --- a/services/migrations/gitea_sdk_hack.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package migrations - -import ( - "io" - "net/http" - - _ "unsafe" // Needed for go:linkname support - - gitea_sdk "code.gitea.io/sdk/gitea" -) - -//go:linkname getParsedResponse code.gitea.io/sdk/gitea.(*Client).getParsedResponse -func getParsedResponse(client *gitea_sdk.Client, method, path string, header http.Header, body io.Reader, obj any) (*gitea_sdk.Response, error) diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index 55adad9685..3ba4ca203b 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -14,26 +14,26 @@ import ( "strings" "time" - "forgejo.org/models" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - base_module "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/label" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/uri" - "forgejo.org/modules/util" - "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "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" + base_module "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/label" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/uri" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" "github.com/google/uuid" ) @@ -105,7 +105,6 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate r, err = repo_service.CreateRepositoryDirectly(g.ctx, g.doer, owner, repo_service.CreateRepoOptions{ Name: g.repoName, Description: repo.Description, - Website: repo.Website, OriginalURL: repo.OriginalURL, GitServiceType: opts.GitServiceType, IsPrivate: opts.Private || setting.Repository.ForcePrivate, @@ -120,17 +119,20 @@ func (g *GiteaLocalUploader) CreateRepo(repo *base.Repository, opts base.Migrate } r.DefaultBranch = repo.DefaultBranch r.Description = repo.Description - r.Website = repo.Website r, err = repo_service.MigrateRepositoryGitData(g.ctx, owner, r, base.MigrateOptions{ - CloneAddr: repo.CloneURL, // SECURITY: we will assume that this has already been checked + RepoName: g.repoName, + Description: repo.Description, + OriginalURL: repo.OriginalURL, + GitServiceType: opts.GitServiceType, + Mirror: repo.IsMirror, LFS: opts.LFS, LFSEndpoint: opts.LFSEndpoint, - Mirror: repo.IsMirror, - MirrorInterval: opts.MirrorInterval, - Releases: opts.Releases, // if didn't get releases, then sync them from tags - RepoName: g.repoName, + CloneAddr: repo.CloneURL, // SECURITY: we will assume that this has already been checked + Private: repo.IsPrivate, Wiki: opts.Wiki, + Releases: opts.Releases, // if didn't get releases, then sync them from tags + MirrorInterval: opts.MirrorInterval, }, NewMigrationHTTPTransport()) g.sameApp = strings.HasPrefix(repo.OriginalURL, setting.AppURL) @@ -758,15 +760,10 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*issues_model pr.Updated = pr.Created } - prTitle := pr.Title - if pr.IsDraft && !issues_model.HasWorkInProgressPrefix(pr.Title) { - prTitle = fmt.Sprintf("%s %s", setting.Repository.PullRequest.WorkInProgressPrefixes[0], pr.Title) - } - issue := issues_model.Issue{ RepoID: g.repo.ID, Repo: g.repo, - Title: prTitle, + Title: pr.Title, Index: pr.Number, Content: pr.Content, MilestoneID: milestoneID, @@ -802,7 +799,6 @@ func (g *GiteaLocalUploader) newPullRequest(pr *base.PullRequest) (*issues_model MergeBase: pr.Base.SHA, Index: pr.Number, HasMerged: pr.Merged, - Flow: issues_model.PullRequestFlow(pr.Flow), Issue: &issue, } diff --git a/services/migrations/gitea_uploader_test.go b/services/migrations/gitea_uploader_test.go index e07c621acc..ad193b2253 100644 --- a/services/migrations/gitea_uploader_test.go +++ b/services/migrations/gitea_uploader_test.go @@ -5,6 +5,7 @@ package migrations import ( + "context" "fmt" "os" "path/filepath" @@ -12,19 +13,19 @@ import ( "testing" "time" - "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/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/optional" - "forgejo.org/modules/structs" - "forgejo.org/modules/test" + "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -39,7 +40,7 @@ func TestGiteaUploadRepo(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) var ( - ctx = t.Context() + ctx = context.Background() downloader = NewGithubDownloaderV3(ctx, "https://github.com", "", "", "", "go-xorm", "builder") repoName = "builder-" + time.Now().Format("2006-01-02-15-04-05") uploader = NewGiteaLocalUploader(graceful.GetManager().HammerContext(), user, user.Name, repoName) @@ -132,7 +133,7 @@ func TestGiteaUploadRemapLocalUser(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repoName := "migrated" - uploader := NewGiteaLocalUploader(t.Context(), doer, doer.Name, repoName) + uploader := NewGiteaLocalUploader(context.Background(), doer, doer.Name, repoName) // call remapLocalUser uploader.sameApp = true @@ -181,7 +182,7 @@ func TestGiteaUploadRemapExternalUser(t *testing.T) { doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) repoName := "migrated" - uploader := NewGiteaLocalUploader(t.Context(), doer, doer.Name, repoName) + uploader := NewGiteaLocalUploader(context.Background(), doer, doer.Name, repoName) uploader.gitServiceType = structs.GiteaService // call remapExternalUser uploader.sameApp = false @@ -300,7 +301,7 @@ func TestGiteaUploadUpdateGitForPullRequest(t *testing.T) { require.NoError(t, err) toRepoName := "migrated" - uploader := NewGiteaLocalUploader(t.Context(), fromRepoOwner, fromRepoOwner.Name, toRepoName) + uploader := NewGiteaLocalUploader(context.Background(), fromRepoOwner, fromRepoOwner.Name, toRepoName) uploader.gitServiceType = structs.GiteaService require.NoError(t, uploader.CreateRepo(&base.Repository{ Description: "description", diff --git a/services/migrations/github.go b/services/migrations/github.go index 5052a68114..54d38596e1 100644 --- a/services/migrations/github.go +++ b/services/migrations/github.go @@ -14,11 +14,11 @@ import ( "strings" "time" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/proxy" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/structs" "github.com/google/go-github/v64/github" "golang.org/x/oauth2" @@ -220,7 +220,6 @@ func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) { OriginalURL: gr.GetHTMLURL(), CloneURL: gr.GetCloneURL(), DefaultBranch: gr.GetDefaultBranch(), - Website: gr.GetHomepage(), }, nil } @@ -743,7 +742,6 @@ func (g *GithubDownloaderV3) GetPullRequests(page, perPage int) ([]*base.PullReq PatchURL: pr.GetPatchURL(), // see below for SECURITY related issues here Reactions: reactions, ForeignIndex: int64(*pr.Number), - IsDraft: pr.GetDraft(), }) // SECURITY: Ensure that the PR is safe diff --git a/services/migrations/github_test.go b/services/migrations/github_test.go index b1f20c4716..a2134f8bf2 100644 --- a/services/migrations/github_test.go +++ b/services/migrations/github_test.go @@ -5,12 +5,12 @@ package migrations import ( + "context" "os" "testing" "time" - "forgejo.org/models/unittest" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -18,13 +18,11 @@ import ( func TestGitHubDownloadRepo(t *testing.T) { GithubLimitRateRemaining = 3 // Wait at 3 remaining since we could have 3 CI in // - token := os.Getenv("GITHUB_READ_TOKEN") - fixturePath := "./testdata/github/full_download" - server := unittest.NewMockWebServer(t, "https://api.github.com", fixturePath, token != "") - defer server.Close() - - downloader := NewGithubDownloaderV3(t.Context(), server.URL, "", "", token, "go-gitea", "test_repo") + if token == "" { + t.Skip("Skipping GitHub migration test because GITHUB_READ_TOKEN is empty") + } + downloader := NewGithubDownloaderV3(context.Background(), "https://github.com", "", "", token, "go-gitea", "test_repo") err := downloader.RefreshRate() require.NoError(t, err) @@ -34,10 +32,9 @@ func TestGitHubDownloadRepo(t *testing.T) { Name: "test_repo", Owner: "go-gitea", Description: "Test repository for testing migration from github to gitea", - CloneURL: server.URL + "/go-gitea/test_repo.git", - OriginalURL: server.URL + "/go-gitea/test_repo", + CloneURL: "https://github.com/go-gitea/test_repo.git", + OriginalURL: "https://github.com/go-gitea/test_repo", DefaultBranch: "master", - Website: "https://codeberg.org/forgejo/forgejo/", }, repo) topics, err := downloader.GetTopics() @@ -272,10 +269,10 @@ func TestGitHubDownloadRepo(t *testing.T) { Description: "Improvements or additions to documentation", }, }, - PatchURL: server.URL + "/go-gitea/test_repo/pull/3.patch", + PatchURL: "https://github.com/go-gitea/test_repo/pull/3.patch", Head: base.PullRequestBranch{ Ref: "master", - CloneURL: server.URL + "/mrsdizzie/test_repo.git", + CloneURL: "https://github.com/mrsdizzie/test_repo.git", SHA: "076160cf0b039f13e5eff19619932d181269414b", RepoName: "test_repo", @@ -310,13 +307,13 @@ func TestGitHubDownloadRepo(t *testing.T) { Description: "Something isn't working", }, }, - PatchURL: server.URL + "/go-gitea/test_repo/pull/4.patch", + PatchURL: "https://github.com/go-gitea/test_repo/pull/4.patch", Head: base.PullRequestBranch{ Ref: "test-branch", SHA: "2be9101c543658591222acbee3eb799edfc3853d", RepoName: "test_repo", OwnerName: "mrsdizzie", - CloneURL: server.URL + "/mrsdizzie/test_repo.git", + CloneURL: "https://github.com/mrsdizzie/test_repo.git", }, Base: base.PullRequestBranch{ Ref: "master", diff --git a/services/migrations/gitlab.go b/services/migrations/gitlab.go index ac0d3bcf7a..1639a34862 100644 --- a/services/migrations/gitlab.go +++ b/services/migrations/gitlab.go @@ -15,14 +15,13 @@ import ( "strings" "time" - issues_model "forgejo.org/models/issues" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/structs" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/structs" - gitlab "gitlab.com/gitlab-org/api/client-go" + "github.com/xanzy/go-gitlab" ) var ( @@ -544,19 +543,11 @@ func (g *GitlabDownloader) GetComments(commentable base.Commentable) ([]*base.Co } for _, stateEvent := range stateEvents { - // If the user is deleted, then `stateEvent.User == nil` holds. Fallback - // to the Ghost user in that case. - posterID := int64(user_model.GhostUserID) - posterName := user_model.GhostUserName - if stateEvent.User != nil { - posterID = int64(stateEvent.User.ID) - posterName = stateEvent.User.Username - } comment := &base.Comment{ IssueIndex: commentable.GetLocalIndex(), Index: int64(stateEvent.ID), - PosterID: posterID, - PosterName: posterName, + PosterID: int64(stateEvent.User.ID), + PosterName: stateEvent.User.Username, Content: "", Created: *stateEvent.CreatedAt, } @@ -732,7 +723,6 @@ func (g *GitlabDownloader) GetPullRequests(page, perPage int) ([]*base.PullReque PatchURL: pr.WebURL + ".patch", ForeignIndex: int64(pr.IID), Context: gitlabIssueContext{IsMergeRequest: true}, - IsDraft: pr.Draft, }) // SECURITY: Ensure that the PR is safe diff --git a/services/migrations/gitlab_test.go b/services/migrations/gitlab_test.go index 924dab5144..39edba3cda 100644 --- a/services/migrations/gitlab_test.go +++ b/services/migrations/gitlab_test.go @@ -4,6 +4,7 @@ package migrations import ( + "context" "fmt" "net/http" "net/http/httptest" @@ -12,13 +13,13 @@ import ( "testing" "time" - "forgejo.org/models/unittest" - "forgejo.org/modules/json" - base "forgejo.org/modules/migration" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/json" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - gitlab "gitlab.com/gitlab-org/api/client-go" + "github.com/xanzy/go-gitlab" ) func TestGitlabDownloadRepo(t *testing.T) { @@ -30,7 +31,7 @@ func TestGitlabDownloadRepo(t *testing.T) { server := unittest.NewMockWebServer(t, "https://gitlab.com", fixturePath, gitlabPersonalAccessToken != "") defer server.Close() - downloader, err := NewGitlabDownloader(t.Context(), server.URL, "forgejo/test_repo", "", "", gitlabPersonalAccessToken) + downloader, err := NewGitlabDownloader(context.Background(), server.URL, "forgejo/test_repo", "", "", gitlabPersonalAccessToken) if err != nil { t.Fatalf("NewGitlabDownloader is nil: %v", err) } @@ -330,7 +331,7 @@ func TestGitlabSkippedIssueNumber(t *testing.T) { server := unittest.NewMockWebServer(t, "https://gitlab.com", fixturePath, gitlabPersonalAccessToken != "") defer server.Close() - downloader, err := NewGitlabDownloader(t.Context(), server.URL, "troyengel/archbuild", "", "", gitlabPersonalAccessToken) + downloader, err := NewGitlabDownloader(context.Background(), server.URL, "troyengel/archbuild", "", "", gitlabPersonalAccessToken) if err != nil { t.Fatalf("NewGitlabDownloader is nil: %v", err) } @@ -453,7 +454,7 @@ func TestGitlabGetReviews(t *testing.T) { repoID := 1324 downloader := &GitlabDownloader{ - ctx: t.Context(), + ctx: context.Background(), client: client, repoID: repoID, } diff --git a/services/migrations/gogs.go b/services/migrations/gogs.go index b6fb8cef0a..b31d05fa73 100644 --- a/services/migrations/gogs.go +++ b/services/migrations/gogs.go @@ -11,10 +11,10 @@ import ( "strings" "time" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/proxy" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/structs" "github.com/gogs/go-gogs-client" ) @@ -151,7 +151,6 @@ func (g *GogsDownloader) GetRepoInfo() (*base.Repository, error) { CloneURL: gr.CloneURL, OriginalURL: gr.HTMLURL, DefaultBranch: gr.DefaultBranch, - Website: gr.Website, }, nil } diff --git a/services/migrations/gogs_test.go b/services/migrations/gogs_test.go index 7d7f10c2b9..6c511a2bb5 100644 --- a/services/migrations/gogs_test.go +++ b/services/migrations/gogs_test.go @@ -4,12 +4,13 @@ package migrations import ( + "context" "net/http" "os" "testing" "time" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -29,7 +30,7 @@ func TestGogsDownloadRepo(t *testing.T) { return } - downloader := NewGogsDownloader(t.Context(), "https://try.gogs.io", "", "", gogsPersonalAccessToken, "lunnytest", "TESTREPO") + downloader := NewGogsDownloader(context.Background(), "https://try.gogs.io", "", "", gogsPersonalAccessToken, "lunnytest", "TESTREPO") repo, err := downloader.GetRepoInfo() require.NoError(t, err) @@ -206,7 +207,7 @@ func TestGogsDownloaderFactory_New(t *testing.T) { AuthPassword: tt.args.AuthPassword, AuthToken: tt.args.AuthToken, } - got, err := f.New(t.Context(), opts) + got, err := f.New(context.Background(), opts) if (err != nil) != tt.wantErr { t.Errorf("GogsDownloaderFactory.New() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/services/migrations/http_client.go b/services/migrations/http_client.go index 26962f2976..0b997e08f4 100644 --- a/services/migrations/http_client.go +++ b/services/migrations/http_client.go @@ -7,9 +7,9 @@ import ( "crypto/tls" "net/http" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/proxy" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/setting" ) // NewMigrationHTTPClient returns a HTTP client for migration diff --git a/services/migrations/main_test.go b/services/migrations/main_test.go index d543bd6d9c..d0ec6a3f8d 100644 --- a/services/migrations/main_test.go +++ b/services/migrations/main_test.go @@ -8,8 +8,8 @@ import ( "testing" "time" - "forgejo.org/models/unittest" - base "forgejo.org/modules/migration" + "code.gitea.io/gitea/models/unittest" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" ) @@ -136,7 +136,6 @@ func assertPullRequestEqual(t *testing.T, expected, actual *base.PullRequest) { assert.ElementsMatch(t, expected.Assignees, actual.Assignees) assert.Equal(t, expected.IsLocked, actual.IsLocked) assertReactionsEqual(t, expected.Reactions, actual.Reactions) - assert.Equal(t, expected.Flow, actual.Flow) } func assertPullRequestsEqual(t *testing.T, expected, actual []*base.PullRequest) { @@ -220,7 +219,6 @@ func assertRepositoryEqual(t *testing.T, expected, actual *base.Repository) { assert.Equal(t, expected.CloneURL, actual.CloneURL) assert.Equal(t, expected.OriginalURL, actual.OriginalURL) assert.Equal(t, expected.DefaultBranch, actual.DefaultBranch) - assert.Equal(t, expected.Website, actual.Website) } func assertReviewEqual(t *testing.T, expected, actual *base.Review) { diff --git a/services/migrations/migrate.go b/services/migrations/migrate.go index 81d1c203fe..29b815d521 100644 --- a/services/migrations/migrate.go +++ b/services/migrations/migrate.go @@ -12,16 +12,16 @@ import ( "path/filepath" "strings" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models" + repo_model "code.gitea.io/gitea/models/repo" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" ) // MigrateOptions is equal to base.MigrateOptions @@ -39,17 +39,8 @@ func RegisterDownloaderFactory(factory base.DownloaderFactory) { factories = append(factories, factory) } -// IsPushMirrorURLAllowed checks if an URL is allowed to be pushed to. -func IsPushMirrorURLAllowed(remoteURL string, doer *user_model.User) error { - return isURLAllowed(remoteURL, doer, true) -} - -// IsMigrateURLAllowed checks if an URL is allowed to be migrated from. +// IsMigrateURLAllowed checks if an URL is allowed to be migrated from func IsMigrateURLAllowed(remoteURL string, doer *user_model.User) error { - return isURLAllowed(remoteURL, doer, false) -} - -func isURLAllowed(remoteURL string, doer *user_model.User, isPushMirror bool) error { // Remote address can be HTTP/HTTPS/Git URL or local path. u, err := url.Parse(remoteURL) if err != nil { @@ -80,7 +71,7 @@ func isURLAllowed(remoteURL string, doer *user_model.User, isPushMirror bool) er return &models.ErrInvalidCloneAddr{Host: u.Host, IsURLError: true} } - if u.Opaque != "" || u.Scheme != "" && u.Scheme != "http" && u.Scheme != "https" && u.Scheme != "git" && u.Scheme != "ssh" || (!isPushMirror && u.Scheme == "ssh") { + if u.Opaque != "" || u.Scheme != "" && u.Scheme != "http" && u.Scheme != "https" && u.Scheme != "git" && u.Scheme != "ssh" { return &models.ErrInvalidCloneAddr{Host: u.Host, IsProtocolInvalid: true, IsPermissionDenied: true, IsURLError: true} } diff --git a/services/migrations/migrate_test.go b/services/migrations/migrate_test.go index 804d01df7a..109a092796 100644 --- a/services/migrations/migrate_test.go +++ b/services/migrations/migrate_test.go @@ -8,9 +8,9 @@ import ( "path/filepath" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/require" ) @@ -113,18 +113,3 @@ func TestAllowBlockList(t *testing.T) { // reset init("", "", false) } - -func TestURLAllowedSSH(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) - sshURL := "ssh://git@git.gay/gitgay/forgejo" - - t.Run("Migrate URL", func(t *testing.T) { - require.Error(t, IsMigrateURLAllowed(sshURL, user)) - }) - - t.Run("Pushmirror URL", func(t *testing.T) { - require.NoError(t, IsPushMirrorURLAllowed(sshURL, user)) - }) -} diff --git a/services/migrations/onedev.go b/services/migrations/onedev.go index a553a4d8f5..e2f7b771f3 100644 --- a/services/migrations/onedev.go +++ b/services/migrations/onedev.go @@ -12,10 +12,10 @@ import ( "strings" "time" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/structs" ) var ( diff --git a/services/migrations/onedev_test.go b/services/migrations/onedev_test.go index 5bb2e2bb5c..80c26130cc 100644 --- a/services/migrations/onedev_test.go +++ b/services/migrations/onedev_test.go @@ -4,12 +4,13 @@ package migrations import ( + "context" "net/http" "net/url" "testing" "time" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -22,7 +23,7 @@ func TestOneDevDownloadRepo(t *testing.T) { } u, _ := url.Parse("https://code.onedev.io") - downloader := NewOneDevDownloader(t.Context(), u, "", "", "go-gitea-test_repo") + downloader := NewOneDevDownloader(context.Background(), u, "", "", "go-gitea-test_repo") if err != nil { t.Fatalf("NewOneDevDownloader is nil: %v", err) } diff --git a/services/migrations/restore.go b/services/migrations/restore.go index fe2628da52..fd337b22c7 100644 --- a/services/migrations/restore.go +++ b/services/migrations/restore.go @@ -10,7 +10,7 @@ import ( "path/filepath" "strconv" - base "forgejo.org/modules/migration" + base "code.gitea.io/gitea/modules/migration" "gopkg.in/yaml.v3" ) @@ -85,7 +85,6 @@ func (r *RepositoryRestorer) GetRepoInfo() (*base.Repository, error) { OriginalURL: opts["original_url"], CloneURL: filepath.Join(r.baseDir, "git"), DefaultBranch: opts["default_branch"], - Website: opts["website"], }, nil } diff --git a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Frepos%2FGusted%2Fagit-test%2Fpulls%3Flimit=50&page=1&state=all b/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Frepos%2FGusted%2Fagit-test%2Fpulls%3Flimit=50&page=1&state=all deleted file mode 100644 index 87095d9e24..0000000000 --- a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Frepos%2FGusted%2Fagit-test%2Fpulls%3Flimit=50&page=1&state=all +++ /dev/null @@ -1,8 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Content-Type: application/json;charset=utf-8 -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -X-Total-Count: 1 - -[{"id":4980,"url":"https://code.forgejo.org/Gusted/agit-test/pulls/1","number":1,"user":{"id":63,"login":"Gusted","login_name":"26734","source_id":1,"full_name":"","email":"postmaster@gusted.xyz","avatar_url":"https://code.forgejo.org/avatars/4ca5ad8bc488630869fdbd2051da61cbed7241c9c066d4e5e1dd36300f887340","html_url":"https://code.forgejo.org/Gusted","language":"en-US","is_admin":false,"last_login":"2025-04-01T16:35:18Z","created":"2023-07-08T13:33:38Z","restricted":false,"active":true,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":2,"following_count":0,"starred_repos_count":0,"username":"Gusted"},"title":"Add extra information","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":[],"requested_reviewers_teams":[],"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":0,"html_url":"https://code.forgejo.org/Gusted/agit-test/pulls/1","diff_url":"https://code.forgejo.org/Gusted/agit-test/pulls/1.diff","patch_url":"https://code.forgejo.org/Gusted/agit-test/pulls/1.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"main","ref":"main","sha":"79ebb873a6497c8847141ba9706b3f757196a1e6","repo_id":1414,"repo":{"id":1414,"owner":{"id":63,"login":"Gusted","login_name":"","source_id":0,"full_name":"","email":"gusted@noreply.code.forgejo.org","avatar_url":"https://code.forgejo.org/avatars/4ca5ad8bc488630869fdbd2051da61cbed7241c9c066d4e5e1dd36300f887340","html_url":"https://code.forgejo.org/Gusted","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-07-08T13:33:38Z","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":2,"following_count":0,"starred_repos_count":0,"username":"Gusted"},"name":"agit-test","full_name":"Gusted/agit-test","description":"USED FOR FORGEJO UNIT TESTING","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":36,"language":"","languages_url":"https://code.forgejo.org/api/v1/repos/Gusted/agit-test/languages","html_url":"https://code.forgejo.org/Gusted/agit-test","url":"https://code.forgejo.org/api/v1/repos/Gusted/agit-test","link":"","ssh_url":"ssh://git@code.forgejo.org/Gusted/agit-test.git","clone_url":"https://code.forgejo.org/Gusted/agit-test.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":1,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2025-04-01T20:25:03Z","updated_at":"2025-04-01T20:25:03Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":true,"push":true,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"wiki_branch":"main","globally_editable_wiki":false,"has_pull_requests":true,"has_projects":true,"has_releases":true,"has_packages":true,"has_actions":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":true,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"default_update_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":null}},"head":{"label":"","ref":"refs/pull/1/head","sha":"667e9317ec37b977e6d3d7d43e3440636970563c","repo_id":1414,"repo":{"id":1414,"owner":{"id":63,"login":"Gusted","login_name":"","source_id":0,"full_name":"","email":"gusted@noreply.code.forgejo.org","avatar_url":"https://code.forgejo.org/avatars/4ca5ad8bc488630869fdbd2051da61cbed7241c9c066d4e5e1dd36300f887340","html_url":"https://code.forgejo.org/Gusted","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2023-07-08T13:33:38Z","restricted":false,"active":false,"prohibit_login":false,"location":"","pronouns":"","website":"","description":"","visibility":"public","followers_count":2,"following_count":0,"starred_repos_count":0,"username":"Gusted"},"name":"agit-test","full_name":"Gusted/agit-test","description":"USED FOR FORGEJO UNIT TESTING","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":36,"language":"","languages_url":"https://code.forgejo.org/api/v1/repos/Gusted/agit-test/languages","html_url":"https://code.forgejo.org/Gusted/agit-test","url":"https://code.forgejo.org/api/v1/repos/Gusted/agit-test","link":"","ssh_url":"ssh://git@code.forgejo.org/Gusted/agit-test.git","clone_url":"https://code.forgejo.org/Gusted/agit-test.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":1,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2025-04-01T20:25:03Z","updated_at":"2025-04-01T20:25:03Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":true,"push":true,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"wiki_branch":"main","globally_editable_wiki":false,"has_pull_requests":true,"has_projects":true,"has_releases":true,"has_packages":true,"has_actions":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":true,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"default_update_style":"merge","avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":null}},"merge_base":"79ebb873a6497c8847141ba9706b3f757196a1e6","due_date":null,"created_at":"2025-04-01T20:28:45Z","updated_at":"2025-04-01T20:28:45Z","closed_at":null,"pin_order":0,"flow":1}] diff --git a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi b/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi deleted file mode 100644 index 11c4e7b8ba..0000000000 --- a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi +++ /dev/null @@ -1,7 +0,0 @@ -Content-Length: 117 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Content-Type: application/json;charset=utf-8 -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN - -{"max_response_items":50,"default_paging_num":30,"default_git_trees_per_page":1000,"default_max_blob_size":10485760} diff --git a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fversion b/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fversion deleted file mode 100644 index 411ed84e24..0000000000 --- a/services/migrations/testdata/code-forgejo-org/full_download/GET_%2Fapi%2Fv1%2Fversion +++ /dev/null @@ -1,7 +0,0 @@ -Cache-Control: max-age=0, private, must-revalidate, no-transform -Content-Type: application/json;charset=utf-8 -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Length: 53 - -{"version":"11.0.0-dev-617-1d1e0ced3e+gitea-1.22.0"} diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo deleted file mode 100644 index 7b4441ceae..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo +++ /dev/null @@ -1,7 +0,0 @@ -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff - -{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null} diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions deleted file mode 100644 index d7b453f63b..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F1%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -X-Total-Count: 2 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 1293 - -[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T00:15:14Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"confused","created_at":"2020-09-01T00:15:19Z"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F10%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F10%2Freactions deleted file mode 100644 index a6b09b769c..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F10%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Content-Length: 5 -Vary: Origin -X-Content-Type-Options: nosniff -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Frame-Options: SAMEORIGIN - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F11%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F11%2Freactions deleted file mode 100644 index 139c547d0a..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F11%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F12%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F12%2Freactions deleted file mode 100644 index 94b815b3a1..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F12%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -X-Frame-Options: SAMEORIGIN -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff -Vary: Origin -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F13%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F13%2Freactions deleted file mode 100644 index 95b1b871d6..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F13%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Content-Length: 5 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -X-Content-Type-Options: nosniff -X-Total-Count: 0 - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F2%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F2%2Freactions deleted file mode 100644 index 5d94bfa369..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F2%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Frame-Options: SAMEORIGIN -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Vary: Origin -X-Content-Type-Options: nosniff - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F3%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F3%2Freactions deleted file mode 100644 index 1f244a25f5..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F3%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Total-Count: 0 - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1 deleted file mode 100644 index 294aa749cb..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Fcomments%3Flimit=50&page=1 +++ /dev/null @@ -1,10 +0,0 @@ -X-Frame-Options: SAMEORIGIN -X-Total-Count: 2 -Content-Type: application/json;charset=utf-8 -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff -Content-Length: 1824 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin - -[{"id":116550,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116550","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"body":"a really good question!\n\nIt is the used as TESTSET for gitea2gitea repo migration function","assets":[],"created_at":"2020-09-01T15:49:30Z","updated_at":"2020-09-02T18:21:05Z"},{"id":116552,"html_url":"https://gitea.com/gitea/test_repo/issues/4#issuecomment-116552","pull_request_url":"","issue_url":"https://gitea.com/gitea/test_repo/issues/4","user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"ghost@noreply.gitea.com","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"body":"Oh!","assets":[],"created_at":"2020-09-01T15:49:53Z","updated_at":"2020-09-01T15:49:53Z"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions deleted file mode 100644 index 0300a779cb..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F4%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -X-Frame-Options: SAMEORIGIN -X-Total-Count: 2 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -Content-Type: application/json;charset=utf-8 -Content-Length: 1290 - -[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"gitea","created_at":"2020-09-01T19:36:40Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"laugh","created_at":"2020-09-01T19:36:45Z"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions deleted file mode 100644 index 39606a50cf..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F5%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Length: 1288 -Access-Control-Expose-Headers: X-Total-Count -Vary: Origin -Content-Type: application/json;charset=utf-8 -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Total-Count: 2 - -[{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"+1","created_at":"2020-09-01T16:07:06Z"},{"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"content":"hooray","created_at":"2020-09-01T16:07:11Z"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F6%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F6%2Freactions deleted file mode 100644 index f25996bc6b..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F6%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Total-Count: 0 - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F7%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F7%2Freactions deleted file mode 100644 index 926a987090..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F7%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff -X-Total-Count: 0 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Frame-Options: SAMEORIGIN - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F8%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F8%2Freactions deleted file mode 100644 index abaff9c6fd..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F8%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -Vary: Origin -X-Frame-Options: SAMEORIGIN -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F9%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F9%2Freactions deleted file mode 100644 index 75de9623c7..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2F9%2Freactions +++ /dev/null @@ -1,10 +0,0 @@ -X-Total-Count: 0 -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Access-Control-Expose-Headers: X-Total-Count -X-Frame-Options: SAMEORIGIN -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116550%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116550%2Freactions deleted file mode 100644 index 86ac9f784f..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116550%2Freactions +++ /dev/null @@ -1,8 +0,0 @@ -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116552%2Freactions b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116552%2Freactions deleted file mode 100644 index 94133432e8..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%2Fcomments%2F116552%2Freactions +++ /dev/null @@ -1,8 +0,0 @@ -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 5 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin - -null diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues deleted file mode 100644 index 1e552b22d4..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=2&page=3&state=all&type=issues +++ /dev/null @@ -1,10 +0,0 @@ -Link: ; rel="next",; rel="last",; rel="first",; rel="prev" -Access-Control-Expose-Headers: Link, X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -X-Total-Count: 7 -Content-Type: application/json;charset=utf-8 -Vary: Origin - -[{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues deleted file mode 100644 index 6b0a6135ac..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fissues%3Flimit=50&page=1&state=all&type=issues +++ /dev/null @@ -1,9 +0,0 @@ -Content-Type: application/json;charset=utf-8 -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -X-Total-Count: 7 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin - -[{"id":30481,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/10","html_url":"https://gitea.com/gitea/test_repo/issues/10","number":10,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"A'm I allowed to fork it?","body":"yes but do not create pull requests anymore","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":null,"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:48:14Z","updated_at":"2020-09-01T17:48:14Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30480,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/9","html_url":"https://gitea.com/gitea/test_repo/issues/9","number":9,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Idears","body":"this is an example for an open issue - they just cant be all closed ;)","ref":"","assets":[],"labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"open","is_locked":false,"comments":0,"created_at":"2020-09-01T17:47:11Z","updated_at":"2020-09-01T17:47:17Z","closed_at":null,"due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30477,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/6","html_url":"https://gitea.com/gitea/test_repo/issues/6","number":6,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Please add a tag (or a release)","body":"","ref":"","assets":[],"labels":[],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:07:01Z","updated_at":"2020-09-01T17:26:02Z","closed_at":"2020-09-01T17:26:02Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30476,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/5","html_url":"https://gitea.com/gitea/test_repo/issues/5","number":5,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"original_author":"","original_author_id":0,"title":"Need more contributors to this repo","body":"I volunteer as one","ref":"","assets":[],"labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":1,"created_at":"2020-09-01T16:06:30Z","updated_at":"2020-09-01T17:46:09Z","closed_at":"2020-09-01T17:46:09Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30475,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/4","html_url":"https://gitea.com/gitea/test_repo/issues/4","number":4,"user":{"id":-1,"login":"Ghost","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/assets/img/avatar_default.png","html_url":"https://gitea.com/Ghost","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"1970-01-01T00:00:00Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"Ghost"},"original_author":"","original_author_id":0,"title":"what is this repo about?","body":"","ref":"","assets":[],"labels":[{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"state":"closed","is_locked":true,"comments":2,"created_at":"2020-09-01T15:48:41Z","updated_at":"2020-09-01T15:50:00Z","closed_at":"2020-09-01T15:49:34Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30471,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/2","html_url":"https://gitea.com/gitea/test_repo/issues/2","number":2,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Spam","body":":(","ref":"","assets":[],"labels":[{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"}],"milestone":null,"assignee":null,"assignees":null,"state":"closed","is_locked":false,"comments":2,"created_at":"2020-09-01T00:23:00Z","updated_at":"2020-09-01T14:11:37Z","closed_at":"2020-09-01T14:11:37Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0},{"id":30470,"url":"https://gitea.com/api/v1/repos/gitea/test_repo/issues/1","html_url":"https://gitea.com/gitea/test_repo/issues/1","number":1,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"original_author":"","original_author_id":0,"title":"Here Is no content!","body":"","ref":"","assets":[],"labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assignees":[{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"}],"state":"closed","is_locked":false,"comments":0,"created_at":"2020-09-01T00:15:11Z","updated_at":"2020-09-01T17:26:25Z","closed_at":"2020-09-01T17:26:25Z","due_date":null,"pull_request":null,"repository":{"id":16268,"name":"test_repo","owner":"gitea","full_name":"gitea/test_repo"},"pin_order":0}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Flabels%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Flabels%3Flimit=50&page=1 deleted file mode 100644 index 0c5e5c4b37..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Flabels%3Flimit=50&page=1 +++ /dev/null @@ -1,10 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Frame-Options: SAMEORIGIN -X-Total-Count: 6 -Content-Length: 1026 -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff - -[{"id":3730,"name":"Bug","exclusive":false,"is_archived":false,"color":"e11d21","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3730"},{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"},{"id":3731,"name":"Feature","exclusive":false,"is_archived":false,"color":"0052cc","description":"a feature request","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3731"},{"id":3732,"name":"Invalid","exclusive":false,"is_archived":false,"color":"d4c5f9","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3732"},{"id":3733,"name":"Question","exclusive":false,"is_archived":false,"color":"fbca04","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3733"},{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fmilestones%3Flimit=50&page=1&state=all b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fmilestones%3Flimit=50&page=1&state=all deleted file mode 100644 index 56855b5788..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fmilestones%3Flimit=50&page=1&state=all +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Frame-Options: SAMEORIGIN -X-Total-Count: 2 -Content-Type: application/json;charset=utf-8 -Content-Length: 453 -Vary: Origin -X-Content-Type-Options: nosniff - -[{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments deleted file mode 100644 index c8cb26c4d1..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1770%2Fcomments +++ /dev/null @@ -1,8 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Content-Length: 1211 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN - -[{"id":116561,"body":"is one `\\newline` to less?","user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"resolver":null,"pull_request_review_id":1770,"created_at":"2020-09-01T16:12:58Z","updated_at":"2024-06-03T01:18:36Z","path":"README.md","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","original_commit_id":"","diff_hunk":"@@ -2,3 +2,3 @@\n \n-Test repository for testing migration from gitea 2 gitea\n\\ No newline at end of file\n+Test repository for testing migration from gitea 2 gitea","position":4,"original_position":0,"html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116561","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1771%2Fcomments b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1771%2Fcomments deleted file mode 100644 index 192224be31..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1771%2Fcomments +++ /dev/null @@ -1,8 +0,0 @@ -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 -Content-Length: 3 -Cache-Control: max-age=0, private, must-revalidate, no-transform - -[] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1772%2Fcomments b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1772%2Fcomments deleted file mode 100644 index 5652a52001..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%2F1772%2Fcomments +++ /dev/null @@ -1,8 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Content-Length: 3 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN - -[] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1 deleted file mode 100644 index 6aa650bd9c..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%2F7%2Freviews%3Flimit=50&page=1 +++ /dev/null @@ -1,9 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -X-Content-Type-Options: nosniff -Content-Type: application/json;charset=utf-8 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Frame-Options: SAMEORIGIN -X-Total-Count: 3 - -[{"id":1770,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"team":null,"state":"COMMENT","body":"","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":1,"submitted_at":"2020-09-01T16:12:58Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116562","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1771,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"REQUEST_CHANGES","body":"I think this needs some changes","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":false,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:06:47Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116563","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"},{"id":1772,"user":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"team":null,"state":"APPROVED","body":"looks good","commit_id":"187ece0cb6631e2858a6872e5733433bb3ca3b03","stale":false,"official":true,"dismissed":true,"comments_count":0,"submitted_at":"2020-09-01T17:19:51Z","updated_at":"2021-04-18T22:00:49Z","html_url":"https://gitea.com/gitea/test_repo/pulls/7#issuecomment-116564","pull_request_url":"https://gitea.com/gitea/test_repo/pulls/7"}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all deleted file mode 100644 index 256c67cc1a..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=3&page=1&state=all +++ /dev/null @@ -1,10 +0,0 @@ -Access-Control-Expose-Headers: Link, X-Total-Count -Link: ; rel="next",; rel="last" -Vary: Origin -Content-Type: application/json;charset=utf-8 -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -X-Total-Count: 6 - -[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all deleted file mode 100644 index e3a86c5b54..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Fpulls%3Flimit=50&page=1&state=all +++ /dev/null @@ -1,9 +0,0 @@ -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Total-Count: 6 -Content-Type: application/json;charset=utf-8 -X-Frame-Options: SAMEORIGIN - -[{"id":4955,"url":"https://gitea.com/gitea/test_repo/pulls/13","number":13,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"extend","body":"","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":true,"comments":1,"review_comments":0,"additions":1,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/13","diff_url":"https://gitea.com/gitea/test_repo/pulls/13.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/13.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"6543-patch-1","ref":"6543-patch-1","sha":"0ba7693bfd50d26df7f1b7414e937786c5efb05d","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","due_date":null,"created_at":"2020-09-01T18:03:54Z","updated_at":"2020-09-01T18:04:26Z","closed_at":null,"pin_order":0},{"id":4954,"url":"https://gitea.com/gitea/test_repo/pulls/12","number":12,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Dont Touch","body":"\r\nadd dont touch note","labels":[],"milestone":{"id":1301,"title":"V2 Finalize","description":"","state":"open","open_issues":1,"closed_issues":2,"created_at":"1970-01-01T00:00:00Z","updated_at":"2022-11-13T05:29:15Z","closed_at":null,"due_on":"2020-09-04T23:59:59Z"},"assignee":{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"},"assignees":[{"id":9,"login":"techknowlogick","login_name":"","source_id":0,"full_name":"","email":"techknowlogick@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/9b588dd0b384d6f6ae841c5d62302033","html_url":"https://gitea.com/techknowlogick","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-01-14T06:48:35Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"","visibility":"public","followers_count":11,"following_count":1,"starred_repos_count":4,"username":"techknowlogick"}],"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":3,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/12","diff_url":"https://gitea.com/gitea/test_repo/pulls/12.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/12.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:55:34Z","merge_commit_sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"Add-Dont-Touch-Note","ref":"refs/pull/12/head","sha":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:52:39Z","updated_at":"2020-09-02T05:10:25Z","closed_at":"2020-09-01T17:55:33Z","pin_order":0},{"id":4953,"url":"https://gitea.com/gitea/test_repo/pulls/11","number":11,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add-xkcd-2199","body":"","labels":[{"id":3734,"name":"Valid","exclusive":false,"is_archived":false,"color":"53e917","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3734"}],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"open","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":0,"deletions":0,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/11","diff_url":"https://gitea.com/gitea/test_repo/pulls/11.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/11.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"add-xkcd-2199","ref":"add-xkcd-2199","sha":"6bbd02573205288faa95d25e917812b2815a37e5","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"b6ab5d9ae000b579a5fff03f92c486da4ddf48b6","due_date":null,"created_at":"2020-09-01T17:52:28Z","updated_at":"2020-09-01T17:52:29Z","closed_at":null,"pin_order":0},{"id":4952,"url":"https://gitea.com/gitea/test_repo/pulls/8","number":8,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"add garbage for close pull","body":"well you'll see","labels":[],"milestone":null,"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":2,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/8","diff_url":"https://gitea.com/gitea/test_repo/pulls/8.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/8.patch","mergeable":true,"merged":false,"merged_at":null,"merge_commit_sha":null,"merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"garbage-patch","ref":"refs/pull/8/head","sha":"a3427235639a33d2d749e76f076e7619acc75341","repo_id":16280,"repo":{"id":16280,"owner":{"id":9756,"login":"6543-forks","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/c3948ab3b9b62e070e87a22681909dee","html_url":"https://gitea.com/6543-forks","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2020-09-01T17:33:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"https://codeberg.org/forgejo/forgejo/","description":"@6543's fork org","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"6543-forks"},"name":"test_repo","full_name":"6543-forks/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":true,"template":false,"parent":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null},"mirror":false,"size":67,"language":"","languages_url":"https://gitea.com/api/v1/repos/6543-forks/test_repo/languages","html_url":"https://gitea.com/6543-forks/test_repo","url":"https://gitea.com/api/v1/repos/6543-forks/test_repo","link":"","ssh_url":"git@gitea.com:6543-forks/test_repo.git","clone_url":"https://gitea.com/6543-forks/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":0,"forks_count":0,"watchers_count":1,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"master","archived":false,"created_at":"2020-09-01T17:39:26Z","updated_at":"2020-09-01T17:57:07Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":false,"has_wiki":false,"has_pull_requests":false,"has_projects":false,"projects_mode":"all","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":false,"allow_rebase":false,"allow_rebase_explicit":false,"allow_squash_merge":false,"allow_fast_forward_only_merge":false,"allow_rebase_update":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":[],"licenses":null}},"merge_base":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","due_date":null,"created_at":"2020-09-01T17:43:20Z","updated_at":"2020-09-01T17:48:41Z","closed_at":"2020-09-01T17:48:29Z","pin_order":0},{"id":4951,"url":"https://gitea.com/gitea/test_repo/pulls/7","number":7,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Prepare for Release V1","body":"@techknowlogick you might have a look at it?\n\nclose #6","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":1,"review_comments":3,"additions":3,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/7","diff_url":"https://gitea.com/gitea/test_repo/pulls/7.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/7.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T17:26:02Z","merge_commit_sha":"d9e165e4c7ab6b701f0205d0ffb637e5d2856297","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"prepare-v1","ref":"refs/pull/7/head","sha":"187ece0cb6631e2858a6872e5733433bb3ca3b03","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","due_date":null,"created_at":"2020-09-01T16:10:04Z","updated_at":"2020-09-01T17:26:08Z","closed_at":"2020-09-01T17:26:02Z","pin_order":0},{"id":4949,"url":"https://gitea.com/gitea/test_repo/pulls/3","number":3,"user":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@obermui.de","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"title":"Readme: use '2'","body":"","labels":[{"id":3735,"name":"Enhancement","exclusive":false,"is_archived":false,"color":"207de5","description":"","url":"https://gitea.com/api/v1/repos/gitea/test_repo/labels/3735"}],"milestone":{"id":1300,"title":"V1","description":"Generate Content","state":"closed","open_issues":0,"closed_issues":4,"created_at":"1970-01-01T00:00:00Z","updated_at":"1970-01-01T00:00:00Z","closed_at":"2020-09-01T18:36:46Z","due_on":null},"assignee":null,"assignees":null,"requested_reviewers":null,"requested_reviewers_teams":null,"state":"closed","draft":false,"is_locked":false,"comments":0,"review_comments":0,"additions":1,"deletions":1,"changed_files":1,"html_url":"https://gitea.com/gitea/test_repo/pulls/3","diff_url":"https://gitea.com/gitea/test_repo/pulls/3.diff","patch_url":"https://gitea.com/gitea/test_repo/pulls/3.patch","mergeable":true,"merged":true,"merged_at":"2020-09-01T00:27:14Z","merge_commit_sha":"9396b697d905d1bcb5380befdf4d7e52c6a7ceb2","merged_by":null,"allow_maintainer_edit":false,"base":{"label":"master","ref":"master","sha":"827aa28a907853e5ddfa40c8f9bc52471a2685fd","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"head":{"label":"readme_nit","ref":"refs/pull/3/head","sha":"c273a16d4c3b2d745df690005dabe79cc6504ac3","repo_id":16268,"repo":{"id":16268,"owner":{"id":3,"login":"gitea","login_name":"","source_id":0,"full_name":"","email":"","avatar_url":"https://gitea.com/avatars/35dea380390772b3130aafbac7ca49e6","html_url":"https://gitea.com/gitea","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2018-11-29T03:16:17Z","restricted":false,"active":false,"prohibit_login":false,"location":"Git Universe","website":"https://codeberg.org/forgejo/forgejo/","description":"Git with a cup of tea","visibility":"public","followers_count":53,"following_count":0,"starred_repos_count":0,"username":"gitea"},"name":"test_repo","full_name":"gitea/test_repo","description":"Test repository for testing migration from gitea to gitea","empty":false,"private":false,"fork":false,"template":false,"parent":null,"mirror":false,"size":68,"language":"","languages_url":"https://gitea.com/api/v1/repos/gitea/test_repo/languages","html_url":"https://gitea.com/gitea/test_repo","url":"https://gitea.com/api/v1/repos/gitea/test_repo","link":"","ssh_url":"git@gitea.com:gitea/test_repo.git","clone_url":"https://gitea.com/gitea/test_repo.git","original_url":"","website":"https://codeberg.org/forgejo/forgejo/","stars_count":1,"forks_count":2,"watchers_count":9,"open_issues_count":2,"open_pr_counter":2,"release_counter":2,"default_branch":"master","archived":false,"created_at":"2020-09-01T00:12:27Z","updated_at":"2020-09-01T18:03:41Z","archived_at":"1970-01-01T00:00:00Z","permissions":{"admin":false,"push":false,"pull":true},"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"","has_releases":true,"has_packages":false,"has_actions":false,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":false,"allow_rebase_update":true,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":false,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","repo_transfer":null,"topics":["gitea","test","migration","ci"],"licenses":null}},"merge_base":"a016fd754759b2cdfe5cad1cdf638c7e6b281940","due_date":null,"created_at":"2020-09-01T00:27:03Z","updated_at":"2020-09-01T15:54:30Z","closed_at":"2020-09-01T00:27:14Z","pin_order":0}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1 deleted file mode 100644 index bfd164ac2a..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Freleases%3Flimit=50&page=1 +++ /dev/null @@ -1,9 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Vary: Origin -X-Frame-Options: SAMEORIGIN -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -X-Content-Type-Options: nosniff -X-Total-Count: 2 - -[{"id":167250,"tag_name":"v2-rc1","target_commitish":"master","name":"Second Release","body":"this repo has:\r\n* reactions\r\n* wiki\r\n* issues (open/closed)\r\n* pulls (open/closed/merged) (external/internal)\r\n* pull reviews\r\n* projects\r\n* milestones\r\n* labels\r\n* releases\r\n\r\nto test migration against","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250","html_url":"https://gitea.com/gitea/test_repo/releases/tag/v2-rc1","tarball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/v2-rc1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167250/assets","draft":false,"prerelease":true,"created_at":"2020-09-01T18:02:43Z","published_at":"2020-09-01T18:02:43Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]},{"id":167249,"tag_name":"V1","target_commitish":"master","name":"First Release","body":"as title","url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249","html_url":"https://gitea.com/gitea/test_repo/releases/tag/V1","tarball_url":"https://gitea.com/gitea/test_repo/archive/V1.tar.gz","zipball_url":"https://gitea.com/gitea/test_repo/archive/V1.zip","upload_url":"https://gitea.com/api/v1/repos/gitea/test_repo/releases/167249/assets","draft":false,"prerelease":false,"created_at":"2020-09-01T17:30:32Z","published_at":"2020-09-01T17:30:32Z","author":{"id":689,"login":"6543","login_name":"","source_id":0,"full_name":"","email":"6543@noreply.gitea.com","avatar_url":"https://gitea.com/avatars/aeb6c290f1988daefa7421c5409e80dc","html_url":"https://gitea.com/6543","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2019-07-17T21:08:41Z","restricted":false,"active":false,"prohibit_login":false,"location":"Germany","website":"https://codeberg.org/forgejo/forgejo/","description":"gitea instance: https://code.obermui.de","visibility":"public","followers_count":10,"following_count":7,"starred_repos_count":18,"username":"6543"},"assets":[]}] diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Ftopics%3Flimit=0&page=1 b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Ftopics%3Flimit=0&page=1 deleted file mode 100644 index 4d1cf9e322..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Frepos%2Fgitea%2Ftest_repo%2Ftopics%3Flimit=0&page=1 +++ /dev/null @@ -1,10 +0,0 @@ -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -X-Total-Count: 4 -Content-Length: 45 -Access-Control-Expose-Headers: X-Total-Count -Cache-Control: max-age=0, private, must-revalidate, no-transform -Content-Type: application/json;charset=utf-8 - -{"topics":["ci","gitea","migration","test"]} diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi deleted file mode 100644 index f16a0a33c8..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fsettings%2Fapi +++ /dev/null @@ -1,8 +0,0 @@ -Content-Type: application/json;charset=utf-8 -Content-Length: 117 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN - -{"max_response_items":50,"default_paging_num":30,"default_git_trees_per_page":1000,"default_max_blob_size":10485760} diff --git a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fversion b/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fversion deleted file mode 100644 index 739d679c0d..0000000000 --- a/services/migrations/testdata/gitea/full_download/GET_%2Fapi%2Fv1%2Fversion +++ /dev/null @@ -1,8 +0,0 @@ -Content-Length: 41 -Cache-Control: max-age=0, private, must-revalidate, no-transform -Vary: Origin -X-Content-Type-Options: nosniff -X-Frame-Options: SAMEORIGIN -Content-Type: application/json;charset=utf-8 - -{"version":"1.23.0+dev-608-gec2d1593c2"} diff --git a/services/migrations/testdata/github/full_download/GET_%2Frate_limit b/services/migrations/testdata/github/full_download/GET_%2Frate_limit deleted file mode 100644 index 74e43a0765..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frate_limit +++ /dev/null @@ -1,23 +0,0 @@ -Cache-Control: no-cache -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Ratelimit-Reset: 1730800941 -Access-Control-Allow-Origin: * -Content-Type: application/json; charset=utf-8 -X-Oauth-Scopes: -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Remaining: 4899 -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' -X-Accepted-Oauth-Scopes: -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Frame-Options: deny -X-Content-Type-Options: nosniff -Vary: Accept-Encoding, Accept, X-Requested-With -X-Github-Request-Id: C7CC:3118FC:3F6234D:4038C5B:6729E6C0 -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Used: 101 -X-Ratelimit-Resource: core - -{"resources":{"core":{"limit":5000,"used":101,"remaining":4899,"reset":1730800941},"search":{"limit":30,"used":0,"remaining":30,"reset":1730799356},"graphql":{"limit":5000,"used":162,"remaining":4838,"reset":1730801064},"integration_manifest":{"limit":5000,"used":0,"remaining":5000,"reset":1730802896},"source_import":{"limit":100,"used":0,"remaining":100,"reset":1730799356},"code_scanning_upload":{"limit":1000,"used":0,"remaining":1000,"reset":1730802896},"actions_runner_registration":{"limit":10000,"used":0,"remaining":10000,"reset":1730802896},"scim":{"limit":15000,"used":0,"remaining":15000,"reset":1730802896},"dependency_snapshots":{"limit":100,"used":0,"remaining":100,"reset":1730799356},"audit_log":{"limit":1750,"used":0,"remaining":1750,"reset":1730802896},"audit_log_streaming":{"limit":15,"used":0,"remaining":15,"reset":1730802896},"code_search":{"limit":10,"used":0,"remaining":10,"reset":1730799356}},"rate":{"limit":5000,"used":101,"remaining":4899,"reset":1730800941}} \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo deleted file mode 100644 index 78fde4d424..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo +++ /dev/null @@ -1,25 +0,0 @@ -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Resource: core -Access-Control-Allow-Origin: * -X-Github-Request-Id: C7CC:3118FC:3F5EFD7:403585D:6729E6B3 -Cache-Control: private, max-age=60, s-maxage=60 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Media-Type: github.v3; param=scarlet-witch-preview; format=json, github.mercy-preview; param=baptiste-preview.nebula-preview; format=json -Etag: W/"bb1c9e0186e52dbd9f2c34aaf0827517384a15fd0cee7b81ad13784901db15c0" -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -X-Ratelimit-Limit: 5000 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Content-Type-Options: nosniff -Content-Type: application/json; charset=utf-8 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Last-Modified: Thu, 02 Mar 2023 14:02:26 GMT -X-Ratelimit-Remaining: 4928 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Used: 72 -X-Frame-Options: deny -Content-Security-Policy: default-src 'none' - -{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master","permissions":{"admin":false,"maintain":false,"push":false,"triage":false,"pull":true},"temp_clone_token":"","custom_properties":{},"organization":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"network_count":6,"subscribers_count":6} diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2 deleted file mode 100644 index f1f9afee15..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=1&per_page=2 +++ /dev/null @@ -1,24 +0,0 @@ -Cache-Control: private, max-age=60, s-maxage=60 -X-Ratelimit-Remaining: 4923 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Accepted-Oauth-Scopes: repo -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Resource: core -Content-Security-Policy: default-src 'none' -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Used: 77 -Access-Control-Allow-Origin: * -X-Xss-Protection: 0 -X-Github-Request-Id: C7CC:3118FC:3F5F8DA:403618E:6729E6B6 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Type: application/json; charset=utf-8 -Etag: W/"07b6d56c5fdc728f96fceef3d45d26b4ebac96ef5138156668055f7d496c9a75" -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Frame-Options: deny -X-Content-Type-Options: nosniff - -[{"id":55441655,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0MTY1NQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T20:22:13Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2 deleted file mode 100644 index fe993d3c3b..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F1%2Freactions%3Fpage=2&per_page=2 +++ /dev/null @@ -1,26 +0,0 @@ -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Github-Api-Version-Selected: 2022-11-28 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -Content-Type: application/json; charset=utf-8 -Content-Length: 2 -Cache-Control: private, max-age=60, s-maxage=60 -Link: ; rel="prev", ; rel="last", ; rel="first" -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4922 -X-Ratelimit-Reset: 1730800941 -X-Xss-Protection: 0 -X-Github-Request-Id: C7CC:3118FC:3F5FA7C:403633C:6729E6B6 -X-Oauth-Scopes: -X-Ratelimit-Used: 78 -X-Frame-Options: deny -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Accepted-Oauth-Scopes: repo -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Content-Security-Policy: default-src 'none' - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created deleted file mode 100644 index 61867c5ae6..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Fcomments%3Fdirection=asc&per_page=100&sort=created +++ /dev/null @@ -1,24 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Remaining: 4917 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Type: application/json; charset=utf-8 -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Used: 83 -X-Content-Type-Options: nosniff -X-Github-Request-Id: C7CC:3118FC:3F60409:4036CD0:6729E6B8 -Etag: W/"5f4d715f2578719997e324fe7b29e7eeeec048288237b44d4f320666514813ad" -X-Accepted-Oauth-Scopes: -X-Frame-Options: deny -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Content-Security-Policy: default-src 'none' -Cache-Control: private, max-age=60, s-maxage=60 -X-Oauth-Scopes: - -[{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553111966","html_url":"https://github.com/go-gitea/test_repo/issues/2#issuecomment-553111966","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","id":553111966,"node_id":"MDEyOklzc3VlQ29tbWVudDU1MzExMTk2Ng==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2019-11-12T21:00:13Z","updated_at":"2019-11-12T21:00:13Z","author_association":"MEMBER","body":"This is a comment","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553111966/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553138856","html_url":"https://github.com/go-gitea/test_repo/issues/2#issuecomment-553138856","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","id":553138856,"node_id":"MDEyOklzc3VlQ29tbWVudDU1MzEzODg1Ng==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"created_at":"2019-11-12T22:07:14Z","updated_at":"2019-11-12T22:07:14Z","author_association":"MEMBER","body":"A second comment","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments/553138856/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"performed_via_github_app":null}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2 deleted file mode 100644 index bb9dea395c..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=1&per_page=2 +++ /dev/null @@ -1,25 +0,0 @@ -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -X-Accepted-Oauth-Scopes: repo -Link: ; rel="next", ; rel="last" -X-Ratelimit-Remaining: 4921 -X-Ratelimit-Reset: 1730800941 -X-Github-Request-Id: C7CC:3118FC:3F5FC1A:40364D4:6729E6B6 -Content-Security-Policy: default-src 'none' -X-Oauth-Scopes: -X-Ratelimit-Used: 79 -X-Frame-Options: deny -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Api-Version-Selected: 2022-11-28 -Content-Type: application/json; charset=utf-8 -Etag: W/"27408cb5dd95878d6267de226341c84fd1d2c49695867baecf930579608e16a5" -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Content-Type-Options: nosniff -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Limit: 5000 -Access-Control-Allow-Origin: * - -[{"id":55445108,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTEwOA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"heart","created_at":"2019-11-12T21:02:05Z"},{"id":55445150,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE1MA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"laugh","created_at":"2019-11-12T21:02:35Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2 deleted file mode 100644 index e59fc93546..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=2&per_page=2 +++ /dev/null @@ -1,25 +0,0 @@ -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Resource: core -X-Frame-Options: deny -Etag: W/"cb64a4e91ab70a1ab9fe2f77cdbf7452120169f4c2cce397014efe94cc0d60bb" -Link: ; rel="prev", ; rel="next", ; rel="last", ; rel="first" -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Request-Id: C7CC:3118FC:3F5FDBD:4036670:6729E6B7 -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Access-Control-Allow-Origin: * -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4920 -X-Ratelimit-Used: 80 -X-Accepted-Oauth-Scopes: repo - -[{"id":55445169,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE2OQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"-1","created_at":"2019-11-12T21:02:47Z"},{"id":55445177,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE3Nw==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"confused","created_at":"2019-11-12T21:02:52Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2 deleted file mode 100644 index 57f03c8a64..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=3&per_page=2 +++ /dev/null @@ -1,25 +0,0 @@ -Etag: W/"17b0dca978a885d2234548248a7d5c22264c161b73e28c5cd144e33a24dd9ed4" -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Used: 81 -Content-Security-Policy: default-src 'none' -Content-Type: application/json; charset=utf-8 -X-Oauth-Scopes: -Link: ; rel="prev", ; rel="first" -X-Ratelimit-Limit: 5000 -X-Frame-Options: deny -X-Content-Type-Options: nosniff -X-Accepted-Oauth-Scopes: repo -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -Access-Control-Allow-Origin: * -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Remaining: 4919 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Github-Request-Id: C7CC:3118FC:3F5FF70:403681F:6729E6B7 - -[{"id":55445188,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTE4OA==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"hooray","created_at":"2019-11-12T21:02:58Z"},{"id":55445441,"node_id":"MDEzOklzc3VlUmVhY3Rpb241NTQ0NTQ0MQ==","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?u=7c1ba931adbdd9bab5be1a41d244425d463568cd&v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T21:06:04Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2 deleted file mode 100644 index f14d4ba904..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F2%2Freactions%3Fpage=4&per_page=2 +++ /dev/null @@ -1,26 +0,0 @@ -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4918 -X-Ratelimit-Reset: 1730800941 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -X-Github-Request-Id: C7CC:3118FC:3F60229:4036AE8:6729E6B8 -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -Link: ; rel="prev", ; rel="last", ; rel="first" -X-Accepted-Oauth-Scopes: repo -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Used: 82 -X-Frame-Options: deny -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Cache-Control: private, max-age=60, s-maxage=60 -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Resource: core -Access-Control-Allow-Origin: * -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Type: application/json; charset=utf-8 -Content-Length: 2 -Content-Security-Policy: default-src 'none' - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2 deleted file mode 100644 index a7a105b3e7..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F3%2Freactions%3Fpage=1&per_page=2 +++ /dev/null @@ -1,25 +0,0 @@ -X-Ratelimit-Used: 88 -X-Ratelimit-Resource: core -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F60B4F:403741E:6729E6BA -Content-Type: application/json; charset=utf-8 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Reset: 1730800941 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Cache-Control: private, max-age=60, s-maxage=60 -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Frame-Options: deny -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4912 -Content-Length: 2 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2 deleted file mode 100644 index f5398c3a9f..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=1&per_page=2 +++ /dev/null @@ -1,24 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Etag: W/"dc9d10e1714eadc1507466c7d11d2dd84ae539a378835f8763b9948da44b22e1" -X-Accepted-Oauth-Scopes: repo -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -X-Frame-Options: deny -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Reset: 1730800941 -Content-Type: application/json; charset=utf-8 -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Remaining: 4911 -X-Ratelimit-Used: 89 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F60D0F:40375F2:6729E6BB -Cache-Control: private, max-age=60, s-maxage=60 -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core - -[{"id":59496724,"node_id":"MDEzOklzc3VlUmVhY3Rpb241OTQ5NjcyNA==","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"heart","created_at":"2020-01-10T08:31:30Z"},{"id":59496731,"node_id":"MDEzOklzc3VlUmVhY3Rpb241OTQ5NjczMQ==","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2020-01-10T08:31:39Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2 deleted file mode 100644 index 79b506ea55..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2F4%2Freactions%3Fpage=2&per_page=2 +++ /dev/null @@ -1,26 +0,0 @@ -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -X-Ratelimit-Limit: 5000 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Length: 2 -Cache-Control: private, max-age=60, s-maxage=60 -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -X-Ratelimit-Remaining: 4910 -X-Ratelimit-Reset: 1730800941 -X-Frame-Options: deny -Content-Type: application/json; charset=utf-8 -Link: ; rel="prev", ; rel="last", ; rel="first" -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Request-Id: C7CC:3118FC:3F60EE6:40377B6:6729E6BB -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Used: 90 -X-Ratelimit-Resource: core -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Github-Api-Version-Selected: 2022-11-28 -Access-Control-Allow-Origin: * - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100 deleted file mode 100644 index b55068a718..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=1&per_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Accepted-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Used: 84 -X-Ratelimit-Resource: core -X-Content-Type-Options: nosniff -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"d2410fc0792a61666c06ed757aa53a273165d4f14f7d5259095b7a4f3a959121" -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Remaining: 4916 -X-Frame-Options: deny -X-Github-Request-Id: C7CC:3118FC:3F60583:4036E51:6729E6B9 -Content-Type: application/json; charset=utf-8 -X-Ratelimit-Reset: 1730800941 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload - -[{"id":55446208,"node_id":"MDIwOklzc3VlQ29tbWVudFJlYWN0aW9uNTU0NDYyMDg=","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"content":"+1","created_at":"2019-11-12T21:13:22Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100 deleted file mode 100644 index 1e46f438e5..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553111966%2Freactions%3Fpage=2&per_page=100 +++ /dev/null @@ -1,26 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Cache-Control: private, max-age=60, s-maxage=60 -X-Ratelimit-Used: 85 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Request-Id: C7CC:3118FC:3F606F2:4036FB5:6729E6B9 -X-Xss-Protection: 0 -Content-Type: application/json; charset=utf-8 -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Oauth-Scopes: -Link: ; rel="prev", ; rel="last", ; rel="first" -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Resource: core -X-Frame-Options: deny -Content-Length: 2 -X-Accepted-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4915 -X-Ratelimit-Reset: 1730800941 -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100 deleted file mode 100644 index ac446b3586..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%2Fcomments%2F553138856%2Freactions%3Fpage=1&per_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Remaining: 4914 -X-Frame-Options: deny -X-Xss-Protection: 0 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Resource: core -X-Content-Type-Options: nosniff -Content-Type: application/json; charset=utf-8 -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Accepted-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -Content-Length: 2 -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F60858:4037116:6729E6B9 -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -X-Ratelimit-Used: 86 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all deleted file mode 100644 index 80d2f90dbc..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fissues%3Fdirection=asc&page=1&per_page=2&sort=created&state=all +++ /dev/null @@ -1,25 +0,0 @@ -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Type: application/json; charset=utf-8 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -Access-Control-Allow-Origin: * -X-Frame-Options: deny -X-Xss-Protection: 0 -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"40580a89c26a3f7793cea4e59315e52e1106be32ded27b3ab822b7d7f74a1ecf" -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Link: ; rel="next", ; rel="last" -X-Ratelimit-Reset: 1730800941 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Content-Type-Options: nosniff -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Remaining: 4924 -X-Ratelimit-Used: 76 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F5F5B9:4035E6C:6729E6B5 - -[{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/1","repository_url":"https://api.github.com/repos/go-gitea/test_repo","labels_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/comments","events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/events","html_url":"https://github.com/go-gitea/test_repo/issues/1","id":520479843,"node_id":"MDU6SXNzdWU1MjA0Nzk4NDM=","number":1,"title":"Please add an animated gif icon to the merge button","user":{"login":"guillep2k","id":18600385,"node_id":"MDQ6VXNlcjE4NjAwMzg1","avatar_url":"https://avatars.githubusercontent.com/u/18600385?v=4","gravatar_id":"","url":"https://api.github.com/users/guillep2k","html_url":"https://github.com/guillep2k","followers_url":"https://api.github.com/users/guillep2k/followers","following_url":"https://api.github.com/users/guillep2k/following{/other_user}","gists_url":"https://api.github.com/users/guillep2k/gists{/gist_id}","starred_url":"https://api.github.com/users/guillep2k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/guillep2k/subscriptions","organizations_url":"https://api.github.com/users/guillep2k/orgs","repos_url":"https://api.github.com/users/guillep2k/repos","events_url":"https://api.github.com/users/guillep2k/events{/privacy}","received_events_url":"https://api.github.com/users/guillep2k/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"},{"id":1667254261,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYx","url":"https://api.github.com/repos/go-gitea/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"comments":0,"created_at":"2019-11-09T17:00:29Z","updated_at":"2019-11-12T20:29:53Z","closed_at":"2019-11-12T20:22:22Z","author_association":"MEMBER","active_lock_reason":null,"body":"I just want the merge button to hurt my eyes a little. 😠","closed_by":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/go-gitea/test_repo/issues/1/timeline","performed_via_github_app":null,"state_reason":"completed"},{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/2","repository_url":"https://api.github.com/repos/go-gitea/test_repo","labels_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/comments","events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/events","html_url":"https://github.com/go-gitea/test_repo/issues/2","id":521799485,"node_id":"MDU6SXNzdWU1MjE3OTk0ODU=","number":2,"title":"Test issue","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"labels":[{"id":1667254257,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU3","url":"https://api.github.com/repos/go-gitea/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"comments":2,"created_at":"2019-11-12T21:00:06Z","updated_at":"2019-11-12T22:07:14Z","closed_at":"2019-11-12T21:01:31Z","author_association":"MEMBER","active_lock_reason":null,"body":"This is test issue 2, do not touch!","closed_by":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/reactions","total_count":6,"+1":1,"-1":1,"laugh":1,"hooray":1,"confused":1,"heart":1,"rocket":0,"eyes":0},"timeline_url":"https://api.github.com/repos/go-gitea/test_repo/issues/2/timeline","performed_via_github_app":null,"state_reason":"completed"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100 deleted file mode 100644 index f1d483aacb..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Flabels%3Fpage=1&per_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -X-Ratelimit-Reset: 1730800941 -Access-Control-Allow-Origin: * -Content-Security-Policy: default-src 'none' -X-Github-Api-Version-Selected: 2022-11-28 -Etag: W/"01cc307b238564f2a086999fed53e0d5c880b8ec1d8d2256d99188ff47ff0ea0" -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Used: 74 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Ratelimit-Limit: 5000 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Cache-Control: private, max-age=60, s-maxage=60 -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -X-Ratelimit-Remaining: 4926 -X-Frame-Options: deny -X-Content-Type-Options: nosniff -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Type: application/json; charset=utf-8 -X-Github-Request-Id: C7CC:3118FC:3F5F29C:4035B65:6729E6B4 - -[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"},{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"},{"id":1667254257,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU3","url":"https://api.github.com/repos/go-gitea/test_repo/labels/duplicate","name":"duplicate","color":"cfd3d7","default":true,"description":"This issue or pull request already exists"},{"id":1667254260,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYw","url":"https://api.github.com/repos/go-gitea/test_repo/labels/enhancement","name":"enhancement","color":"a2eeef","default":true,"description":"New feature or request"},{"id":1667254261,"node_id":"MDU6TGFiZWwxNjY3MjU0MjYx","url":"https://api.github.com/repos/go-gitea/test_repo/labels/good%20first%20issue","name":"good first issue","color":"7057ff","default":true,"description":"Good for newcomers"},{"id":1667254265,"node_id":"MDU6TGFiZWwxNjY3MjU0MjY1","url":"https://api.github.com/repos/go-gitea/test_repo/labels/help%20wanted","name":"help wanted","color":"008672","default":true,"description":"Extra attention is needed"},{"id":1667254269,"node_id":"MDU6TGFiZWwxNjY3MjU0MjY5","url":"https://api.github.com/repos/go-gitea/test_repo/labels/invalid","name":"invalid","color":"e4e669","default":true,"description":"This doesn't seem right"},{"id":1667254273,"node_id":"MDU6TGFiZWwxNjY3MjU0Mjcz","url":"https://api.github.com/repos/go-gitea/test_repo/labels/question","name":"question","color":"d876e3","default":true,"description":"Further information is requested"},{"id":1667254276,"node_id":"MDU6TGFiZWwxNjY3MjU0Mjc2","url":"https://api.github.com/repos/go-gitea/test_repo/labels/wontfix","name":"wontfix","color":"ffffff","default":true,"description":"This will not be worked on"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all deleted file mode 100644 index 50b90ad4ab..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fmilestones%3Fpage=1&per_page=100&state=all +++ /dev/null @@ -1,24 +0,0 @@ -X-Ratelimit-Remaining: 4927 -X-Ratelimit-Used: 73 -X-Frame-Options: deny -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: repo -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Content-Type-Options: nosniff -Content-Type: application/json; charset=utf-8 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -X-Github-Request-Id: C7CC:3118FC:3F5F16C:40359F7:6729E6B4 -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Reset: 1730800941 -Content-Security-Policy: default-src 'none' -X-Github-Api-Version-Selected: 2022-11-28 -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"d6d673f0622636217ee3df16cdabbfea8402d3e8d1abbabe007108267b01f3e9" - -[{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100 deleted file mode 100644 index 1b4481f890..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Frequested_reviewers%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Etag: W/"21730161122bd4f229e886dd4a85b45fa575182d6dcef7aa0016a5d21353c9ab" -X-Oauth-Scopes: -X-Github-Media-Type: github.v3; format=json -Access-Control-Allow-Origin: * -X-Frame-Options: deny -X-Content-Type-Options: nosniff -X-Xss-Protection: 0 -X-Github-Request-Id: C7CC:3118FC:3F6187A:4038171:6729E6BD -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Content-Security-Policy: default-src 'none' -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -X-Accepted-Oauth-Scopes: -X-Ratelimit-Remaining: 4905 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Used: 95 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload - -{"users":[],"teams":[]} \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100 deleted file mode 100644 index 435e1a0ee0..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315859956%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Used: 92 -X-Frame-Options: deny -X-Content-Type-Options: nosniff -Content-Length: 2 -X-Oauth-Scopes: -X-Ratelimit-Remaining: 4908 -X-Ratelimit-Reset: 1730800941 -X-Github-Request-Id: C7CC:3118FC:3F612D6:4037BAC:6729E6BC -Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665" -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Cache-Control: private, max-age=60, s-maxage=60 -X-Accepted-Oauth-Scopes: -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Security-Policy: default-src 'none' -Content-Type: application/json; charset=utf-8 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100 deleted file mode 100644 index 389c1b7567..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315860062%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -Content-Length: 2 -X-Frame-Options: deny -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Used: 93 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Type: application/json; charset=utf-8 -X-Accepted-Oauth-Scopes: -X-Xss-Protection: 0 -X-Oauth-Scopes: -X-Ratelimit-Remaining: 4907 -X-Ratelimit-Reset: 1730800941 -Access-Control-Allow-Origin: * -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Request-Id: C7CC:3118FC:3F614AA:4037DB7:6729E6BD -X-Github-Media-Type: github.v3; format=json -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665" - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100 deleted file mode 100644 index e52428a5af..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%2F315861440%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -X-Ratelimit-Reset: 1730800941 -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -X-Accepted-Oauth-Scopes: -X-Xss-Protection: 0 -X-Github-Request-Id: C7CC:3118FC:3F61690:4037F90:6729E6BD -Content-Length: 2 -X-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Frame-Options: deny -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Access-Control-Allow-Origin: * -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665" -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Remaining: 4906 -X-Ratelimit-Used: 94 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100 deleted file mode 100644 index 203c363ffa..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F3%2Freviews%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"e38ac3d6f3e77a469f9836bfa52a0b756b9ac8fdc4347530e1cb1072bbb77b46" -X-Github-Media-Type: github.v3; format=json -X-Frame-Options: deny -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Accepted-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Remaining: 4909 -X-Ratelimit-Reset: 1730800941 -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F6108F:403797A:6729E6BC -Content-Type: application/json; charset=utf-8 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -X-Content-Type-Options: nosniff -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Oauth-Scopes: -X-Ratelimit-Used: 91 -X-Xss-Protection: 0 - -[{"id":315859956,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODU5OTU2","user":{"login":"jolheiser","id":42128690,"node_id":"MDQ6VXNlcjQyMTI4Njkw","avatar_url":"https://avatars.githubusercontent.com/u/42128690?u=0ee1052506846129445fa12a76cd9ad9d305de71&v=4","gravatar_id":"","url":"https://api.github.com/users/jolheiser","html_url":"https://github.com/jolheiser","followers_url":"https://api.github.com/users/jolheiser/followers","following_url":"https://api.github.com/users/jolheiser/following{/other_user}","gists_url":"https://api.github.com/users/jolheiser/gists{/gist_id}","starred_url":"https://api.github.com/users/jolheiser/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jolheiser/subscriptions","organizations_url":"https://api.github.com/users/jolheiser/orgs","repos_url":"https://api.github.com/users/jolheiser/repos","events_url":"https://api.github.com/users/jolheiser/events{/privacy}","received_events_url":"https://api.github.com/users/jolheiser/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315859956","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315859956"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:35:24Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"},{"id":315860062,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODYwMDYy","user":{"login":"zeripath","id":1824502,"node_id":"MDQ6VXNlcjE4MjQ1MDI=","avatar_url":"https://avatars.githubusercontent.com/u/1824502?u=fcd8a9dba8714edf6ac3f87596eb72149911c720&v=4","gravatar_id":"","url":"https://api.github.com/users/zeripath","html_url":"https://github.com/zeripath","followers_url":"https://api.github.com/users/zeripath/followers","following_url":"https://api.github.com/users/zeripath/following{/other_user}","gists_url":"https://api.github.com/users/zeripath/gists{/gist_id}","starred_url":"https://api.github.com/users/zeripath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zeripath/subscriptions","organizations_url":"https://api.github.com/users/zeripath/orgs","repos_url":"https://api.github.com/users/zeripath/repos","events_url":"https://api.github.com/users/zeripath/events{/privacy}","received_events_url":"https://api.github.com/users/zeripath/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315860062","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"NONE","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315860062"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:35:36Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"},{"id":315861440,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzE1ODYxNDQw","user":{"login":"lafriks","id":165205,"node_id":"MDQ6VXNlcjE2NTIwNQ==","avatar_url":"https://avatars.githubusercontent.com/u/165205?u=efe2335d2197f524c25caa7abdfcb90b77eb8d98&v=4","gravatar_id":"","url":"https://api.github.com/users/lafriks","html_url":"https://github.com/lafriks","followers_url":"https://api.github.com/users/lafriks/followers","following_url":"https://api.github.com/users/lafriks/following{/other_user}","gists_url":"https://api.github.com/users/lafriks/gists{/gist_id}","starred_url":"https://api.github.com/users/lafriks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lafriks/subscriptions","organizations_url":"https://api.github.com/users/lafriks/orgs","repos_url":"https://api.github.com/users/lafriks/repos","events_url":"https://api.github.com/users/lafriks/events{/privacy}","received_events_url":"https://api.github.com/users/lafriks/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315861440","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/3#pullrequestreview-315861440"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"}},"submitted_at":"2019-11-12T21:38:00Z","commit_id":"076160cf0b039f13e5eff19619932d181269414b"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100 deleted file mode 100644 index 676e326094..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Frequested_reviewers%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4898 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F623DF:4038CEB:6729E6C0 -Etag: W/"21730161122bd4f229e886dd4a85b45fa575182d6dcef7aa0016a5d21353c9ab" -X-Accepted-Oauth-Scopes: -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Resource: core -Access-Control-Allow-Origin: * -X-Frame-Options: deny -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -X-Ratelimit-Used: 102 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Reset: 1730800941 -X-Content-Type-Options: nosniff - -{"users":[],"teams":[]} \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100 deleted file mode 100644 index 48e5b2c3d9..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338338740%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Access-Control-Allow-Origin: * -X-Content-Type-Options: nosniff -Content-Security-Policy: default-src 'none' -X-Ratelimit-Resource: core -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Accepted-Oauth-Scopes: -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Remaining: 4903 -X-Ratelimit-Reset: 1730800941 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Frame-Options: deny -X-Github-Request-Id: C7CC:3118FC:3F61BAA:40384A5:6729E6BE -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"ff77892df2ec7f6eb61416e0f384ce0a6e8fbbbc1287f5d09b1980ebe9856750" -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Used: 97 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Type: application/json; charset=utf-8 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -X-Oauth-Scopes: - -[{"id":363017488,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MzAxNzQ4OA==","url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488","pull_request_review_id":338338740,"diff_hunk":"@@ -1,2 +1,4 @@\n # test_repo\n Test repository for testing migration from github to gitea\n+","path":"README.md","position":3,"original_position":3,"commit_id":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"This is a good pull request.","created_at":"2020-01-04T05:33:06Z","updated_at":"2020-01-04T05:33:18Z","html_url":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363017488","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363017488"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"original_commit_id":"2be9101c543658591222acbee3eb799edfc3853d","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363017488/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100 deleted file mode 100644 index 4cc66424f0..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338339651%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -X-Github-Api-Version-Selected: 2022-11-28 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Frame-Options: deny -X-Content-Type-Options: nosniff -Cache-Control: private, max-age=60, s-maxage=60 -Etag: "450a1c087fec81e5b86092ff5372c3db8ca834c1e23c03c6b06ecca33cefd665" -X-Github-Media-Type: github.v3; format=json -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Ratelimit-Reset: 1730800941 -X-Xss-Protection: 0 -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -Access-Control-Allow-Origin: * -Content-Length: 2 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Ratelimit-Resource: core -Content-Security-Policy: default-src 'none' -X-Github-Request-Id: C7CC:3118FC:3F61EBA:40387A6:6729E6BF -Content-Type: application/json; charset=utf-8 -X-Ratelimit-Remaining: 4901 -X-Ratelimit-Used: 99 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100 deleted file mode 100644 index f13d4addc7..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%2F338349019%2Fcomments%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Etag: W/"f74a383d4c87ae26d218fc087bef2c41a12637dff81fd8642f59708adca1a14e" -X-Ratelimit-Remaining: 4900 -X-Content-Type-Options: nosniff -X-Ratelimit-Limit: 5000 -X-Ratelimit-Reset: 1730800941 -X-Xss-Protection: 0 -Content-Type: application/json; charset=utf-8 -X-Oauth-Scopes: -X-Accepted-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -Access-Control-Allow-Origin: * -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Frame-Options: deny -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Used: 100 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Github-Request-Id: C7CC:3118FC:3F62065:4038955:6729E6C0 -Content-Security-Policy: default-src 'none' -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin - -[{"id":363029944,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MzAyOTk0NA==","url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944","pull_request_review_id":338349019,"diff_hunk":"@@ -19,3 +19,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n+","path":"LICENSE","position":4,"original_position":4,"commit_id":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"test a single comment.","created_at":"2020-01-04T11:21:41Z","updated_at":"2020-01-04T11:21:41Z","html_url":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363029944","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#discussion_r363029944"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"original_commit_id":"2be9101c543658591222acbee3eb799edfc3853d","reactions":{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments/363029944/reactions","total_count":0,"+1":0,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0}}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100 deleted file mode 100644 index c4484e078a..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2F4%2Freviews%3Fper_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Cache-Control: private, max-age=60, s-maxage=60 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Media-Type: github.v3; format=json -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Reset: 1730800941 -X-Frame-Options: deny -X-Github-Request-Id: C7CC:3118FC:3F619C6:40382C4:6729E6BE -Access-Control-Allow-Origin: * -X-Content-Type-Options: nosniff -Content-Type: application/json; charset=utf-8 -X-Accepted-Oauth-Scopes: -X-Ratelimit-Used: 96 -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Etag: W/"a47623061be83c50d3932baf8c5961386d2d45c32c42b504122c9a1359efd515" -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Remaining: 4904 - -[{"id":338338740,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzM4NzQw","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"APPROVED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338338740","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338338740"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T05:33:18Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"},{"id":338339651,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzM5NjUx","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"Don't add more reviews","state":"CHANGES_REQUESTED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338339651","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338339651"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T06:07:06Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"},{"id":338349019,"node_id":"MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzM4MzQ5MDE5","user":{"login":"lunny","id":81045,"node_id":"MDQ6VXNlcjgxMDQ1","avatar_url":"https://avatars.githubusercontent.com/u/81045?u=99b64f0ca6ef63643c7583ab87dd31c52d28e673&v=4","gravatar_id":"","url":"https://api.github.com/users/lunny","html_url":"https://github.com/lunny","followers_url":"https://api.github.com/users/lunny/followers","following_url":"https://api.github.com/users/lunny/following{/other_user}","gists_url":"https://api.github.com/users/lunny/gists{/gist_id}","starred_url":"https://api.github.com/users/lunny/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lunny/subscriptions","organizations_url":"https://api.github.com/users/lunny/orgs","repos_url":"https://api.github.com/users/lunny/repos","events_url":"https://api.github.com/users/lunny/events{/privacy}","received_events_url":"https://api.github.com/users/lunny/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"","state":"COMMENTED","html_url":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338349019","pull_request_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","author_association":"MEMBER","_links":{"html":{"href":"https://github.com/go-gitea/test_repo/pull/4#pullrequestreview-338349019"},"pull_request":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"}},"submitted_at":"2020-01-04T11:21:41Z","commit_id":"2be9101c543658591222acbee3eb799edfc3853d"}] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100 deleted file mode 100644 index 748ae93381..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363017488%2Freactions%3Fpage=1&per_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Accepted-Oauth-Scopes: -X-Ratelimit-Remaining: 4902 -X-Ratelimit-Reset: 1730800941 -X-Ratelimit-Resource: core -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Access-Control-Allow-Origin: * -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -X-Github-Request-Id: C7CC:3118FC:3F61D73:4038667:6729E6BF -Content-Type: application/json; charset=utf-8 -X-Ratelimit-Limit: 5000 -Content-Length: 2 -Cache-Control: private, max-age=60, s-maxage=60 -X-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Used: 98 -X-Frame-Options: deny -X-Content-Type-Options: nosniff -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100 deleted file mode 100644 index 0b0ae88deb..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%2Fcomments%2F363029944%2Freactions%3Fpage=1&per_page=100 +++ /dev/null @@ -1,25 +0,0 @@ -X-Accepted-Oauth-Scopes: -X-Ratelimit-Remaining: 4899 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Length: 2 -X-Ratelimit-Used: 101 -Access-Control-Allow-Origin: * -X-Frame-Options: deny -X-Content-Type-Options: nosniff -X-Xss-Protection: 0 -Content-Security-Policy: default-src 'none' -Cache-Control: private, max-age=60, s-maxage=60 -Etag: "f87b0fd59e59458a9a808311324b873c6baf3fde861298a99de9986270dd4d79" -X-Oauth-Scopes: -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Limit: 5000 -X-Ratelimit-Reset: 1730800941 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Content-Type: application/json; charset=utf-8 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Github-Media-Type: github.v3; param=squirrel-girl-preview -X-Ratelimit-Resource: core -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Github-Request-Id: C7CC:3118FC:3F622AC:4038BA5:6729E6C0 - -[] \ No newline at end of file diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all deleted file mode 100644 index 30883cc283..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Fpulls%3Fdirection=asc&page=1&per_page=2&sort=created&state=all +++ /dev/null @@ -1,24 +0,0 @@ -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Used: 87 -X-Frame-Options: deny -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Remaining: 4913 -X-Ratelimit-Reset: 1730800941 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Security-Policy: default-src 'none' -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Oauth-Scopes: -X-Ratelimit-Limit: 5000 -X-Ratelimit-Resource: core -Access-Control-Allow-Origin: * -X-Github-Request-Id: C7CC:3118FC:3F6099B:403726B:6729E6BA -X-Xss-Protection: 0 -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -Etag: W/"fed37ab8ce0b78e713030ff3e601f540b7f71243ab788b477f6885119bd691c5" -X-Accepted-Oauth-Scopes: -X-Content-Type-Options: nosniff - -[{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3","id":340118745,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTE4NzQ1","html_url":"https://github.com/go-gitea/test_repo/pull/3","diff_url":"https://github.com/go-gitea/test_repo/pull/3.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/3.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3","number":3,"state":"closed","locked":false,"title":"Update README.md","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"add warning to readme","created_at":"2019-11-12T21:21:43Z","updated_at":"2019-11-12T21:39:28Z","closed_at":"2019-11-12T21:39:27Z","merged_at":"2019-11-12T21:39:27Z","merge_commit_sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254254,"node_id":"MDU6TGFiZWwxNjY3MjU0MjU0","url":"https://api.github.com/repos/go-gitea/test_repo/labels/documentation","name":"documentation","color":"0075ca","default":true,"description":"Improvements or additions to documentation"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2","html_url":"https://github.com/go-gitea/test_repo/milestone/2","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/2/labels","id":4839942,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0Mg==","number":2,"title":"1.1.0","description":"Milestone 1.1.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":0,"closed_issues":2,"state":"closed","created_at":"2019-11-12T19:37:25Z","updated_at":"2019-11-12T21:39:27Z","due_on":"2019-11-12T08:00:00Z","closed_at":"2019-11-12T19:45:46Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b","head":{"label":"mrsdizzie:master","ref":"master","sha":"076160cf0b039f13e5eff19619932d181269414b","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"72866af952e98d02a73003501836074b286a78f6","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/3"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/076160cf0b039f13e5eff19619932d181269414b"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null},{"url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4","id":340131577,"node_id":"MDExOlB1bGxSZXF1ZXN0MzQwMTMxNTc3","html_url":"https://github.com/go-gitea/test_repo/pull/4","diff_url":"https://github.com/go-gitea/test_repo/pull/4.diff","patch_url":"https://github.com/go-gitea/test_repo/pull/4.patch","issue_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4","number":4,"state":"open","locked":false,"title":"Test branch","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"body":"do not merge this PR","created_at":"2019-11-12T21:54:18Z","updated_at":"2020-01-04T11:30:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"565d1208f5fffdc1c5ae1a2436491eb9a5e4ebae","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1667254252,"node_id":"MDU6TGFiZWwxNjY3MjU0MjUy","url":"https://api.github.com/repos/go-gitea/test_repo/labels/bug","name":"bug","color":"d73a4a","default":true,"description":"Something isn't working"}],"milestone":{"url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1","html_url":"https://github.com/go-gitea/test_repo/milestone/1","labels_url":"https://api.github.com/repos/go-gitea/test_repo/milestones/1/labels","id":4839941,"node_id":"MDk6TWlsZXN0b25lNDgzOTk0MQ==","number":1,"title":"1.0.0","description":"Milestone 1.0.0","creator":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"open_issues":1,"closed_issues":1,"state":"closed","created_at":"2019-11-12T19:37:08Z","updated_at":"2019-11-12T21:56:17Z","due_on":"2019-11-11T08:00:00Z","closed_at":"2019-11-12T19:45:49Z"},"draft":false,"commits_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits","review_comments_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments","review_comment_url":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d","head":{"label":"mrsdizzie:test-branch","ref":"test-branch","sha":"2be9101c543658591222acbee3eb799edfc3853d","user":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"repo":{"id":221313794,"node_id":"MDEwOlJlcG9zaXRvcnkyMjEzMTM3OTQ=","name":"test_repo","full_name":"mrsdizzie/test_repo","private":false,"owner":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"html_url":"https://github.com/mrsdizzie/test_repo","description":"Test repository for testing migration from github to gitea","fork":true,"url":"https://api.github.com/repos/mrsdizzie/test_repo","forks_url":"https://api.github.com/repos/mrsdizzie/test_repo/forks","keys_url":"https://api.github.com/repos/mrsdizzie/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrsdizzie/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrsdizzie/test_repo/teams","hooks_url":"https://api.github.com/repos/mrsdizzie/test_repo/hooks","issue_events_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/mrsdizzie/test_repo/events","assignees_url":"https://api.github.com/repos/mrsdizzie/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/mrsdizzie/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/tags","blobs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrsdizzie/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/mrsdizzie/test_repo/languages","stargazers_url":"https://api.github.com/repos/mrsdizzie/test_repo/stargazers","contributors_url":"https://api.github.com/repos/mrsdizzie/test_repo/contributors","subscribers_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscribers","subscription_url":"https://api.github.com/repos/mrsdizzie/test_repo/subscription","commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrsdizzie/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrsdizzie/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrsdizzie/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/mrsdizzie/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrsdizzie/test_repo/merges","archive_url":"https://api.github.com/repos/mrsdizzie/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrsdizzie/test_repo/downloads","issues_url":"https://api.github.com/repos/mrsdizzie/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/mrsdizzie/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/mrsdizzie/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/mrsdizzie/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrsdizzie/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/mrsdizzie/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/mrsdizzie/test_repo/deployments","created_at":"2019-11-12T21:17:42Z","updated_at":"2019-11-12T21:18:46Z","pushed_at":"2019-11-12T21:53:39Z","git_url":"git://github.com/mrsdizzie/test_repo.git","ssh_url":"git@github.com:mrsdizzie/test_repo.git","clone_url":"https://github.com/mrsdizzie/test_repo.git","svn_url":"https://github.com/mrsdizzie/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":3,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":[],"visibility":"public","forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"go-gitea:master","ref":"master","sha":"f32b0a9dfd09a60f616f29158f772cedd89942d2","user":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"repo":{"id":220672974,"node_id":"MDEwOlJlcG9zaXRvcnkyMjA2NzI5NzQ=","name":"test_repo","full_name":"go-gitea/test_repo","private":false,"owner":{"login":"go-gitea","id":12724356,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyNzI0MzU2","avatar_url":"https://avatars.githubusercontent.com/u/12724356?v=4","gravatar_id":"","url":"https://api.github.com/users/go-gitea","html_url":"https://github.com/go-gitea","followers_url":"https://api.github.com/users/go-gitea/followers","following_url":"https://api.github.com/users/go-gitea/following{/other_user}","gists_url":"https://api.github.com/users/go-gitea/gists{/gist_id}","starred_url":"https://api.github.com/users/go-gitea/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-gitea/subscriptions","organizations_url":"https://api.github.com/users/go-gitea/orgs","repos_url":"https://api.github.com/users/go-gitea/repos","events_url":"https://api.github.com/users/go-gitea/events{/privacy}","received_events_url":"https://api.github.com/users/go-gitea/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/go-gitea/test_repo","description":"Test repository for testing migration from github to gitea","fork":false,"url":"https://api.github.com/repos/go-gitea/test_repo","forks_url":"https://api.github.com/repos/go-gitea/test_repo/forks","keys_url":"https://api.github.com/repos/go-gitea/test_repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-gitea/test_repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-gitea/test_repo/teams","hooks_url":"https://api.github.com/repos/go-gitea/test_repo/hooks","issue_events_url":"https://api.github.com/repos/go-gitea/test_repo/issues/events{/number}","events_url":"https://api.github.com/repos/go-gitea/test_repo/events","assignees_url":"https://api.github.com/repos/go-gitea/test_repo/assignees{/user}","branches_url":"https://api.github.com/repos/go-gitea/test_repo/branches{/branch}","tags_url":"https://api.github.com/repos/go-gitea/test_repo/tags","blobs_url":"https://api.github.com/repos/go-gitea/test_repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-gitea/test_repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-gitea/test_repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-gitea/test_repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-gitea/test_repo/statuses/{sha}","languages_url":"https://api.github.com/repos/go-gitea/test_repo/languages","stargazers_url":"https://api.github.com/repos/go-gitea/test_repo/stargazers","contributors_url":"https://api.github.com/repos/go-gitea/test_repo/contributors","subscribers_url":"https://api.github.com/repos/go-gitea/test_repo/subscribers","subscription_url":"https://api.github.com/repos/go-gitea/test_repo/subscription","commits_url":"https://api.github.com/repos/go-gitea/test_repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-gitea/test_repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-gitea/test_repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-gitea/test_repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-gitea/test_repo/contents/{+path}","compare_url":"https://api.github.com/repos/go-gitea/test_repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-gitea/test_repo/merges","archive_url":"https://api.github.com/repos/go-gitea/test_repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-gitea/test_repo/downloads","issues_url":"https://api.github.com/repos/go-gitea/test_repo/issues{/number}","pulls_url":"https://api.github.com/repos/go-gitea/test_repo/pulls{/number}","milestones_url":"https://api.github.com/repos/go-gitea/test_repo/milestones{/number}","notifications_url":"https://api.github.com/repos/go-gitea/test_repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-gitea/test_repo/labels{/name}","releases_url":"https://api.github.com/repos/go-gitea/test_repo/releases{/id}","deployments_url":"https://api.github.com/repos/go-gitea/test_repo/deployments","created_at":"2019-11-09T16:49:20Z","updated_at":"2023-03-02T14:02:26Z","pushed_at":"2019-11-12T21:54:19Z","git_url":"git://github.com/go-gitea/test_repo.git","ssh_url":"git@github.com:go-gitea/test_repo.git","clone_url":"https://github.com/go-gitea/test_repo.git","svn_url":"https://github.com/go-gitea/test_repo","homepage":"https://codeberg.org/forgejo/forgejo/","size":1,"stargazers_count":3,"watchers_count":3,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"has_discussions":false,"forks_count":6,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"allow_forking":true,"is_template":false,"web_commit_signoff_required":false,"topics":["gitea"],"visibility":"public","forks":6,"open_issues":2,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4"},"html":{"href":"https://github.com/go-gitea/test_repo/pull/4"},"issue":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4"},"comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-gitea/test_repo/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/go-gitea/test_repo/statuses/2be9101c543658591222acbee3eb799edfc3853d"}},"author_association":"MEMBER","auto_merge":null,"active_lock_reason":null}] diff --git a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100 b/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100 deleted file mode 100644 index 470f5c5769..0000000000 --- a/services/migrations/testdata/github/full_download/GET_%2Frepos%2Fgo-gitea%2Ftest_repo%2Freleases%3Fpage=1&per_page=100 +++ /dev/null @@ -1,24 +0,0 @@ -Access-Control-Allow-Origin: * -X-Frame-Options: deny -Etag: W/"2986c85fcc06cc478457abb86a88ac7f065b6861e873ae0eeb9ac16a22efca45" -X-Github-Api-Version-Selected: 2022-11-28 -X-Ratelimit-Used: 75 -X-Ratelimit-Resource: core -Content-Type: application/json; charset=utf-8 -Cache-Control: private, max-age=60, s-maxage=60 -Vary: Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With -X-Accepted-Oauth-Scopes: repo -X-Ratelimit-Limit: 5000 -X-Ratelimit-Reset: 1730800941 -Strict-Transport-Security: max-age=31536000; includeSubdomains; preload -X-Xss-Protection: 0 -Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin -Content-Security-Policy: default-src 'none' -X-Oauth-Scopes: -X-Github-Media-Type: github.v3; format=json -X-Ratelimit-Remaining: 4925 -Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset -X-Content-Type-Options: nosniff -X-Github-Request-Id: C7CC:3118FC:3F5F41A:4035CB2:6729E6B4 - -[{"url":"https://api.github.com/repos/go-gitea/test_repo/releases/21419432","assets_url":"https://api.github.com/repos/go-gitea/test_repo/releases/21419432/assets","upload_url":"https://uploads.github.com/repos/go-gitea/test_repo/releases/21419432/assets{?name,label}","html_url":"https://github.com/go-gitea/test_repo/releases/tag/v0.9.99","id":21419432,"author":{"login":"mrsdizzie","id":1669571,"node_id":"MDQ6VXNlcjE2Njk1NzE=","avatar_url":"https://avatars.githubusercontent.com/u/1669571?v=4","gravatar_id":"","url":"https://api.github.com/users/mrsdizzie","html_url":"https://github.com/mrsdizzie","followers_url":"https://api.github.com/users/mrsdizzie/followers","following_url":"https://api.github.com/users/mrsdizzie/following{/other_user}","gists_url":"https://api.github.com/users/mrsdizzie/gists{/gist_id}","starred_url":"https://api.github.com/users/mrsdizzie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrsdizzie/subscriptions","organizations_url":"https://api.github.com/users/mrsdizzie/orgs","repos_url":"https://api.github.com/users/mrsdizzie/repos","events_url":"https://api.github.com/users/mrsdizzie/events{/privacy}","received_events_url":"https://api.github.com/users/mrsdizzie/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"MDc6UmVsZWFzZTIxNDE5NDMy","tag_name":"v0.9.99","target_commitish":"master","name":"First Release","draft":false,"prerelease":false,"created_at":"2019-11-09T16:49:21Z","published_at":"2019-11-12T20:12:10Z","assets":[],"tarball_url":"https://api.github.com/repos/go-gitea/test_repo/tarball/v0.9.99","zipball_url":"https://api.github.com/repos/go-gitea/test_repo/zipball/v0.9.99","body":"A test release"}] \ No newline at end of file diff --git a/services/migrations/update.go b/services/migrations/update.go index 4d497c1e2e..4a49206f82 100644 --- a/services/migrations/update.go +++ b/services/migrations/update.go @@ -6,11 +6,11 @@ package migrations import ( "context" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" - "forgejo.org/services/externalaccount" + "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/structs" + "code.gitea.io/gitea/services/externalaccount" ) // UpdateMigrationPosterID updates all migrated repositories' issues and comments posterID diff --git a/services/mirror/mirror.go b/services/mirror/mirror.go index 6d871ad5ff..bc2d6711cf 100644 --- a/services/mirror/mirror.go +++ b/services/mirror/mirror.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" + quota_model "code.gitea.io/gitea/models/quota" + 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" ) // doMirrorSync causes this request to mirror itself diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go index a63cbcf40c..9f7ffb29c9 100644 --- a/services/mirror/mirror_pull.go +++ b/services/mirror/mirror_pull.go @@ -9,21 +9,21 @@ import ( "strings" "time" - repo_model "forgejo.org/models/repo" - system_model "forgejo.org/models/system" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - giturl "forgejo.org/modules/git/url" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/proxy" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + repo_model "code.gitea.io/gitea/models/repo" + system_model "code.gitea.io/gitea/models/system" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/git" + giturl "code.gitea.io/gitea/modules/git/url" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/proxy" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" ) // gitShortEmptySha Git short empty SHA @@ -40,7 +40,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error repoPath := m.GetRepository(ctx).RepoPath() // Remove old remote _, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: repoPath}) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { return err } @@ -51,7 +51,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, addr, repoPath)) } _, _, err = cmd.RunStdString(&git.RunOpts{Dir: repoPath}) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { return err } @@ -60,7 +60,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error wikiRemotePath := repo_module.WikiRemoteURL(ctx, addr) // Remove old remote of wiki _, _, err = git.NewCommand(ctx, "remote", "rm").AddDynamicArguments(remoteName).RunStdString(&git.RunOpts{Dir: wikiPath}) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { return err } @@ -71,7 +71,7 @@ func UpdateAddress(ctx context.Context, m *repo_model.Mirror, addr string) error cmd.SetDescription(fmt.Sprintf("remote add %s --mirror=fetch %s [repo_path: %s]", remoteName, wikiRemotePath, wikiPath)) } _, _, err = cmd.RunStdString(&git.RunOpts{Dir: wikiPath}) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { return err } } @@ -96,7 +96,6 @@ type mirrorSyncResult struct { /* // * [new tag] v0.1.8 -> v0.1.8 // * [new branch] master -> origin/master -// * [new ref] refs/pull/2/head -> refs/pull/2/head" // - [deleted] (none) -> origin/test // delete a branch // - [deleted] (none) -> 1 // delete a tag // 957a993..a87ba5f test -> origin/test @@ -127,17 +126,10 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult { refName: git.RefNameFromBranch(refName), oldCommitID: gitShortEmptySha, }) - case strings.HasPrefix(lines[i], " * [new ref]"): // new reference - results = append(results, &mirrorSyncResult{ - refName: git.RefName(refName), - oldCommitID: gitShortEmptySha, - }) case strings.HasPrefix(lines[i], " - "): // Delete reference isTag := !strings.HasPrefix(refName, remoteName+"/") var refFullName git.RefName - if strings.HasPrefix(refName, "refs/") { - refFullName = git.RefName(refName) - } else if isTag { + if isTag { refFullName = git.RefNameFromTag(refName) } else { refFullName = git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")) @@ -160,15 +152,8 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult { log.Error("Expect two SHAs but not what found: %q", lines[i]) continue } - var refFullName git.RefName - if strings.HasPrefix(refName, "refs/") { - refFullName = git.RefName(refName) - } else { - refFullName = git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")) - } - results = append(results, &mirrorSyncResult{ - refName: refFullName, + refName: git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")), oldCommitID: shas[0], newCommitID: shas[1], }) @@ -183,15 +168,8 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult { log.Error("Expect two SHAs but not what found: %q", lines[i]) continue } - var refFullName git.RefName - if strings.HasPrefix(refName, "refs/") { - refFullName = git.RefName(refName) - } else { - refFullName = git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")) - } - results = append(results, &mirrorSyncResult{ - refName: refFullName, + refName: git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")), oldCommitID: shas[0], newCommitID: shas[1], }) @@ -626,8 +604,14 @@ func checkAndUpdateEmptyRepository(ctx context.Context, m *repo_model.Mirror, re } // Update the git repository default branch if err := gitrepo.SetDefaultBranch(ctx, m.Repo, m.Repo.DefaultBranch); err != nil { - log.Error("Failed to update default branch of underlying git repository %-v. Error: %v", m.Repo, err) - return false + if !git.IsErrUnsupportedVersion(err) { + log.Error("Failed to update default branch of underlying git repository %-v. Error: %v", m.Repo, err) + desc := fmt.Sprintf("Failed to update default branch of underlying git repository '%s': %v", m.Repo.RepoPath(), err) + if err = system_model.CreateRepositoryNotice(desc); err != nil { + log.Error("CreateRepositoryNotice: %v", err) + } + return false + } } m.Repo.IsEmpty = false // Update the is empty and default_branch columns diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 11b8ad459a..3a9644c3a1 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -13,17 +13,17 @@ import ( "strings" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + 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/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" ) var stripExitStatus = regexp.MustCompile(`exit status \d+ - `) @@ -172,7 +172,7 @@ func runPushSync(ctx context.Context, m *repo_model.PushMirror) error { // OpenSSH isn't very intuitive when you want to specify a specific keypair. // Therefore, we need to create a temporary file that stores the private key, so that OpenSSH can use it. - // We delete the temporary file afterwards. + // We delete the the temporary file afterwards. privateKeyPath := "" if m.PublicKey != "" { f, err := os.CreateTemp(os.TempDir(), m.RemoteName) diff --git a/services/mirror/mirror_test.go b/services/mirror/mirror_test.go index 76632b6872..8ad524b608 100644 --- a/services/mirror/mirror_test.go +++ b/services/mirror/mirror_test.go @@ -17,13 +17,9 @@ func Test_parseRemoteUpdateOutput(t *testing.T) { - [deleted] (none) -> tag1 + f895a1e...957a993 test2 -> origin/test2 (forced update) 957a993..a87ba5f test3 -> origin/test3 - * [new ref] refs/pull/26595/head -> refs/pull/26595/head - * [new ref] refs/pull/26595/merge -> refs/pull/26595/merge - e0639e38fb..6db2410489 refs/pull/25873/head -> refs/pull/25873/head - + 1c97ebc746...976d27d52f refs/pull/25873/merge -> refs/pull/25873/merge (forced update) ` results := parseRemoteUpdateOutput(output, "origin") - assert.Len(t, results, 10) + assert.Len(t, results, 6) assert.EqualValues(t, "refs/tags/v0.1.8", results[0].refName.String()) assert.EqualValues(t, gitShortEmptySha, results[0].oldCommitID) assert.EqualValues(t, "", results[0].newCommitID) @@ -47,20 +43,4 @@ func Test_parseRemoteUpdateOutput(t *testing.T) { assert.EqualValues(t, "refs/heads/test3", results[5].refName.String()) assert.EqualValues(t, "957a993", results[5].oldCommitID) assert.EqualValues(t, "a87ba5f", results[5].newCommitID) - - assert.EqualValues(t, "refs/pull/26595/head", results[6].refName.String()) - assert.EqualValues(t, gitShortEmptySha, results[6].oldCommitID) - assert.EqualValues(t, "", results[6].newCommitID) - - assert.EqualValues(t, "refs/pull/26595/merge", results[7].refName.String()) - assert.EqualValues(t, gitShortEmptySha, results[7].oldCommitID) - assert.EqualValues(t, "", results[7].newCommitID) - - assert.EqualValues(t, "refs/pull/25873/head", results[8].refName.String()) - assert.EqualValues(t, "e0639e38fb", results[8].oldCommitID) - assert.EqualValues(t, "6db2410489", results[8].newCommitID) - - assert.EqualValues(t, "refs/pull/25873/merge", results[9].refName.String()) - assert.EqualValues(t, "1c97ebc746", results[9].oldCommitID) - assert.EqualValues(t, "976d27d52f", results[9].newCommitID) } diff --git a/services/mirror/notifier.go b/services/mirror/notifier.go index 8f8552f419..93d904470d 100644 --- a/services/mirror/notifier.go +++ b/services/mirror/notifier.go @@ -6,10 +6,10 @@ package mirror import ( "context" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/repository" - notify_service "forgejo.org/services/notify" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/repository" + notify_service "code.gitea.io/gitea/services/notify" ) func init() { diff --git a/services/mirror/queue.go b/services/mirror/queue.go index b4869cf8c0..0d9a624730 100644 --- a/services/mirror/queue.go +++ b/services/mirror/queue.go @@ -4,10 +4,10 @@ package mirror import ( - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" ) var mirrorQueue *queue.WorkerPoolQueue[*SyncRequest] diff --git a/services/notify/notifier.go b/services/notify/notifier.go index 00f98942d9..3230a5e5f5 100644 --- a/services/notify/notifier.go +++ b/services/notify/notifier.go @@ -6,12 +6,12 @@ package notify import ( "context" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/repository" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + 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/repository" ) // Notifier defines an interface to notify receiver diff --git a/services/notify/notify.go b/services/notify/notify.go index fb30dfb609..5ed63646aa 100644 --- a/services/notify/notify.go +++ b/services/notify/notify.go @@ -6,13 +6,13 @@ package notify import ( "context" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + 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/repository" ) var notifiers []Notifier diff --git a/services/notify/null.go b/services/notify/null.go index 7182e69abb..894d118eac 100644 --- a/services/notify/null.go +++ b/services/notify/null.go @@ -6,12 +6,12 @@ package notify import ( "context" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/repository" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + 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/repository" ) // NullNotifier implements a blank notifier diff --git a/services/org/org.go b/services/org/org.go index b1bbe43046..dca7794b47 100644 --- a/services/org/org.go +++ b/services/org/org.go @@ -7,15 +7,15 @@ import ( "context" "fmt" - "forgejo.org/models" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + repo_service "code.gitea.io/gitea/services/repository" ) // DeleteOrganization completely and permanently deletes everything of organization. diff --git a/services/org/org_test.go b/services/org/org_test.go index b0f591c745..07358438f6 100644 --- a/services/org/org_test.go +++ b/services/org/org_test.go @@ -6,11 +6,11 @@ package org import ( "testing" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" + "code.gitea.io/gitea/models" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/org/repo.go b/services/org/repo.go index 33f55b1191..78a829ef25 100644 --- a/services/org/repo.go +++ b/services/org/repo.go @@ -7,10 +7,10 @@ import ( "context" "errors" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" ) // TeamAddRepository adds new repository to team of organization. diff --git a/services/org/repo_test.go b/services/org/repo_test.go index c51cbf4c28..2ddb8f9045 100644 --- a/services/org/repo_test.go +++ b/services/org/repo_test.go @@ -6,10 +6,10 @@ package org import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "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" "github.com/stretchr/testify/require" ) diff --git a/services/org/team_invite.go b/services/org/team_invite.go index 9c5da25522..3f28044dbf 100644 --- a/services/org/team_invite.go +++ b/services/org/team_invite.go @@ -6,9 +6,9 @@ package org import ( "context" - org_model "forgejo.org/models/organization" - user_model "forgejo.org/models/user" - "forgejo.org/services/mailer" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/services/mailer" ) // CreateTeamInvite make a persistent invite in db and mail it diff --git a/services/packages/alpine/repository.go b/services/packages/alpine/repository.go index 9435887a46..92f475bb7b 100644 --- a/services/packages/alpine/repository.go +++ b/services/packages/alpine/repository.go @@ -20,14 +20,14 @@ import ( "io" "strings" - packages_model "forgejo.org/models/packages" - alpine_model "forgejo.org/models/packages/alpine" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - packages_module "forgejo.org/modules/packages" - alpine_module "forgejo.org/modules/packages/alpine" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + alpine_model "code.gitea.io/gitea/models/packages/alpine" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + packages_module "code.gitea.io/gitea/modules/packages" + alpine_module "code.gitea.io/gitea/modules/packages/alpine" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" ) const ( diff --git a/services/packages/alt/repository.go b/services/packages/alt/repository.go deleted file mode 100644 index 317862da9d..0000000000 --- a/services/packages/alt/repository.go +++ /dev/null @@ -1,937 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package alt - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/binary" - "encoding/hex" - "fmt" - "io" - "path" - "time" - - packages_model "forgejo.org/models/packages" - alt_model "forgejo.org/models/packages/alt" - user_model "forgejo.org/models/user" - "forgejo.org/modules/container" - "forgejo.org/modules/json" - packages_module "forgejo.org/modules/packages" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/setting" - packages_service "forgejo.org/services/packages" - - "github.com/ulikunitz/xz" -) - -// GetOrCreateRepositoryVersion gets or creates the internal repository package -// The RPM registry needs multiple metadata files which are stored in this package. -func GetOrCreateRepositoryVersion(ctx context.Context, ownerID int64) (*packages_model.PackageVersion, error) { - return packages_service.GetOrCreateInternalPackageVersion(ctx, ownerID, packages_model.TypeAlt, rpm_module.RepositoryPackage, rpm_module.RepositoryVersion) -} - -// BuildAllRepositoryFiles (re)builds all repository files for every available group -func BuildAllRepositoryFiles(ctx context.Context, ownerID int64) error { - pv, err := GetOrCreateRepositoryVersion(ctx, ownerID) - if err != nil { - return err - } - - // 1. Delete all existing repository files - pfs, err := packages_model.GetFilesByVersionID(ctx, pv.ID) - if err != nil { - return err - } - - for _, pf := range pfs { - if err := packages_service.DeletePackageFile(ctx, pf); err != nil { - return err - } - } - - // 2. (Re)Build repository files for existing packages - groups, err := alt_model.GetGroups(ctx, ownerID) - if err != nil { - return err - } - for _, group := range groups { - if err := BuildSpecificRepositoryFiles(ctx, ownerID, group); err != nil { - return fmt.Errorf("failed to build repository files [%s]: %w", group, err) - } - } - - return nil -} - -type repoChecksum struct { - Value string `xml:",chardata"` - Type string `xml:"type,attr"` -} - -type repoLocation struct { - Href string `xml:"href,attr"` -} - -type repoData struct { - Type string `xml:"type,attr"` - Checksum repoChecksum `xml:"checksum"` - MD5Checksum repoChecksum `xml:"md5checksum"` - Blake2bHash repoChecksum `xml:"blake2bHash"` - OpenChecksum repoChecksum `xml:"open-checksum"` - Location repoLocation `xml:"location"` - Timestamp int64 `xml:"timestamp"` - Size int64 `xml:"size"` - OpenSize int64 `xml:"open-size"` -} - -type packageData struct { - Package *packages_model.Package - Version *packages_model.PackageVersion - Blob *packages_model.PackageBlob - VersionMetadata *rpm_module.VersionMetadata - FileMetadata *rpm_module.FileMetadata -} - -type packageCache = map[*packages_model.PackageFile]*packageData - -// BuildSpecificRepositoryFiles builds metadata files for the repository -func BuildSpecificRepositoryFiles(ctx context.Context, ownerID int64, group string) error { - pv, err := GetOrCreateRepositoryVersion(ctx, ownerID) - if err != nil { - return err - } - - pfs, _, err := packages_model.SearchFiles(ctx, &packages_model.PackageFileSearchOptions{ - OwnerID: ownerID, - PackageType: packages_model.TypeAlt, - Query: "%.rpm", - CompositeKey: group, - }) - if err != nil { - return err - } - - // Delete the repository files if there are no packages - if len(pfs) == 0 { - pfs, err := packages_model.GetFilesByVersionID(ctx, pv.ID) - if err != nil { - return err - } - for _, pf := range pfs { - if err := packages_service.DeletePackageFile(ctx, pf); err != nil { - return err - } - } - - return nil - } - - // Cache data needed for all repository files - cache := make(packageCache) - for _, pf := range pfs { - pv, err := packages_model.GetVersionByID(ctx, pf.VersionID) - if err != nil { - return err - } - p, err := packages_model.GetPackageByID(ctx, pv.PackageID) - if err != nil { - return err - } - pb, err := packages_model.GetBlobByID(ctx, pf.BlobID) - if err != nil { - return err - } - pps, err := packages_model.GetPropertiesByName(ctx, packages_model.PropertyTypeFile, pf.ID, rpm_module.PropertyMetadata) - if err != nil { - return err - } - - pd := &packageData{ - Package: p, - Version: pv, - Blob: pb, - } - - if err := json.Unmarshal([]byte(pv.MetadataJSON), &pd.VersionMetadata); err != nil { - return err - } - if len(pps) > 0 { - if err := json.Unmarshal([]byte(pps[0].Value), &pd.FileMetadata); err != nil { - return err - } - } - - cache[pf] = pd - } - - pkglist, err := buildPackageLists(ctx, pv, pfs, cache, group) - if err != nil { - return err - } - - err = buildRelease(ctx, pv, pfs, cache, group, pkglist) - if err != nil { - return err - } - - return nil -} - -type RPMHeader struct { - Magic [4]byte - Reserved [4]byte - NIndex uint32 - HSize uint32 -} - -type RPMHdrIndex struct { - Tag uint32 - Type uint32 - Offset uint32 - Count uint32 -} - -type indexWithData struct { - index *RPMHdrIndex - data []any -} - -type headerWithIndexes struct { - header *RPMHeader - indexes []indexWithData -} - -// https://refspecs.linuxbase.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/pkgformat.html -func buildPackageLists(ctx context.Context, pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, group string) (map[string][]*repoData, error) { - packagesByArch := map[string][]*packages_model.PackageFile{} - - for _, pf := range pfs { - pd := c[pf] - - packageArch := pd.FileMetadata.Architecture - if packages, ok := packagesByArch[packageArch]; ok { - packagesByArch[packageArch] = append(packages, pf) - } else { - packagesByArch[packageArch] = []*packages_model.PackageFile{pf} - } - } - - repoDataListByArch := make(map[string][]*repoData) - - for architecture, pfs := range packagesByArch { - repoDataList := []*repoData{} - orderedHeaders := []headerWithIndexes{} - - for _, pf := range pfs { - pd := c[pf] - - var requireNames []any - var requireVersions []any - var requireFlags []any - requireNamesSize := 0 - requireVersionsSize := 0 - requireFlagsSize := 0 - - for _, entry := range pd.FileMetadata.Requires { - if entry != nil { - requireNames = append(requireNames, entry.Name) - requireVersions = append(requireVersions, entry.Version) - requireFlags = append(requireFlags, entry.AltFlags) - requireNamesSize += len(entry.Name) + 1 - requireVersionsSize += len(entry.Version) + 1 - requireFlagsSize += 4 - } - } - - var conflictNames []any - var conflictVersions []any - var conflictFlags []any - conflictNamesSize := 0 - conflictVersionsSize := 0 - conflictFlagsSize := 0 - - for _, entry := range pd.FileMetadata.Conflicts { - if entry != nil { - conflictNames = append(conflictNames, entry.Name) - conflictVersions = append(conflictVersions, entry.Version) - conflictFlags = append(conflictFlags, entry.AltFlags) - conflictNamesSize += len(entry.Name) + 1 - conflictVersionsSize += len(entry.Version) + 1 - conflictFlagsSize += 4 - } - } - - var baseNames []any - var dirNames []any - baseNamesSize := 0 - dirNamesSize := 0 - - for _, entry := range pd.FileMetadata.Files { - if entry != nil { - dir, file := path.Split(entry.Path) - - baseNames = append(baseNames, file) - dirNames = append(dirNames, dir) - baseNamesSize += len(file) + 1 - dirNamesSize += len(dir) + 1 - } - } - - var provideNames []any - var provideVersions []any - var provideFlags []any - provideNamesSize := 0 - provideVersionsSize := 0 - provideFlagsSize := 0 - - for _, entry := range pd.FileMetadata.Provides { - if entry != nil { - provideNames = append(provideNames, entry.Name) - provideVersions = append(provideVersions, entry.Version) - provideFlags = append(provideFlags, entry.AltFlags) - provideNamesSize += len(entry.Name) + 1 - provideVersionsSize += len(entry.Version) + 1 - provideFlagsSize += 4 - } - } - - var obsoleteNames []any - var obsoleteVersions []any - var obsoleteFlags []any - obsoleteNamesSize := 0 - obsoleteVersionsSize := 0 - obsoleteFlagsSize := 0 - - for _, entry := range pd.FileMetadata.Obsoletes { - if entry != nil { - obsoleteNames = append(obsoleteNames, entry.Name) - obsoleteVersions = append(obsoleteVersions, entry.Version) - obsoleteFlags = append(obsoleteFlags, entry.AltFlags) - obsoleteNamesSize += len(entry.Name) + 1 - obsoleteVersionsSize += len(entry.Version) + 1 - obsoleteFlagsSize += 4 - } - } - - var changeLogTimes []any - var changeLogNames []any - var changeLogTexts []any - changeLogTimesSize := 0 - changeLogNamesSize := 0 - changeLogTextsSize := 0 - - for _, entry := range pd.FileMetadata.Changelogs { - if entry != nil { - changeLogNames = append(changeLogNames, entry.Author) - changeLogTexts = append(changeLogTexts, entry.Text) - changeLogTimes = append(changeLogTimes, uint32(int64(entry.Date))) - changeLogNamesSize += len(entry.Author) + 1 - changeLogTextsSize += len(entry.Text) + 1 - changeLogTimesSize += 4 - } - } - - /*Header*/ - hdr := &RPMHeader{ - Magic: [4]byte{0x8E, 0xAD, 0xE8, 0x01}, - Reserved: [4]byte{0, 0, 0, 0}, - NIndex: binary.BigEndian.Uint32([]byte{0, 0, 0, 0}), - HSize: binary.BigEndian.Uint32([]byte{0, 0, 0, 0}), - } - orderedHeader := headerWithIndexes{hdr, []indexWithData{}} - - /*Tags: */ - nameInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 232}), - Type: 6, - Offset: 0, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &nameInd, - data: []any{pd.Package.Name}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.Package.Name) + 1) - - // Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð²ÐµÑ€Ñии пакета - versionInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 233}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &versionInd, - data: []any{pd.FileMetadata.Version}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.FileMetadata.Version) + 1) - - summaryInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 236}), - Type: 9, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &summaryInd, - data: []any{pd.VersionMetadata.Summary}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.VersionMetadata.Summary) + 1) - - descriptionInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 237}), - Type: 9, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &descriptionInd, - data: []any{pd.VersionMetadata.Description}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.VersionMetadata.Description) + 1) - - releaseInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 234}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &releaseInd, - data: []any{pd.FileMetadata.Release}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.FileMetadata.Release) + 1) - - alignPadding(hdr, orderedHeader.indexes) - - sizeInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 241}), - Type: 4, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &sizeInd, - data: []any{int32(pd.FileMetadata.InstalledSize)}, - }) - hdr.NIndex++ - hdr.HSize += 4 - - buildTimeInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 238}), - Type: 4, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &buildTimeInd, - data: []any{int32(pd.FileMetadata.BuildTime)}, - }) - hdr.NIndex++ - hdr.HSize += 4 - - licenseInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 246}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &licenseInd, - data: []any{pd.VersionMetadata.License}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.VersionMetadata.License) + 1) - - packagerInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 247}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &packagerInd, - data: []any{pd.FileMetadata.Packager}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.FileMetadata.Packager) + 1) - - groupInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 248}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &groupInd, - data: []any{pd.FileMetadata.Group}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.FileMetadata.Group) + 1) - - urlInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 252}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &urlInd, - data: []any{pd.VersionMetadata.ProjectURL}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.VersionMetadata.ProjectURL) + 1) - - if len(changeLogNames) != 0 && len(changeLogTexts) != 0 && len(changeLogTimes) != 0 { - alignPadding(hdr, orderedHeader.indexes) - - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x38}, 4, changeLogTimes, changeLogTimesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x39}, 8, changeLogNames, changeLogNamesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x3A}, 8, changeLogTexts, changeLogTextsSize) - } - - archInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0, 0, 3, 254}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &archInd, - data: []any{pd.FileMetadata.Architecture}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.FileMetadata.Architecture) + 1) - - if len(provideNames) != 0 && len(provideVersions) != 0 && len(provideFlags) != 0 { - alignPadding(hdr, orderedHeader.indexes) - - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x58}, 4, provideFlags, provideFlagsSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x17}, 8, provideNames, provideNamesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x59}, 8, provideVersions, provideVersionsSize) - } - - sourceRpmInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x14}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &sourceRpmInd, - data: []any{pd.FileMetadata.SourceRpm}, - }) - hdr.NIndex++ - hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(len(pd.FileMetadata.SourceRpm) + 1)}) - - if len(requireNames) != 0 && len(requireVersions) != 0 && len(requireFlags) != 0 { - alignPadding(hdr, orderedHeader.indexes) - - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x18}, 4, requireFlags, requireFlagsSize) - addRPMHdrIndex(&orderedHeader, []byte{0, 0, 4, 25}, 8, requireNames, requireNamesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1A}, 8, requireVersions, requireVersionsSize) - } - - if len(baseNames) != 0 { - baseNamesInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x5D}), - Type: 8, - Offset: hdr.HSize, - Count: uint32(len(baseNames)), - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &baseNamesInd, - data: baseNames, - }) - hdr.NIndex++ - hdr.HSize += uint32(baseNamesSize) - } - - if len(dirNames) != 0 { - dirnamesInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x00, 0x04, 0x5E}), - Type: 8, - Offset: hdr.HSize, - Count: uint32(len(dirNames)), - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &dirnamesInd, - data: dirNames, - }) - hdr.NIndex++ - hdr.HSize += uint32(dirNamesSize) - } - - filenameInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x40}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &filenameInd, - data: []any{pf.Name}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pf.Name) + 1) - - alignPadding(hdr, orderedHeader.indexes) - - filesizeInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x41}), - Type: 4, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &filesizeInd, - data: []any{int32(pd.Blob.Size)}, - }) - hdr.NIndex++ - hdr.HSize += 4 - - md5Ind := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x45}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &md5Ind, - data: []any{pd.Blob.HashMD5}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.Blob.HashMD5) + 1) - - blake2bInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x49}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &blake2bInd, - data: []any{pd.Blob.HashBlake2b}, - }) - hdr.NIndex++ - hdr.HSize += uint32(len(pd.Blob.HashBlake2b) + 1) - - if len(conflictNames) != 0 && len(conflictVersions) != 0 && len(conflictFlags) != 0 { - alignPadding(hdr, orderedHeader.indexes) - - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1D}, 4, conflictFlags, conflictFlagsSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1E}, 8, conflictNames, conflictNamesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x1F}, 8, conflictVersions, conflictVersionsSize) - } - - directoryInd := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32([]byte{0x00, 0x0F, 0x42, 0x4A}), - Type: 6, - Offset: hdr.HSize, - Count: 1, - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &directoryInd, - data: []any{"RPMS.classic"}, - }) - hdr.NIndex++ - hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(len("RPMS.classic") + 1)}) - - if len(obsoleteNames) != 0 && len(obsoleteVersions) != 0 && len(obsoleteFlags) != 0 { - alignPadding(hdr, orderedHeader.indexes) - - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x5A}, 4, obsoleteFlags, obsoleteFlagsSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x42}, 8, obsoleteNames, obsoleteNamesSize) - addRPMHdrIndex(&orderedHeader, []byte{0x00, 0x00, 0x04, 0x5B}, 8, obsoleteVersions, obsoleteVersionsSize) - } - - orderedHeaders = append(orderedHeaders, orderedHeader) - } - - files := []string{"pkglist.classic", "pkglist.classic.xz"} - for file := range files { - fileInfo, err := addPkglistAsFileToRepo(ctx, pv, files[file], orderedHeaders, group, architecture) - if err != nil { - return nil, err - } - repoDataList = append(repoDataList, fileInfo) - } - repoDataListByArch[architecture] = repoDataList - } - return repoDataListByArch, nil -} - -func alignPadding(hdr *RPMHeader, indexes []indexWithData) { - /* Align to 4-bytes to add a 4-byte element. */ - padding := (4 - (hdr.HSize % 4)) % 4 - if padding == 4 { - padding = 0 - } - hdr.HSize += binary.BigEndian.Uint32([]byte{0, 0, 0, uint8(padding)}) - - lastIndex := len(indexes) - 1 - for i := uint32(0); i < padding; i++ { - for _, elem := range indexes[lastIndex].data { - if str, ok := elem.(string); ok { - indexes[lastIndex].data[len(indexes[lastIndex].data)-1] = str + "\x00" - } - } - } -} - -func addRPMHdrIndex(orderedHeader *headerWithIndexes, tag []byte, typeVal uint32, data []any, dataSize int) { - index := RPMHdrIndex{ - Tag: binary.BigEndian.Uint32(tag), - Type: typeVal, - Offset: orderedHeader.header.HSize, - Count: uint32(len(data)), - } - orderedHeader.indexes = append(orderedHeader.indexes, indexWithData{ - index: &index, - data: data, - }) - orderedHeader.header.NIndex++ - orderedHeader.header.HSize += uint32(dataSize) -} - -// https://www.altlinux.org/APT_в_ALT_Linux/CreateRepository -func buildRelease(ctx context.Context, pv *packages_model.PackageVersion, pfs []*packages_model.PackageFile, c packageCache, group string, pkglist map[string][]*repoData) error { - architectures := make(container.Set[string]) - - for _, pf := range pfs { - pd := c[pf] - architectures.Add(pd.FileMetadata.Architecture) - } - - for architecture := range architectures.Seq() { - version := time.Now().Unix() - label := setting.AppName - data := fmt.Sprintf(`Archive: Alt Linux Team -Component: classic -Version: %d -Origin: Alt Linux Team -Label: %s -Architecture: %s -NotAutomatic: false -`, - version, label, architecture) - fileInfo, err := addReleaseAsFileToRepo(ctx, pv, "release.classic", data, group, architecture) - if err != nil { - return err - } - - origin := setting.AppName - codename := time.Now().Unix() - date := time.Now().UTC().Format(time.RFC1123) - - var md5Sum string - var blake2b string - - for _, pkglistByArch := range pkglist[architecture] { - md5Sum += fmt.Sprintf(" %s %d %s\n", pkglistByArch.MD5Checksum.Value, pkglistByArch.Size, "base/"+pkglistByArch.Type) - blake2b += fmt.Sprintf(" %s %d %s\n", pkglistByArch.Blake2bHash.Value, pkglistByArch.Size, "base/"+pkglistByArch.Type) - } - md5Sum += fmt.Sprintf(" %s %d %s\n", fileInfo.MD5Checksum.Value, fileInfo.Size, "base/"+fileInfo.Type) - blake2b += fmt.Sprintf(" %s %d %s\n", fileInfo.Blake2bHash.Value, fileInfo.Size, "base/"+fileInfo.Type) - - data = fmt.Sprintf(`Origin: %s -Label: %s -Suite: Sisyphus -Codename: %d -Date: %s -Architectures: %s -MD5Sum: -%sBLAKE2b: -%s - -`, - origin, label, codename, date, architecture, md5Sum, blake2b) - _, err = addReleaseAsFileToRepo(ctx, pv, "release", data, group, architecture) - if err != nil { - return err - } - } - return nil -} - -func addReleaseAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion, filename, obj, group, arch string) (*repoData, error) { - content, _ := packages_module.NewHashedBuffer() - defer content.Close() - - h := sha256.New() - - w := io.MultiWriter(content, h) - if _, err := w.Write([]byte(obj)); err != nil { - return nil, err - } - - _, err := packages_service.AddFileToPackageVersionInternal( - ctx, - pv, - &packages_service.PackageFileCreationInfo{ - PackageFileInfo: packages_service.PackageFileInfo{ - Filename: filename, - CompositeKey: arch + "__" + group, - }, - Creator: user_model.NewGhostUser(), - Data: content, - IsLead: false, - OverwriteExisting: true, - }, - ) - if err != nil { - return nil, err - } - - hashMD5, _, hashSHA256, _, hashBlake2b := content.Sums() - - if group == "" { - group = "alt" - } - - return &repoData{ - Type: filename, - Checksum: repoChecksum{ - Type: "sha256", - Value: hex.EncodeToString(hashSHA256), - }, - MD5Checksum: repoChecksum{ - Type: "md5", - Value: hex.EncodeToString(hashMD5), - }, - OpenChecksum: repoChecksum{ - Type: "sha256", - Value: hex.EncodeToString(h.Sum(nil)), - }, - Blake2bHash: repoChecksum{ - Type: "blake2b", - Value: hex.EncodeToString(hashBlake2b), - }, - Location: repoLocation{ - Href: group + ".repo/" + arch + "/base/" + filename, - }, - Size: content.Size(), - }, nil -} - -func addPkglistAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion, filename string, orderedHeaders []headerWithIndexes, group, arch string) (*repoData, error) { - content, _ := packages_module.NewHashedBuffer() - defer content.Close() - - h := sha256.New() - w := io.MultiWriter(content, h) - buf := &bytes.Buffer{} - - for _, hdr := range orderedHeaders { - if err := binary.Write(buf, binary.BigEndian, *hdr.header); err != nil { - return nil, err - } - - for _, index := range hdr.indexes { - if err := binary.Write(buf, binary.BigEndian, *index.index); err != nil { - return nil, err - } - } - - for _, index := range hdr.indexes { - for _, indexValue := range index.data { - switch v := indexValue.(type) { - case string: - if _, err := buf.WriteString(v + "\x00"); err != nil { - return nil, err - } - case int, int32, int64, uint32: - if err := binary.Write(buf, binary.BigEndian, v); err != nil { - return nil, err - } - } - } - } - } - - if path.Ext(filename) == ".xz" { - xzContent, err := compressXZ(buf.Bytes()) - if err != nil { - return nil, err - } - if _, err := w.Write(xzContent); err != nil { - return nil, err - } - } else { - if _, err := w.Write(buf.Bytes()); err != nil { - return nil, err - } - } - - _, err := packages_service.AddFileToPackageVersionInternal( - ctx, - pv, - &packages_service.PackageFileCreationInfo{ - PackageFileInfo: packages_service.PackageFileInfo{ - Filename: filename, - CompositeKey: arch + "__" + group, - }, - Creator: user_model.NewGhostUser(), - Data: content, - IsLead: false, - OverwriteExisting: true, - }, - ) - if err != nil { - return nil, err - } - - hashMD5, _, hashSHA256, _, hashBlake2b := content.Sums() - - if group == "" { - group = "alt" - } - - return &repoData{ - Type: filename, - Checksum: repoChecksum{ - Type: "sha256", - Value: hex.EncodeToString(hashSHA256), - }, - MD5Checksum: repoChecksum{ - Type: "md5", - Value: hex.EncodeToString(hashMD5), - }, - OpenChecksum: repoChecksum{ - Type: "sha256", - Value: hex.EncodeToString(h.Sum(nil)), - }, - Blake2bHash: repoChecksum{ - Type: "blake2b", - Value: hex.EncodeToString(hashBlake2b), - }, - Location: repoLocation{ - Href: group + ".repo/" + arch + "/base/" + filename, - }, - Size: content.Size(), - }, nil -} - -func compressXZ(data []byte) ([]byte, error) { - var xzContent bytes.Buffer - xzWriter, err := xz.NewWriter(&xzContent) - if err != nil { - return nil, err - } - - _, err = xzWriter.Write(data) - xzWriter.Close() - if err != nil { - return nil, err - } - - return xzContent.Bytes(), nil -} diff --git a/services/packages/arch/repository.go b/services/packages/arch/repository.go index 2a865e6dbd..763a0a2102 100644 --- a/services/packages/arch/repository.go +++ b/services/packages/arch/repository.go @@ -16,14 +16,14 @@ import ( "sort" "strings" - packages_model "forgejo.org/models/packages" - user_model "forgejo.org/models/user" - packages_module "forgejo.org/modules/packages" - arch_module "forgejo.org/modules/packages/arch" - "forgejo.org/modules/setting" - "forgejo.org/modules/sync" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + packages_module "code.gitea.io/gitea/modules/packages" + arch_module "code.gitea.io/gitea/modules/packages/arch" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/sync" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" @@ -225,44 +225,22 @@ func createDB(ctx context.Context, ownerID int64, group, arch string) (*packages if err != nil { return nil, err } - if len(pps) == 0 { - continue - } - pkgDesc := []byte(pps[0].Value) - header := &tar.Header{ - Name: pkg.Name + "-" + ver.Version + "/desc", - Size: int64(len(pkgDesc)), - Mode: int64(os.ModePerm), - } - if err = tw.WriteHeader(header); err != nil { - return nil, err - } - if _, err := tw.Write(pkgDesc); err != nil { - return nil, err - } - - pfs, err := packages_model.GetPropertiesByName( - ctx, packages_model.PropertyTypeFile, pf.ID, arch_module.PropertyFiles, - ) - if err != nil { - return nil, err - } - if len(pfs) >= 1 { - pkgFiles := []byte(pfs[0].Value) + if len(pps) >= 1 { + meta := []byte(pps[0].Value) header := &tar.Header{ - Name: pkg.Name + "-" + ver.Version + "/files", - Size: int64(len(pkgFiles)), + Name: pkg.Name + "-" + ver.Version + "/desc", + Size: int64(len(meta)), Mode: int64(os.ModePerm), } if err = tw.WriteHeader(header); err != nil { return nil, err } - if _, err := tw.Write(pkgFiles); err != nil { + if _, err := tw.Write(meta); err != nil { return nil, err } + count++ + break } - count++ - break } } if count == 0 { diff --git a/services/packages/auth.go b/services/packages/auth.go index ab2c347bc9..c5bf5af532 100644 --- a/services/packages/auth.go +++ b/services/packages/auth.go @@ -9,10 +9,10 @@ import ( "strings" "time" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" "github.com/golang-jwt/jwt/v5" ) diff --git a/services/packages/cargo/index.go b/services/packages/cargo/index.go index 9afcd79571..59823cd3de 100644 --- a/services/packages/cargo/index.go +++ b/services/packages/cargo/index.go @@ -13,17 +13,17 @@ import ( "strconv" "time" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - cargo_module "forgejo.org/modules/packages/cargo" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" + packages_model "code.gitea.io/gitea/models/packages" + 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" + cargo_module "code.gitea.io/gitea/modules/packages/cargo" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" ) const ( diff --git a/services/packages/cleanup/cleanup.go b/services/packages/cleanup/cleanup.go index 7e821e2630..ab419a9a5a 100644 --- a/services/packages/cleanup/cleanup.go +++ b/services/packages/cleanup/cleanup.go @@ -8,20 +8,19 @@ import ( "fmt" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - packages_service "forgejo.org/services/packages" - alpine_service "forgejo.org/services/packages/alpine" - alt_service "forgejo.org/services/packages/alt" - arch_service "forgejo.org/services/packages/arch" - cargo_service "forgejo.org/services/packages/cargo" - container_service "forgejo.org/services/packages/container" - debian_service "forgejo.org/services/packages/debian" - rpm_service "forgejo.org/services/packages/rpm" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + packages_service "code.gitea.io/gitea/services/packages" + alpine_service "code.gitea.io/gitea/services/packages/alpine" + arch_service "code.gitea.io/gitea/services/packages/arch" + cargo_service "code.gitea.io/gitea/services/packages/cargo" + container_service "code.gitea.io/gitea/services/packages/container" + debian_service "code.gitea.io/gitea/services/packages/debian" + rpm_service "code.gitea.io/gitea/services/packages/rpm" ) // Task method to execute cleanup rules and cleanup expired package data @@ -138,10 +137,6 @@ func ExecuteCleanupRules(outerCtx context.Context) error { if err := arch_service.BuildAllRepositoryFiles(ctx, pcr.OwnerID); err != nil { return fmt.Errorf("CleanupRule [%d]: arch.BuildAllRepositoryFiles failed: %w", pcr.ID, err) } - } else if pcr.Type == packages_model.TypeAlt { - if err := alt_service.BuildAllRepositoryFiles(ctx, pcr.OwnerID); err != nil { - return fmt.Errorf("CleanupRule [%d]: alt.BuildAllRepositoryFiles failed: %w", pcr.ID, err) - } } } return nil diff --git a/services/packages/cleanup/cleanup_sha256_test.go b/services/packages/cleanup/cleanup_sha256_test.go index f26b98b4b0..6d7cc47d3e 100644 --- a/services/packages/cleanup/cleanup_sha256_test.go +++ b/services/packages/cleanup/cleanup_sha256_test.go @@ -7,15 +7,15 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/test" - "forgejo.org/modules/timeutil" - container_service "forgejo.org/services/packages/container" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/timeutil" + container_service "code.gitea.io/gitea/services/packages/container" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -38,6 +38,7 @@ func TestCleanupSHA256(t *testing.T) { Type: packages.TypeContainer, } _, err := db.GetEngine(ctx).Insert(&p) + // package_version").Where("version = ?", multiTag).Update(&packages_model.PackageVersion{MetadataJSON: `corrupted "manifests":[{ bad`}) require.NoError(t, err) var metadata string diff --git a/services/packages/cleanup/main_test.go b/services/packages/cleanup/main_test.go index e9135c147a..ded3d76c83 100644 --- a/services/packages/cleanup/main_test.go +++ b/services/packages/cleanup/main_test.go @@ -6,7 +6,7 @@ package container import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/services/packages/container/blob_uploader.go b/services/packages/container/blob_uploader.go index cc009d1f5c..bae2e2d6af 100644 --- a/services/packages/container/blob_uploader.go +++ b/services/packages/container/blob_uploader.go @@ -9,10 +9,10 @@ import ( "io" "os" - packages_model "forgejo.org/models/packages" - packages_module "forgejo.org/modules/packages" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + packages_model "code.gitea.io/gitea/models/packages" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) var ( diff --git a/services/packages/container/cleanup.go b/services/packages/container/cleanup.go index a4ae7118f5..b5563c688f 100644 --- a/services/packages/container/cleanup.go +++ b/services/packages/container/cleanup.go @@ -7,11 +7,11 @@ import ( "context" "time" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - "forgejo.org/modules/optional" - container_module "forgejo.org/modules/packages/container" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + "code.gitea.io/gitea/modules/optional" + container_module "code.gitea.io/gitea/modules/packages/container" + packages_service "code.gitea.io/gitea/services/packages" digest "github.com/opencontainers/go-digest" ) diff --git a/services/packages/container/cleanup_sha256.go b/services/packages/container/cleanup_sha256.go index 5d0d02c22d..16afc74b18 100644 --- a/services/packages/container/cleanup_sha256.go +++ b/services/packages/container/cleanup_sha256.go @@ -8,12 +8,12 @@ import ( "strings" "time" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/timeutil" ) var ( diff --git a/services/packages/container/common.go b/services/packages/container/common.go index 758ef51721..5a14ed5b7a 100644 --- a/services/packages/container/common.go +++ b/services/packages/container/common.go @@ -7,9 +7,9 @@ import ( "context" "strings" - packages_model "forgejo.org/models/packages" - user_model "forgejo.org/models/user" - container_module "forgejo.org/modules/packages/container" + packages_model "code.gitea.io/gitea/models/packages" + user_model "code.gitea.io/gitea/models/user" + container_module "code.gitea.io/gitea/modules/packages/container" ) // UpdateRepositoryNames updates the repository name property for all packages of the specific owner diff --git a/services/packages/debian/repository.go b/services/packages/debian/repository.go index a8a401662e..e400f1e924 100644 --- a/services/packages/debian/repository.go +++ b/services/packages/debian/repository.go @@ -14,14 +14,14 @@ import ( "strings" "time" - packages_model "forgejo.org/models/packages" - debian_model "forgejo.org/models/packages/debian" - user_model "forgejo.org/models/user" - packages_module "forgejo.org/modules/packages" - debian_module "forgejo.org/modules/packages/debian" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + debian_model "code.gitea.io/gitea/models/packages/debian" + user_model "code.gitea.io/gitea/models/user" + packages_module "code.gitea.io/gitea/modules/packages" + debian_module "code.gitea.io/gitea/modules/packages/debian" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" diff --git a/services/packages/package_update.go b/services/packages/package_update.go deleted file mode 100644 index 7fa938e260..0000000000 --- a/services/packages/package_update.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package packages - -import ( - "context" - "fmt" - - org_model "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - 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/util" -) - -func LinkToRepository(ctx context.Context, pkg *packages_model.Package, repo *repo_model.Repository, doer *user_model.User) error { - if pkg.OwnerID != repo.OwnerID { - return util.ErrPermissionDenied - } - if pkg.RepoID > 0 { - return util.ErrInvalidArgument - } - - perms, err := access_model.GetUserRepoPermission(ctx, repo, doer) - if err != nil { - return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err) - } - if !perms.CanWrite(unit.TypePackages) { - return util.ErrPermissionDenied - } - - if err := packages_model.SetRepositoryLink(ctx, pkg.ID, repo.ID); err != nil { - return fmt.Errorf("error while linking package '%v' to repo '%v' : %w", pkg.Name, repo.FullName(), err) - } - return nil -} - -func UnlinkFromRepository(ctx context.Context, pkg *packages_model.Package, doer *user_model.User) error { - if pkg.RepoID == 0 { - return util.ErrInvalidArgument - } - - repo, err := repo_model.GetRepositoryByID(ctx, pkg.RepoID) - if err != nil && !repo_model.IsErrRepoNotExist(err) { - return fmt.Errorf("error getting repository %d: %w", pkg.RepoID, err) - } - if err == nil { - perms, err := access_model.GetUserRepoPermission(ctx, repo, doer) - if err != nil { - return fmt.Errorf("error getting permissions for user %d on repository %d: %w", doer.ID, repo.ID, err) - } - if !perms.CanWrite(unit.TypePackages) { - return util.ErrPermissionDenied - } - } - - user, err := user_model.GetUserByID(ctx, pkg.OwnerID) - if err != nil { - return err - } - if !doer.IsAdmin { - if !user.IsOrganization() { - if doer.ID != pkg.OwnerID { - return fmt.Errorf("no permission to unlink package '%v' from its repository, or packages are disabled", pkg.Name) - } - } else { - isOrgAdmin, err := org_model.OrgFromUser(user).IsOrgAdmin(ctx, doer.ID) - if err != nil { - return err - } else if !isOrgAdmin { - return fmt.Errorf("no permission to unlink package '%v' from its repository, or packages are disabled", pkg.Name) - } - } - } - return packages_model.UnlinkRepository(ctx, pkg.ID) -} diff --git a/services/packages/packages.go b/services/packages/packages.go index 1232e5914f..a5b84506de 100644 --- a/services/packages/packages.go +++ b/services/packages/packages.go @@ -12,17 +12,17 @@ import ( "net/url" "strings" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - packages_module "forgejo.org/modules/packages" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + 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/log" + "code.gitea.io/gitea/modules/optional" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + notify_service "code.gitea.io/gitea/services/notify" ) var ( @@ -244,15 +244,14 @@ func addFileToPackageWrapper(ctx context.Context, fn func(ctx context.Context) ( // NewPackageBlob creates a package blob instance func NewPackageBlob(hsr packages_module.HashedSizeReader) *packages_model.PackageBlob { - hashMD5, hashSHA1, hashSHA256, hashSHA512, hashBlake2b := hsr.Sums() + hashMD5, hashSHA1, hashSHA256, hashSHA512 := hsr.Sums() return &packages_model.PackageBlob{ - Size: hsr.Size(), - HashMD5: hex.EncodeToString(hashMD5), - HashSHA1: hex.EncodeToString(hashSHA1), - HashSHA256: hex.EncodeToString(hashSHA256), - HashSHA512: hex.EncodeToString(hashSHA512), - HashBlake2b: hex.EncodeToString(hashBlake2b), + Size: hsr.Size(), + HashMD5: hex.EncodeToString(hashMD5), + HashSHA1: hex.EncodeToString(hashSHA1), + HashSHA256: hex.EncodeToString(hashSHA256), + HashSHA512: hex.EncodeToString(hashSHA512), } } @@ -396,8 +395,6 @@ func CheckSizeQuotaExceeded(ctx context.Context, doer, owner *user_model.User, p typeSpecificSize = setting.Packages.LimitSizePyPI case packages_model.TypeRpm: typeSpecificSize = setting.Packages.LimitSizeRpm - case packages_model.TypeAlt: - typeSpecificSize = setting.Packages.LimitSizeAlt case packages_model.TypeRubyGems: typeSpecificSize = setting.Packages.LimitSizeRubyGems case packages_model.TypeSwift: @@ -605,12 +602,12 @@ func GetPackageFileStream(ctx context.Context, pf *packages_model.PackageFile) ( return nil, nil, nil, err } - return GetPackageBlobStream(ctx, pf, pb, nil) + return GetPackageBlobStream(ctx, pf, pb) } // GetPackageBlobStream returns the content of the specific package blob // If the storage supports direct serving and it's enabled, only the direct serving url is returned. -func GetPackageBlobStream(ctx context.Context, pf *packages_model.PackageFile, pb *packages_model.PackageBlob, serveDirectReqParams url.Values) (io.ReadSeekCloser, *url.URL, *packages_model.PackageFile, error) { +func GetPackageBlobStream(ctx context.Context, pf *packages_model.PackageFile, pb *packages_model.PackageBlob) (io.ReadSeekCloser, *url.URL, *packages_model.PackageFile, error) { key := packages_module.BlobHash256Key(pb.HashSHA256) cs := packages_module.NewContentStore() @@ -620,7 +617,7 @@ func GetPackageBlobStream(ctx context.Context, pf *packages_model.PackageFile, p var err error if cs.ShouldServeDirect() { - u, err = cs.GetServeDirectURL(key, pf.Name, serveDirectReqParams) + u, err = cs.GetServeDirectURL(key, pf.Name) if err != nil && !errors.Is(err, storage.ErrURLNotSupported) { log.Error("Error getting serve direct url: %v", err) } diff --git a/services/packages/rpm/repository.go b/services/packages/rpm/repository.go index 961de7828f..2cea04212a 100644 --- a/services/packages/rpm/repository.go +++ b/services/packages/rpm/repository.go @@ -16,15 +16,15 @@ import ( "strings" "time" - packages_model "forgejo.org/models/packages" - rpm_model "forgejo.org/models/packages/rpm" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" + packages_model "code.gitea.io/gitea/models/packages" + rpm_model "code.gitea.io/gitea/models/packages/rpm" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + rpm_module "code.gitea.io/gitea/modules/packages/rpm" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" @@ -622,7 +622,7 @@ func addDataAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion, return nil, err } - _, _, hashSHA256, _, _ := content.Sums() + _, _, hashSHA256, _ := content.Sums() return &repoData{ Type: filetype, diff --git a/services/pull/annex.go b/services/pull/annex.go deleted file mode 100644 index 67985aa1b7..0000000000 --- a/services/pull/annex.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package pull - -import ( - "context" - "io" - "sync" - - "forgejo.org/modules/annex" - "forgejo.org/modules/git/pipeline" -) - -// AnnexPush copies all annexed files referenced in new commits from the head repository to the base repository -func AnnexPush(ctx context.Context, tmpBasePath, mergeHeadSHA, mergeBaseSHA string) error { - // Initialize the temporary repository with git-annex - if err := annex.PrivateInit(ctx, tmpBasePath); err != nil { - return err - } - - revListReader, revListWriter := io.Pipe() - shasToCheckReader, shasToCheckWriter := io.Pipe() - catFileCheckReader, catFileCheckWriter := io.Pipe() - shasToBatchReader, shasToBatchWriter := io.Pipe() - lookupKeyBatchReader, lookupKeyBatchWriter := io.Pipe() - errChan := make(chan error, 1) - wg := sync.WaitGroup{} - wg.Add(6) - // Create the go-routines in reverse order. - - // 6. Take the referenced keys and copy their data from the head repository to - // the base repository - go annex.CopyFromToBatch(ctx, "head_repo", "origin", lookupKeyBatchReader, &wg, tmpBasePath) - - // 5. Take the shas of the blobs and resolve them to annex keys, git-annex - // should filter out anything that doesn't reference a key - go annex.LookupKeyBatch(ctx, shasToBatchReader, lookupKeyBatchWriter, &wg, tmpBasePath) - - // 4. From the provided objects restrict to blobs <=32KiB - go pipeline.BlobsLessThanOrEqual32KiBFromCatFileBatchCheck(catFileCheckReader, shasToBatchWriter, &wg) - - // 3. Run batch-check on the objects retrieved from rev-list - go pipeline.CatFileBatchCheck(ctx, shasToCheckReader, catFileCheckWriter, &wg, tmpBasePath) - - // 2. Check each object retrieved rejecting those without names as they will be commits or trees - go pipeline.BlobsFromRevListObjects(revListReader, shasToCheckWriter, &wg) - - // 1. Run rev-list objects from mergeHead to mergeBase - go pipeline.RevListObjects(ctx, revListWriter, &wg, tmpBasePath, mergeHeadSHA, mergeBaseSHA, errChan) - - wg.Wait() - select { - case err, has := <-errChan: - if has { - return err - } - default: - } - return nil -} diff --git a/services/pull/check.go b/services/pull/check.go index d038b3d829..2d91ed07f5 100644 --- a/services/pull/check.go +++ b/services/pull/check.go @@ -11,23 +11,23 @@ import ( "strconv" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - 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/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/queue" - "forgejo.org/modules/timeutil" - asymkey_service "forgejo.org/services/asymkey" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + 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/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/queue" + "code.gitea.io/gitea/modules/timeutil" + asymkey_service "code.gitea.io/gitea/services/asymkey" + notify_service "code.gitea.io/gitea/services/notify" ) // prPatchCheckerQueue represents a queue to handle update pull request tests diff --git a/services/pull/check_test.go b/services/pull/check_test.go index b965d90236..b99cf01ee1 100644 --- a/services/pull/check_test.go +++ b/services/pull/check_test.go @@ -5,15 +5,16 @@ package pull import ( + "context" "strconv" "testing" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" + "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/queue" + "code.gitea.io/gitea/modules/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,7 +34,7 @@ func TestPullRequest_AddToTaskQueue(t *testing.T) { cfg, err := setting.GetQueueSettings(setting.CfgProvider, "pr_patch_checker") require.NoError(t, err) - prPatchCheckerQueue, err = queue.NewWorkerPoolQueueWithContext(t.Context(), "pr_patch_checker", cfg, testHandler, true) + prPatchCheckerQueue, err = queue.NewWorkerPoolQueueWithContext(context.Background(), "pr_patch_checker", cfg, testHandler, true) require.NoError(t, err) pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2}) diff --git a/services/pull/comment.go b/services/pull/comment.go index 25542daa9f..53587d4f54 100644 --- a/services/pull/comment.go +++ b/services/pull/comment.go @@ -6,11 +6,11 @@ package pull import ( "context" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" + 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/gitrepo" + "code.gitea.io/gitea/modules/json" ) // getCommitIDsFromRepo get commit IDs from repo in between oldCommitID and newCommitID diff --git a/services/pull/commit_status.go b/services/pull/commit_status.go index 3c864c8ef2..0d4763a838 100644 --- a/services/pull/commit_status.go +++ b/services/pull/commit_status.go @@ -9,13 +9,13 @@ import ( "errors" "fmt" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" + "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/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/structs" "github.com/gobwas/glob" ) @@ -71,6 +71,36 @@ func MergeRequiredContextsCommitStatus(commitStatuses []*git_model.CommitStatus, return returnedStatus } +// IsCommitStatusContextSuccess returns true if all required status check contexts succeed. +func IsCommitStatusContextSuccess(commitStatuses []*git_model.CommitStatus, requiredContexts []string) bool { + // If no specific context is required, require that last commit status is a success + if len(requiredContexts) == 0 { + status := git_model.CalcCommitStatus(commitStatuses) + if status == nil || status.State != structs.CommitStatusSuccess { + return false + } + return true + } + + for _, ctx := range requiredContexts { + var found bool + for _, commitStatus := range commitStatuses { + if commitStatus.Context == ctx { + if commitStatus.State != structs.CommitStatusSuccess { + return false + } + + found = true + break + } + } + if !found { + return false + } + } + return true +} + // IsPullCommitStatusPass returns if all required status checks PASS func IsPullCommitStatusPass(ctx context.Context, pr *issues_model.PullRequest) (bool, error) { pb, err := git_model.GetFirstMatchProtectedBranchRule(ctx, pr.BaseRepoID, pr.BaseBranch) diff --git a/services/pull/commit_status_test.go b/services/pull/commit_status_test.go index 593c88fb19..592acdd55c 100644 --- a/services/pull/commit_status_test.go +++ b/services/pull/commit_status_test.go @@ -7,8 +7,8 @@ package pull import ( "testing" - git_model "forgejo.org/models/git" - "forgejo.org/modules/structs" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) diff --git a/services/pull/edits.go b/services/pull/edits.go index dbf08e6851..c7550dcb07 100644 --- a/services/pull/edits.go +++ b/services/pull/edits.go @@ -8,10 +8,10 @@ import ( "context" "errors" - issues_model "forgejo.org/models/issues" - access_model "forgejo.org/models/perm/access" - unit_model "forgejo.org/models/unit" - user_model "forgejo.org/models/user" + issues_model "code.gitea.io/gitea/models/issues" + access_model "code.gitea.io/gitea/models/perm/access" + unit_model "code.gitea.io/gitea/models/unit" + user_model "code.gitea.io/gitea/models/user" ) var ErrUserHasNoPermissionForAction = errors.New("user not allowed to do this action") diff --git a/services/pull/lfs.go b/services/pull/lfs.go index 8d9f401641..ed03583d4f 100644 --- a/services/pull/lfs.go +++ b/services/pull/lfs.go @@ -11,12 +11,12 @@ import ( "strconv" "sync" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/modules/git/pipeline" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" + "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/modules/git/pipeline" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" ) // LFSPush pushes lfs objects referred to in new commits in the head repository from the base repository diff --git a/services/pull/main_test.go b/services/pull/main_test.go index 5262b5be50..efbb63a36e 100644 --- a/services/pull/main_test.go +++ b/services/pull/main_test.go @@ -7,10 +7,9 @@ package pull import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/services/pull/merge.go b/services/pull/merge.go index 2f6ee6754c..a1585e64ab 100644 --- a/services/pull/merge.go +++ b/services/pull/merge.go @@ -14,24 +14,23 @@ import ( "strconv" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - 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/annex" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/references" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - issue_service "forgejo.org/services/issue" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + 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/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/references" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + issue_service "code.gitea.io/gitea/services/issue" + notify_service "code.gitea.io/gitea/services/notify" ) // getMergeMessage composes the message used when merging a pull request. @@ -315,12 +314,6 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use } } - if setting.Annex.Enabled && annex.PathIsAnnexRepo(pr.BaseRepo.RepoPath()) && annex.PathIsAnnexRepo(pr.HeadRepo.RepoPath()) { - if err := AnnexPush(ctx, mergeCtx.tmpBasePath, mergeHeadSHA, mergeBaseSHA); err != nil { - return "", err - } - } - var headUser *user_model.User err = pr.HeadRepo.LoadOwner(ctx) if err != nil { diff --git a/services/pull/merge_ff_only.go b/services/pull/merge_ff_only.go index 1e1c337889..f57c732104 100644 --- a/services/pull/merge_ff_only.go +++ b/services/pull/merge_ff_only.go @@ -4,9 +4,9 @@ package pull import ( - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) // doMergeStyleFastForwardOnly merges the tracking into the current HEAD - which is assumed to be staging branch (equal to the pr.BaseBranch) diff --git a/services/pull/merge_merge.go b/services/pull/merge_merge.go index 713e1f175d..bf56c071db 100644 --- a/services/pull/merge_merge.go +++ b/services/pull/merge_merge.go @@ -4,9 +4,9 @@ package pull import ( - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) // doMergeStyleMerge merges the tracking branch into the current HEAD - which is assumed to be the staging branch (equal to the pr.BaseBranch) diff --git a/services/pull/merge_prepare.go b/services/pull/merge_prepare.go index fb09515dbd..88f6c037eb 100644 --- a/services/pull/merge_prepare.go +++ b/services/pull/merge_prepare.go @@ -14,13 +14,13 @@ import ( "strings" "time" - "forgejo.org/models" - 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/log" - asymkey_service "forgejo.org/services/asymkey" + "code.gitea.io/gitea/models" + 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/log" + asymkey_service "code.gitea.io/gitea/services/asymkey" ) type mergeContext struct { diff --git a/services/pull/merge_rebase.go b/services/pull/merge_rebase.go index 088934cdfb..ecf376220e 100644 --- a/services/pull/merge_rebase.go +++ b/services/pull/merge_rebase.go @@ -7,10 +7,10 @@ import ( "fmt" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" + 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/log" ) // getRebaseAmendMessage composes the message to amend commits in rebase merge of a pull request. diff --git a/services/pull/merge_squash.go b/services/pull/merge_squash.go index 1c6f734a25..197d8102dd 100644 --- a/services/pull/merge_squash.go +++ b/services/pull/merge_squash.go @@ -5,15 +5,14 @@ package pull import ( "fmt" - "strings" - 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/log" - "forgejo.org/modules/setting" + 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/log" + "code.gitea.io/gitea/modules/setting" ) // doMergeStyleSquash gets a commit author signature for squash commits @@ -67,10 +66,7 @@ func doMergeStyleSquash(ctx *mergeContext, message string) error { if setting.Repository.PullRequest.AddCoCommitterTrailers && ctx.committer.String() != sig.String() { // add trailer - if !strings.Contains(message, fmt.Sprintf("Co-authored-by: %s", sig.String())) { - message += fmt.Sprintf("\nCo-authored-by: %s", sig.String()) - } - message += fmt.Sprintf("\nCo-committed-by: %s\n", sig.String()) + message += fmt.Sprintf("\nCo-authored-by: %s\nCo-committed-by: %s\n", sig.String(), sig.String()) } cmdCommit := git.NewCommand(ctx, "commit"). AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email). diff --git a/services/pull/patch.go b/services/pull/patch.go index 35d1b101e2..e90b4bdbbe 100644 --- a/services/pull/patch.go +++ b/services/pull/patch.go @@ -13,18 +13,18 @@ import ( "path/filepath" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unit" - "forgejo.org/modules/container" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/container" + "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" + "code.gitea.io/gitea/modules/util" "github.com/gobwas/glob" ) diff --git a/services/pull/patch_unmerged.go b/services/pull/patch_unmerged.go index caa0318c48..c60c48d923 100644 --- a/services/pull/patch_unmerged.go +++ b/services/pull/patch_unmerged.go @@ -13,8 +13,8 @@ import ( "strconv" "strings" - "forgejo.org/modules/git" - "forgejo.org/modules/log" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" ) // lsFileLine is a Quadruplet struct (+error) representing a partially parsed line from ls-files diff --git a/services/pull/pull.go b/services/pull/pull.go index 18f63cf95d..6af7d8ba0c 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -13,27 +13,27 @@ import ( "strings" "time" - "forgejo.org/models" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/container" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/sync" - "forgejo.org/modules/util" - gitea_context "forgejo.org/services/context" - issue_service "forgejo.org/services/issue" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + "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" + 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/gitrepo" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/sync" + "code.gitea.io/gitea/modules/util" + gitea_context "code.gitea.io/gitea/services/context" + issue_service "code.gitea.io/gitea/services/issue" + notify_service "code.gitea.io/gitea/services/notify" ) // TODO: use clustered lock (unique queue? or *abuse* cache) diff --git a/services/pull/pull_test.go b/services/pull/pull_test.go index 010b7a6404..c51619e7f6 100644 --- a/services/pull/pull_test.go +++ b/services/pull/pull_test.go @@ -7,13 +7,13 @@ package pull import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" + "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/unit" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/pull/review.go b/services/pull/review.go index d61d9623b6..927c43150b 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -11,17 +11,17 @@ import ( "regexp" "strings" - "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" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + "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" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" ) var notEnoughLines = regexp.MustCompile(`fatal: file .* has only \d+ lines?`) diff --git a/services/pull/review_test.go b/services/pull/review_test.go index 0d9fe7f902..4cb3ad007c 100644 --- a/services/pull/review_test.go +++ b/services/pull/review_test.go @@ -6,11 +6,11 @@ package pull_test import ( "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - pull_service "forgejo.org/services/pull" + "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" + pull_service "code.gitea.io/gitea/services/pull" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/pull/temp_repo.go b/services/pull/temp_repo.go index 1805ffc527..36bdbde55c 100644 --- a/services/pull/temp_repo.go +++ b/services/pull/temp_repo.go @@ -11,12 +11,12 @@ import ( "path/filepath" "strings" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" + 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/modules/git" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" ) // Temporary repos created here use standard branch names to help simplify diff --git a/services/pull/update.go b/services/pull/update.go index 1b4b6b039d..dbc1b711e2 100644 --- a/services/pull/update.go +++ b/services/pull/update.go @@ -7,15 +7,15 @@ import ( "context" "fmt" - git_model "forgejo.org/models/git" - 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/git" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" + git_model "code.gitea.io/gitea/models/git" + 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/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" ) // Update updates pull request with base branch. diff --git a/services/pull/update_rebase.go b/services/pull/update_rebase.go index b12613985a..3e2a7be132 100644 --- a/services/pull/update_rebase.go +++ b/services/pull/update_rebase.go @@ -8,13 +8,13 @@ import ( "fmt" "strings" - 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/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" + 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/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" ) // updateHeadByRebaseOnToBase handles updating a PR's head branch by rebasing it on the PR current base branch diff --git a/services/release/release.go b/services/release/release.go index f0682c4dca..99851ed1b7 100644 --- a/services/release/release.go +++ b/services/release/release.go @@ -9,22 +9,22 @@ import ( "fmt" "strings" - "forgejo.org/models" - "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/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/storage" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/services/attachment" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + "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/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/attachment" + notify_service "code.gitea.io/gitea/services/notify" ) type AttachmentChange struct { @@ -151,7 +151,6 @@ func CreateRelease(gitRepo *git.Repository, rel *repo_model.Release, msg string, return err } - rel.Title, _ = util.SplitStringAtByteN(rel.Title, 255) rel.LowerTagName = strings.ToLower(rel.TagName) if err = db.Insert(gitRepo.Ctx, rel); err != nil { return err @@ -372,7 +371,7 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo return err } - for uuid := range delAttachmentUUIDs.Seq() { + for _, uuid := range delAttachmentUUIDs.Values() { if err := storage.Attachments.Delete(repo_model.AttachmentRelativePath(uuid)); err != nil { // Even delete files failed, but the attachments has been removed from database, so we // should not return error but only record the error on logs. diff --git a/services/release/release_test.go b/services/release/release_test.go index 66106eb606..026bba8258 100644 --- a/services/release/release_test.go +++ b/services/release/release_test.go @@ -8,16 +8,15 @@ import ( "testing" "time" - "forgejo.org/models/db" - 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/services/attachment" + "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" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/services/attachment" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/release/tag.go b/services/release/tag.go index e1608d1897..dae2b70f76 100644 --- a/services/release/tag.go +++ b/services/release/tag.go @@ -8,12 +8,12 @@ import ( "errors" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - repo_module "forgejo.org/modules/repository" + "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" + "code.gitea.io/gitea/modules/queue" + repo_module "code.gitea.io/gitea/modules/repository" "xorm.io/builder" ) diff --git a/services/remote/promote.go b/services/remote/promote.go index f37d00168c..eb41ace462 100644 --- a/services/remote/promote.go +++ b/services/remote/promote.go @@ -6,12 +6,12 @@ package remote import ( "context" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - "forgejo.org/services/auth/source/oauth2" - remote_source "forgejo.org/services/auth/source/remote" + auth_model "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/log" + "code.gitea.io/gitea/services/auth/source/oauth2" + remote_source "code.gitea.io/gitea/services/auth/source/remote" ) type Reason int @@ -98,7 +98,7 @@ func getRemoteUserToPromote(ctx context.Context, source *auth_model.Source, logi return nil, NewReason(log.ERROR, ReasonErrorLoginName, "getUserByLoginName('%s') %v", loginName, err), err } if len(users) == 0 { - return nil, NewReason(log.DEBUG, ReasonLoginNameNotExists, "no user with LoginType UserTypeRemoteUser and LoginName '%s'", loginName), nil + return nil, NewReason(log.ERROR, ReasonLoginNameNotExists, "no user with LoginType UserTypeRemoteUser and LoginName '%s'", loginName), nil } reason := ReasonNoSource diff --git a/services/repository/adopt.go b/services/repository/adopt.go index 3651b018e6..3d6fe71a09 100644 --- a/services/repository/adopt.go +++ b/services/repository/adopt.go @@ -11,19 +11,19 @@ import ( "path/filepath" "strings" - "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/log" - "forgejo.org/modules/optional" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + "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/log" + "code.gitea.io/gitea/modules/optional" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" "github.com/gobwas/glob" ) diff --git a/services/repository/adopt_test.go b/services/repository/adopt_test.go index a66b4c5ac0..71fb1fc885 100644 --- a/services/repository/adopt_test.go +++ b/services/repository/adopt_test.go @@ -8,11 +8,11 @@ import ( "path" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/archiver/archiver.go b/services/repository/archiver/archiver.go index cffb07210f..c74712b4ba 100644 --- a/services/repository/archiver/archiver.go +++ b/services/repository/archiver/archiver.go @@ -12,16 +12,16 @@ import ( "strings" "time" - "forgejo.org/models/db" - 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/queue" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/models/db" + 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/queue" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" ) // ArchiveRequest defines the parameters of an archive request, which notably @@ -68,36 +68,30 @@ func (e RepoRefNotFoundError) Is(err error) bool { return ok } -func ParseFileName(uri string) (ext string, tp git.ArchiveType, err error) { +// NewRequest creates an archival request, based on the URI. The +// resulting ArchiveRequest is suitable for being passed to ArchiveRepository() +// if it's determined that the request still needs to be satisfied. +func NewRequest(ctx context.Context, repoID int64, repo *git.Repository, uri string) (*ArchiveRequest, error) { + r := &ArchiveRequest{ + RepoID: repoID, + } + + var ext string switch { case strings.HasSuffix(uri, ".zip"): ext = ".zip" - tp = git.ZIP + r.Type = git.ZIP case strings.HasSuffix(uri, ".tar.gz"): ext = ".tar.gz" - tp = git.TARGZ + r.Type = git.TARGZ case strings.HasSuffix(uri, ".bundle"): ext = ".bundle" - tp = git.BUNDLE + r.Type = git.BUNDLE default: - return "", 0, ErrUnknownArchiveFormat{RequestFormat: uri} - } - return ext, tp, nil -} - -// NewRequest creates an archival request, based on the URI. The -// resulting ArchiveRequest is suitable for being passed to Await() -// if it's determined that the request still needs to be satisfied. -func NewRequest(ctx context.Context, repoID int64, repo *git.Repository, refName string, fileType git.ArchiveType) (*ArchiveRequest, error) { - if fileType < git.ZIP || fileType > git.BUNDLE { - return nil, ErrUnknownArchiveFormat{RequestFormat: fileType.String()} + return nil, ErrUnknownArchiveFormat{RequestFormat: uri} } - r := &ArchiveRequest{ - RepoID: repoID, - refName: refName, - Type: fileType, - } + r.refName = strings.TrimSuffix(uri, ext) // Get corresponding commit. commitID, err := repo.ConvertToGitID(r.refName) @@ -174,14 +168,13 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver } } -// doArchive satisfies the ArchiveRequest being passed in. Processing -// will occur in a separate goroutine, as this phase may take a while to -// complete. If the archive already exists, doArchive will not do -// anything. In all cases, the caller should be examining the *ArchiveRequest -// being returned for completion, as it may be different than the one they passed -// in. func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver, error) { - ctx, _, finished := process.GetManager().AddContext(ctx, fmt.Sprintf("ArchiveRequest[%d]: %s", r.RepoID, r.GetArchiveName())) + txCtx, committer, err := db.TxContext(ctx) + if err != nil { + return nil, err + } + defer committer.Close() + ctx, _, finished := process.GetManager().AddContext(txCtx, fmt.Sprintf("ArchiveRequest[%d]: %s", r.RepoID, r.GetArchiveName())) defer finished() archiver, err := repo_model.GetRepoArchiver(ctx, r.RepoID, r.Type, r.CommitID) @@ -216,7 +209,7 @@ func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver return nil, err } } - return archiver, nil + return archiver, committer.Commit() } if !errors.Is(err, os.ErrNotExist) { @@ -285,7 +278,17 @@ func doArchive(ctx context.Context, r *ArchiveRequest) (*repo_model.RepoArchiver } } - return archiver, nil + return archiver, committer.Commit() +} + +// ArchiveRepository satisfies the ArchiveRequest being passed in. Processing +// will occur in a separate goroutine, as this phase may take a while to +// complete. If the archive already exists, ArchiveRepository will not do +// anything. In all cases, the caller should be examining the *ArchiveRequest +// being returned for completion, as it may be different than the one they passed +// in. +func ArchiveRepository(ctx context.Context, request *ArchiveRequest) (*repo_model.RepoArchiver, error) { + return doArchive(ctx, request) } var archiverQueue *queue.WorkerPoolQueue[*ArchiveRequest] @@ -295,10 +298,8 @@ func Init(ctx context.Context) error { handler := func(items ...*ArchiveRequest) []*ArchiveRequest { for _, archiveReq := range items { log.Trace("ArchiverData Process: %#v", archiveReq) - if archiver, err := doArchive(ctx, archiveReq); err != nil { + if _, err := doArchive(ctx, archiveReq); err != nil { log.Error("Archive %v failed: %v", archiveReq, err) - } else { - log.Trace("ArchiverData Success: %#v", archiver) } } return nil diff --git a/services/repository/archiver/archiver_test.go b/services/repository/archiver/archiver_test.go index ec4da2404f..9f822a31ce 100644 --- a/services/repository/archiver/archiver_test.go +++ b/services/repository/archiver/archiver_test.go @@ -7,13 +7,11 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/services/contexttest" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,47 +31,47 @@ func TestArchive_Basic(t *testing.T) { contexttest.LoadGitRepo(t, ctx) defer ctx.Repo.GitRepo.Close() - bogusReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, git.ZIP) + bogusReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip") require.NoError(t, err) assert.NotNil(t, bogusReq) assert.EqualValues(t, firstCommit+".zip", bogusReq.GetArchiveName()) // Check a series of bogus requests. // Step 1, valid commit with a bad extension. - bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, 100) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".dilbert") require.Error(t, err) assert.Nil(t, bogusReq) // Step 2, missing commit. - bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "dbffff", git.ZIP) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "dbffff.zip") require.Error(t, err) assert.Nil(t, bogusReq) // Step 3, doesn't look like branch/tag/commit. - bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "db", git.ZIP) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "db.zip") require.Error(t, err) assert.Nil(t, bogusReq) - bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "master", git.ZIP) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "master.zip") require.NoError(t, err) assert.NotNil(t, bogusReq) assert.EqualValues(t, "master.zip", bogusReq.GetArchiveName()) - bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "test/archive", git.ZIP) + bogusReq, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, "test/archive.zip") require.NoError(t, err) assert.NotNil(t, bogusReq) assert.EqualValues(t, "test-archive.zip", bogusReq.GetArchiveName()) // Now two valid requests, firstCommit with valid extensions. - zipReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, git.ZIP) + zipReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip") require.NoError(t, err) assert.NotNil(t, zipReq) - tgzReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, git.TARGZ) + tgzReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".tar.gz") require.NoError(t, err) assert.NotNil(t, tgzReq) - secondReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit, git.ZIP) + secondReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit+".zip") require.NoError(t, err) assert.NotNil(t, secondReq) @@ -82,18 +80,18 @@ func TestArchive_Basic(t *testing.T) { inFlight[1] = tgzReq inFlight[2] = secondReq - doArchive(db.DefaultContext, zipReq) - doArchive(db.DefaultContext, tgzReq) - doArchive(db.DefaultContext, secondReq) + ArchiveRepository(db.DefaultContext, zipReq) + ArchiveRepository(db.DefaultContext, tgzReq) + ArchiveRepository(db.DefaultContext, secondReq) // Make sure sending an unprocessed request through doesn't affect the queue // count. - doArchive(db.DefaultContext, zipReq) + ArchiveRepository(db.DefaultContext, zipReq) // Sleep two seconds to make sure the queue doesn't change. time.Sleep(2 * time.Second) - zipReq2, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, git.ZIP) + zipReq2, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip") require.NoError(t, err) // This zipReq should match what's sitting in the queue, as we haven't // let it release yet. From the consumer's point of view, this looks like @@ -103,17 +101,17 @@ func TestArchive_Basic(t *testing.T) { // We still have the other three stalled at completion, waiting to remove // from archiveInProgress. Try to submit this new one before its // predecessor has cleared out of the queue. - doArchive(db.DefaultContext, zipReq2) + ArchiveRepository(db.DefaultContext, zipReq2) // Now we'll submit a request and TimedWaitForCompletion twice, before and // after we release it. We should trigger both the timeout and non-timeout // cases. - timedReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit, git.TARGZ) + timedReq, err := NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, secondCommit+".tar.gz") require.NoError(t, err) assert.NotNil(t, timedReq) - doArchive(db.DefaultContext, timedReq) + ArchiveRepository(db.DefaultContext, timedReq) - zipReq2, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit, git.ZIP) + zipReq2, err = NewRequest(ctx, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, firstCommit+".zip") require.NoError(t, err) // Now, we're guaranteed to have released the original zipReq from the queue. // Ensure that we don't get handed back the released entry somehow, but they diff --git a/services/repository/avatar.go b/services/repository/avatar.go index a1cd3228df..38c2621bc4 100644 --- a/services/repository/avatar.go +++ b/services/repository/avatar.go @@ -8,12 +8,13 @@ import ( "fmt" "io" "strconv" + "strings" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/avatar" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/avatar" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/storage" ) // UploadAvatar saves custom avatar for repository. @@ -106,18 +107,7 @@ func RemoveRandomAvatars(ctx context.Context) error { // generateAvatar generates the avatar from a template repository func generateAvatar(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error { - file, err := storage.RepoAvatars.Open(templateRepo.CustomAvatarRelativePath()) - if err != nil { - return err - } - defer file.Close() - - data, err := io.ReadAll(file) - if err != nil { - return err - } - - generateRepo.Avatar = avatar.HashAvatar(generateRepo.ID, data) + generateRepo.Avatar = strings.Replace(templateRepo.Avatar, strconv.FormatInt(templateRepo.ID, 10), strconv.FormatInt(generateRepo.ID, 10), 1) if _, err := storage.Copy(storage.RepoAvatars, generateRepo.CustomAvatarRelativePath(), storage.RepoAvatars, templateRepo.CustomAvatarRelativePath()); err != nil { return err } diff --git a/services/repository/avatar_test.go b/services/repository/avatar_test.go index e5fcf7f239..f0fe991de8 100644 --- a/services/repository/avatar_test.go +++ b/services/repository/avatar_test.go @@ -9,10 +9,10 @@ import ( "image/png" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/avatar" + "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/avatar" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -29,7 +29,7 @@ func TestUploadAvatar(t *testing.T) { err := UploadAvatar(db.DefaultContext, repo, buff.Bytes()) require.NoError(t, err) - assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar) + assert.Equal(t, avatar.HashAvatar(10, buff.Bytes()), repo.Avatar) } func TestUploadBigAvatar(t *testing.T) { @@ -62,27 +62,3 @@ func TestDeleteAvatar(t *testing.T) { assert.Equal(t, "", repo.Avatar) } - -func TestTemplateGenerateAvatar(t *testing.T) { - // Generate image - myImage := image.NewRGBA(image.Rect(0, 0, 1, 1)) - var buff bytes.Buffer - png.Encode(&buff, myImage) - - require.NoError(t, unittest.PrepareTestDatabase()) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10}) - - // Upload Avatar - err := UploadAvatar(db.DefaultContext, repo, buff.Bytes()) - require.NoError(t, err) - assert.Equal(t, avatar.HashAvatar(repo.ID, buff.Bytes()), repo.Avatar) - - // Generate the Avatar for Another Repo - genRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 11}) - err = generateAvatar(db.DefaultContext, repo, genRepo) - require.NoError(t, err) - assert.Equal(t, avatar.HashAvatar(genRepo.ID, buff.Bytes()), genRepo.Avatar) - - // Make sure The 2 Hashes are not the same - assert.NotEqual(t, repo.Avatar, genRepo.Avatar) -} diff --git a/services/repository/branch.go b/services/repository/branch.go index 689f35803d..7d92053178 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -9,28 +9,28 @@ import ( "fmt" "strings" - "forgejo.org/models" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/queue" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + actions_model "code.gitea.io/gitea/models/actions" + "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/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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/queue" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" + files_service "code.gitea.io/gitea/services/repository/files" "xorm.io/builder" ) @@ -254,7 +254,7 @@ func SyncBranchesToDB(ctx context.Context, repoID, pusherID int64, branchNames, } return db.WithTx(ctx, func(ctx context.Context) error { - branches, err := git_model.GetBranches(ctx, repoID, branchNames, true) + branches, err := git_model.GetBranches(ctx, repoID, branchNames) if err != nil { return fmt.Errorf("git_model.GetBranches: %v", err) } @@ -479,7 +479,7 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R return nil } -// DeleteBranchAfterMerge deletes the head branch after a PR was merged associated with the head branch. +// DeleteBranchAfterMerge deletes the head branch after a PR was merged assiociated with the head branch. func DeleteBranchAfterMerge(ctx context.Context, doer *user_model.User, pr *issues_model.PullRequest, headRepo *git.Repository) error { // Don't cleanup when there are other PR's that use this branch as head branch. exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pr.HeadRepoID, pr.HeadBranch) @@ -588,7 +588,12 @@ func SetRepoDefaultBranch(ctx context.Context, repo *repo_model.Repository, gitR log.Error("CancelPreviousJobs: %v", err) } - return gitrepo.SetDefaultBranch(ctx, repo, newBranchName) + if err := gitrepo.SetDefaultBranch(ctx, repo, newBranchName); err != nil { + if !git.IsErrUnsupportedVersion(err) { + return err + } + } + return nil }); err != nil { return err } diff --git a/services/repository/cache.go b/services/repository/cache.go index cd5b95afa3..b0811a99fc 100644 --- a/services/repository/cache.go +++ b/services/repository/cache.go @@ -6,9 +6,9 @@ package repository import ( "context" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/git" ) // CacheRef cachhe last commit information of the branch or the tag diff --git a/services/repository/check.go b/services/repository/check.go index 7e680f3c58..5cdcc14679 100644 --- a/services/repository/check.go +++ b/services/repository/check.go @@ -9,14 +9,14 @@ import ( "strings" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) diff --git a/services/repository/collaboration.go b/services/repository/collaboration.go index 7a0d7edb7f..dccc124748 100644 --- a/services/repository/collaboration.go +++ b/services/repository/collaboration.go @@ -7,10 +7,10 @@ package repository import ( "context" - "forgejo.org/models" - "forgejo.org/models/db" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" ) // DeleteCollaboration removes collaboration relation between the user and repository. diff --git a/services/repository/collaboration_test.go b/services/repository/collaboration_test.go index b27b91be23..c087018be4 100644 --- a/services/repository/collaboration_test.go +++ b/services/repository/collaboration_test.go @@ -6,9 +6,9 @@ package repository import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/require" ) diff --git a/services/repository/commit.go b/services/repository/commit.go index 0ff4ea701e..e8c0262ef4 100644 --- a/services/repository/commit.go +++ b/services/repository/commit.go @@ -7,8 +7,8 @@ import ( "context" "fmt" - "forgejo.org/modules/util" - gitea_ctx "forgejo.org/services/context" + "code.gitea.io/gitea/modules/util" + gitea_ctx "code.gitea.io/gitea/services/context" ) type ContainedLinks struct { // TODO: better name? diff --git a/services/repository/commitstatus/commitstatus.go b/services/repository/commitstatus/commitstatus.go index 03a62d0410..5c630201d2 100644 --- a/services/repository/commitstatus/commitstatus.go +++ b/services/repository/commitstatus/commitstatus.go @@ -9,17 +9,17 @@ import ( "fmt" "slices" - "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/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - shared_automerge "forgejo.org/services/shared/automerge" + "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/cache" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/automerge" ) func getCacheKey(repoID int64, brancheName string) string { @@ -117,7 +117,7 @@ func CreateCommitStatus(ctx context.Context, repo *repo_model.Repository, creato } if status.State.IsSuccess() { - if err := shared_automerge.StartPRCheckAndAutoMergeBySHA(ctx, sha, repo); err != nil { + if err := automerge.StartPRCheckAndAutoMergeBySHA(ctx, sha, repo); err != nil { return fmt.Errorf("MergeScheduledPullRequest[repo_id: %d, user_id: %d, sha: %s]: %w", repo.ID, creator.ID, sha, err) } } diff --git a/services/repository/contributors_graph.go b/services/repository/contributors_graph.go index ad4cc400cb..48871813bd 100644 --- a/services/repository/contributors_graph.go +++ b/services/repository/contributors_graph.go @@ -14,16 +14,16 @@ import ( "sync" "time" - "forgejo.org/models/avatars" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/avatars" + 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" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" "code.forgejo.org/go-chi/cache" ) diff --git a/services/repository/contributors_graph_test.go b/services/repository/contributors_graph_test.go index 927c950bec..8cfe69d284 100644 --- a/services/repository/contributors_graph_test.go +++ b/services/repository/contributors_graph_test.go @@ -8,12 +8,12 @@ import ( "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/test" + "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/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/test" "code.forgejo.org/go-chi/cache" "github.com/stretchr/testify/assert" @@ -43,7 +43,7 @@ func TestRepository_ContributorsGraph(t *testing.T) { dataString, isData := mockCache.Get("key2").(string) assert.True(t, isData) // Verify that JSON is actually stored in the cache. - assert.JSONEq(t, `{"ethantkoenig@gmail.com":{"name":"Ethan Koenig","login":"","avatar_link":"/assets/img/avatar_default.png","home_link":"","total_commits":1,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1}}},"jimmy.praet@telenet.be":{"name":"Jimmy Praet","login":"","avatar_link":"/assets/img/avatar_default.png","home_link":"","total_commits":1,"weeks":{"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}},"jon@allspice.io":{"name":"Jon","login":"","avatar_link":"/assets/img/avatar_default.png","home_link":"","total_commits":1,"weeks":{"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1}}},"total":{"name":"Total","login":"","avatar_link":"","home_link":"","total_commits":3,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1},"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1},"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}}}`, dataString) + assert.EqualValues(t, `{"ethantkoenig@gmail.com":{"name":"Ethan Koenig","login":"","avatar_link":"https://secure.gravatar.com/avatar/b42fb195faa8c61b8d88abfefe30e9e3?d=identicon","home_link":"","total_commits":1,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1}}},"jimmy.praet@telenet.be":{"name":"Jimmy Praet","login":"","avatar_link":"https://secure.gravatar.com/avatar/93c49b7c89eb156971d11161c9b52795?d=identicon","home_link":"","total_commits":1,"weeks":{"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}},"jon@allspice.io":{"name":"Jon","login":"","avatar_link":"https://secure.gravatar.com/avatar/00388ce725e6886f3e07c3733007289b?d=identicon","home_link":"","total_commits":1,"weeks":{"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1}}},"total":{"name":"Total","login":"","avatar_link":"","home_link":"","total_commits":3,"weeks":{"1511654400000":{"week":1511654400000,"additions":3,"deletions":0,"commits":1},"1607817600000":{"week":1607817600000,"additions":10,"deletions":0,"commits":1},"1624752000000":{"week":1624752000000,"additions":2,"deletions":0,"commits":1}}}}`, dataString) var data map[string]*ContributorData require.NoError(t, json.Unmarshal([]byte(dataString), &data)) @@ -62,7 +62,7 @@ func TestRepository_ContributorsGraph(t *testing.T) { assert.EqualValues(t, &ContributorData{ Name: "Ethan Koenig", - AvatarLink: "/assets/img/avatar_default.png", + AvatarLink: "https://secure.gravatar.com/avatar/b42fb195faa8c61b8d88abfefe30e9e3?d=identicon", TotalCommits: 1, Weeks: map[int64]*WeekData{ 1511654400000: { diff --git a/services/repository/create.go b/services/repository/create.go index 4491b12497..d092d02a1f 100644 --- a/services/repository/create.go +++ b/services/repository/create.go @@ -12,18 +12,18 @@ import ( "strings" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/options" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/templates/vars" - "forgejo.org/modules/util" + "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/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/options" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/templates/vars" + "code.gitea.io/gitea/modules/util" ) // CreateRepoOptions contains the create repository options @@ -45,7 +45,6 @@ type CreateRepoOptions struct { TrustModel repo_model.TrustModelType MirrorInterval string ObjectFormatName string - Website string } func prepareRepoCommit(ctx context.Context, repo *repo_model.Repository, tmpDir, repoPath string, opts CreateRepoOptions) error { @@ -239,7 +238,6 @@ func CreateRepositoryDirectly(ctx context.Context, doer, u *user_model.User, opt DefaultBranch: opts.DefaultBranch, WikiBranch: setting.Repository.DefaultBranch, ObjectFormatName: opts.ObjectFormatName, - Website: opts.Website, } var rollbackRepo *repo_model.Repository diff --git a/services/repository/create_test.go b/services/repository/create_test.go index 7eb3c0f805..9cde285181 100644 --- a/services/repository/create_test.go +++ b/services/repository/create_test.go @@ -7,13 +7,13 @@ import ( "fmt" "testing" - "forgejo.org/models" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/delete.go b/services/repository/delete.go index 7c83ba12cd..6e84194750 100644 --- a/services/repository/delete.go +++ b/services/repository/delete.go @@ -7,29 +7,27 @@ import ( "context" "fmt" - "forgejo.org/models" - actions_model "forgejo.org/models/actions" - activities_model "forgejo.org/models/activities" - admin_model "forgejo.org/models/admin" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - access_model "forgejo.org/models/perm/access" - project_model "forgejo.org/models/project" - repo_model "forgejo.org/models/repo" - secret_model "forgejo.org/models/secret" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - federation_service "forgejo.org/services/federation" + "code.gitea.io/gitea/models" + actions_model "code.gitea.io/gitea/models/actions" + activities_model "code.gitea.io/gitea/models/activities" + admin_model "code.gitea.io/gitea/models/admin" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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" + secret_model "code.gitea.io/gitea/models/secret" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/models/webhook" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" "xorm.io/builder" ) @@ -291,15 +289,6 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID return err } - if err := federation_service.DeleteFollowingRepos(ctx, repo.ID); err != nil { - return err - } - - // unlink packages linked to this repository - if err = packages_model.UnlinkRepositoryFromAllPackages(ctx, repoID); err != nil { - return err - } - if err = committer.Commit(); err != nil { return err } diff --git a/services/repository/files/cherry_pick.go b/services/repository/files/cherry_pick.go index b6d54c4086..451a182155 100644 --- a/services/repository/files/cherry_pick.go +++ b/services/repository/files/cherry_pick.go @@ -8,13 +8,13 @@ import ( "fmt" "strings" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" - "forgejo.org/services/pull" + "code.gitea.io/gitea/models" + 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/structs" + "code.gitea.io/gitea/services/pull" ) // CherryPick cherrypicks or reverts a commit to the given repository diff --git a/services/repository/files/commit.go b/services/repository/files/commit.go index 0c0671429b..e0dad29273 100644 --- a/services/repository/files/commit.go +++ b/services/repository/files/commit.go @@ -6,10 +6,10 @@ package files import ( "context" - asymkey_model "forgejo.org/models/asymkey" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/structs" + asymkey_model "code.gitea.io/gitea/models/asymkey" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/structs" ) // CountDivergingCommits determines how many commits a branch is ahead or behind the repository's base branch diff --git a/services/repository/files/content.go b/services/repository/files/content.go index 3eb3049f12..32517e8d91 100644 --- a/services/repository/files/content.go +++ b/services/repository/files/content.go @@ -10,13 +10,13 @@ import ( "path" "strings" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + "code.gitea.io/gitea/models" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" ) // ContentType repo content type diff --git a/services/repository/files/content_test.go b/services/repository/files/content_test.go index ca2f861c0b..c22dcd2e8d 100644 --- a/services/repository/files/content_test.go +++ b/services/repository/files/content_test.go @@ -6,14 +6,13 @@ package files import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/gitrepo" - api "forgejo.org/modules/structs" + "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/gitrepo" + api "code.gitea.io/gitea/modules/structs" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/files/diff.go b/services/repository/files/diff.go index 354a343d12..bf8b938e21 100644 --- a/services/repository/files/diff.go +++ b/services/repository/files/diff.go @@ -7,8 +7,8 @@ import ( "context" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/services/gitdiff" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/services/gitdiff" ) // GetDiffPreview produces and returns diff result of a file which is not yet committed. diff --git a/services/repository/files/diff_test.go b/services/repository/files/diff_test.go index d6265273c7..95de10e07e 100644 --- a/services/repository/files/diff_test.go +++ b/services/repository/files/diff_test.go @@ -6,12 +6,12 @@ package files import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/json" - "forgejo.org/services/contexttest" - "forgejo.org/services/gitdiff" + "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/json" + "code.gitea.io/gitea/services/contexttest" + "code.gitea.io/gitea/services/gitdiff" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/files/file.go b/services/repository/files/file.go index 810c60163d..852cca0371 100644 --- a/services/repository/files/file.go +++ b/services/repository/files/file.go @@ -10,11 +10,11 @@ import ( "strings" "time" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" ) func GetFilesResponseFromCommit(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, branch string, treeNames []string) (*api.FilesResponse, error) { @@ -33,6 +33,19 @@ func GetFilesResponseFromCommit(ctx context.Context, repo *repo_model.Repository return filesResponse, nil } +// GetFileResponseFromCommit Constructs a FileResponse from a Commit object +func GetFileResponseFromCommit(ctx context.Context, repo *repo_model.Repository, commit *git.Commit, branch, treeName string) (*api.FileResponse, error) { + fileContents, _ := GetContents(ctx, repo, treeName, branch, false) // ok if fails, then will be nil + fileCommitResponse, _ := GetFileCommitResponse(repo, commit) // ok if fails, then will be nil + verification := GetPayloadCommitVerification(ctx, commit) + fileResponse := &api.FileResponse{ + Content: fileContents, + Commit: fileCommitResponse, + Verification: verification, + } + return fileResponse, nil +} + // constructs a FileResponse with the file at the index from FilesResponse func GetFileResponseFromFilesResponse(filesResponse *api.FilesResponse, index int) *api.FileResponse { content := &api.ContentsResponse{} diff --git a/services/repository/files/file_test.go b/services/repository/files/file_test.go index db2f4403f4..7c387e2dd5 100644 --- a/services/repository/files/file_test.go +++ b/services/repository/files/file_test.go @@ -6,7 +6,15 @@ package files 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/gitrepo" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestCleanUploadFileName(t *testing.T) { @@ -24,3 +32,84 @@ func TestCleanUploadFileName(t *testing.T) { assert.EqualValues(t, expectedCleanName, cleanName) }) } + +func getExpectedFileResponse() *api.FileResponse { + treePath := "README.md" + sha := "4b4851ad51df6a7d9f25c979345979eaeb5b349f" + encoding := "base64" + content := "IyByZXBvMQoKRGVzY3JpcHRpb24gZm9yIHJlcG8x" + selfURL := setting.AppURL + "api/v1/repos/user2/repo1/contents/" + treePath + "?ref=master" + htmlURL := setting.AppURL + "user2/repo1/src/branch/master/" + treePath + gitURL := setting.AppURL + "api/v1/repos/user2/repo1/git/blobs/" + sha + downloadURL := setting.AppURL + "user2/repo1/raw/branch/master/" + treePath + return &api.FileResponse{ + Content: &api.ContentsResponse{ + Name: treePath, + Path: treePath, + SHA: sha, + LastCommitSHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d", + Type: "file", + Size: 30, + Encoding: &encoding, + Content: &content, + URL: &selfURL, + HTMLURL: &htmlURL, + GitURL: &gitURL, + DownloadURL: &downloadURL, + Links: &api.FileLinksResponse{ + Self: &selfURL, + GitURL: &gitURL, + HTMLURL: &htmlURL, + }, + }, + Commit: &api.FileCommitResponse{ + CommitMeta: api.CommitMeta{ + URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/commits/65f1bf27bc3bf70f64657658635e66094edbcb4d", + SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d", + }, + HTMLURL: "https://try.gitea.io/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d", + Author: &api.CommitUser{ + Identity: api.Identity{ + Name: "user1", + Email: "address1@example.com", + }, + Date: "2017-03-19T20:47:59Z", + }, + Committer: &api.CommitUser{ + Identity: api.Identity{ + Name: "Ethan Koenig", + Email: "ethantkoenig@gmail.com", + }, + Date: "2017-03-19T20:47:59Z", + }, + Parents: []*api.CommitMeta{}, + Message: "Initial commit\n", + Tree: &api.CommitMeta{ + URL: "https://try.gitea.io/api/v1/repos/user2/repo1/git/trees/2a2f1d4670728a2e10049e345bd7a276468beab6", + SHA: "2a2f1d4670728a2e10049e345bd7a276468beab6", + }, + }, + Verification: &api.PayloadCommitVerification{ + Verified: false, + Reason: "gpg.error.not_signed_commit", + Signature: "", + Payload: "", + }, + } +} + +func TestGetFileResponseFromCommit(t *testing.T) { + unittest.PrepareTestEnv(t) + + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + branch := repo.DefaultBranch + treePath := "README.md" + gitRepo, _ := gitrepo.OpenRepository(db.DefaultContext, repo) + defer gitRepo.Close() + commit, _ := gitRepo.GetBranchCommit(branch) + expectedFileResponse := getExpectedFileResponse() + + fileResponse, err := GetFileResponseFromCommit(db.DefaultContext, repo, commit, branch, treePath) + require.NoError(t, err) + assert.EqualValues(t, expectedFileResponse, fileResponse) +} diff --git a/services/repository/files/patch.go b/services/repository/files/patch.go index 5b1dd65b5a..e5f7e2af96 100644 --- a/services/repository/files/patch.go +++ b/services/repository/files/patch.go @@ -8,15 +8,15 @@ import ( "fmt" "strings" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/structs" - asymkey_service "forgejo.org/services/asymkey" + "code.gitea.io/gitea/models" + 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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/structs" + asymkey_service "code.gitea.io/gitea/services/asymkey" ) // ApplyDiffPatchOptions holds the repository diff patch update options diff --git a/services/repository/files/temp_repo.go b/services/repository/files/temp_repo.go index 5840fd6a4f..38539b774e 100644 --- a/services/repository/files/temp_repo.go +++ b/services/repository/files/temp_repo.go @@ -13,15 +13,15 @@ import ( "strings" "time" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - asymkey_service "forgejo.org/services/asymkey" - "forgejo.org/services/gitdiff" + "code.gitea.io/gitea/models" + 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" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + asymkey_service "code.gitea.io/gitea/services/asymkey" + "code.gitea.io/gitea/services/gitdiff" ) // TemporaryUploadRepository is a type to wrap our upload repositories as a shallow clone @@ -232,6 +232,24 @@ func (t *TemporaryUploadRepository) WriteTree() (string, error) { return strings.TrimSpace(stdout), nil } +// GetLastCommit gets the last commit ID SHA of the repo +func (t *TemporaryUploadRepository) GetLastCommit() (string, error) { + return t.GetLastCommitByRef("HEAD") +} + +// GetLastCommitByRef gets the last commit ID SHA of the repo by ref +func (t *TemporaryUploadRepository) GetLastCommitByRef(ref string) (string, error) { + if ref == "" { + ref = "HEAD" + } + stdout, _, err := git.NewCommand(t.ctx, "rev-parse").AddDynamicArguments(ref).RunStdString(&git.RunOpts{Dir: t.basePath}) + if err != nil { + log.Error("Unable to get last ref for %s in temporary repo: %s(%s): Error: %v", ref, t.repo.FullName(), t.basePath, err) + return "", fmt.Errorf("Unable to rev-parse %s in temporary repo for: %s Error: %w", ref, t.repo.FullName(), err) + } + return strings.TrimSpace(stdout), nil +} + // CommitTree creates a commit from a given tree for the user with provided message func (t *TemporaryUploadRepository) CommitTree(parent string, author, committer *user_model.User, treeHash, message string, signoff bool) (string, error) { return t.CommitTreeWithDate(parent, author, committer, treeHash, message, signoff, time.Now(), time.Now()) @@ -345,7 +363,8 @@ func (t *TemporaryUploadRepository) Push(doer *user_model.User, commitHash, bran func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { stdoutReader, stdoutWriter, err := os.Pipe() if err != nil { - return nil, fmt.Errorf("unable to open stdout pipe: %w", err) + log.Error("Unable to open stdout pipe: %v", err) + return nil, fmt.Errorf("Unable to open stdout pipe: %w", err) } defer func() { _ = stdoutReader.Close() @@ -353,7 +372,9 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { }() stderr := new(bytes.Buffer) var diff *gitdiff.Diff - err = git.NewCommand(t.ctx, "diff-index", "--src-prefix=\\a/", "--dst-prefix=\\b/", "--cached", "-p", "HEAD"). + var finalErr error + + if err := git.NewCommand(t.ctx, "diff-index", "--src-prefix=\\a/", "--dst-prefix=\\b/", "--cached", "-p", "HEAD"). Run(&git.RunOpts{ Timeout: 30 * time.Second, Dir: t.basePath, @@ -361,20 +382,23 @@ func (t *TemporaryUploadRepository) DiffIndex() (*gitdiff.Diff, error) { Stderr: stderr, PipelineFunc: func(ctx context.Context, cancel context.CancelFunc) error { _ = stdoutWriter.Close() - defer cancel() - var diffErr error - diff, diffErr = gitdiff.ParsePatch(t.ctx, setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdoutReader, "") - _ = stdoutReader.Close() - if diffErr != nil { - // if the diffErr is not nil, it will be returned as the error of "Run()" - return fmt.Errorf("ParsePatch: %w", diffErr) + diff, finalErr = gitdiff.ParsePatch(t.ctx, setting.Git.MaxGitDiffLines, setting.Git.MaxGitDiffLineCharacters, setting.Git.MaxGitDiffFiles, stdoutReader, "") + if finalErr != nil { + log.Error("ParsePatch: %v", finalErr) + cancel() } - return nil + _ = stdoutReader.Close() + return finalErr }, - }) - if err != nil && !git.IsErrCanceledOrKilled(err) { - log.Error("Unable to diff-index in temporary repo %s (%s). Error: %v\nStderr: %s", t.repo.FullName(), t.basePath, err, stderr) - return nil, fmt.Errorf("unable to run diff-index pipeline in temporary repo: %w", err) + }); err != nil { + if finalErr != nil { + log.Error("Unable to ParsePatch in temporary repo %s (%s). Error: %v", t.repo.FullName(), t.basePath, finalErr) + return nil, finalErr + } + log.Error("Unable to run diff-index pipeline in temporary repo %s (%s). Error: %v\nStderr: %s", + t.repo.FullName(), t.basePath, err, stderr) + return nil, fmt.Errorf("Unable to run diff-index pipeline in temporary repo %s. Error: %w\nStderr: %s", + t.repo.FullName(), err, stderr) } diff.NumFiles, diff.TotalAddition, diff.TotalDeletion, err = git.GetDiffShortStat(t.ctx, t.basePath, git.TrustedCmdArgs{"--cached"}, "HEAD") diff --git a/services/repository/files/temp_repo_test.go b/services/repository/files/temp_repo_test.go index 852e762267..e7d85ea3cc 100644 --- a/services/repository/files/temp_repo_test.go +++ b/services/repository/files/temp_repo_test.go @@ -6,10 +6,10 @@ package files import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" + "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" "github.com/stretchr/testify/require" ) diff --git a/services/repository/files/tree.go b/services/repository/files/tree.go index 1e575f95e8..e3a7f3b8b0 100644 --- a/services/repository/files/tree.go +++ b/services/repository/files/tree.go @@ -8,11 +8,11 @@ import ( "fmt" "net/url" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" + "code.gitea.io/gitea/models" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" ) // GetTreeBySHA get the GitTreeResponse of a repository using a sha hash. diff --git a/services/repository/files/tree_test.go b/services/repository/files/tree_test.go index 7865fcf2e2..9e5c5c1701 100644 --- a/services/repository/files/tree_test.go +++ b/services/repository/files/tree_test.go @@ -6,9 +6,9 @@ package files import ( "testing" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/services/contexttest" + "code.gitea.io/gitea/models/unittest" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/contexttest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/files/update.go b/services/repository/files/update.go index 5e8834c6de..d6025b6ced 100644 --- a/services/repository/files/update.go +++ b/services/repository/files/update.go @@ -11,17 +11,17 @@ import ( "strings" "time" - "forgejo.org/models" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - asymkey_service "forgejo.org/services/asymkey" + "code.gitea.io/gitea/models" + 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/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/structs" + asymkey_service "code.gitea.io/gitea/services/asymkey" ) // IdentityOptions for a person's identity like an author or committer diff --git a/services/repository/files/upload.go b/services/repository/files/upload.go index 39a3f1d74d..30cd5035cc 100644 --- a/services/repository/files/upload.go +++ b/services/repository/files/upload.go @@ -6,19 +6,18 @@ package files import ( "context" "fmt" - "io" "os" "path" "path/filepath" "strings" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/annex" - "forgejo.org/modules/git" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" + 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/annex" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" ) // UploadRepoFileOptions contains the uploaded repository file options @@ -285,26 +284,7 @@ func copyUploadedFileIntoAnnexRepository(info *uploadInfo, t *TemporaryUploadRep return err } if err := os.Rename(info.upload.LocalPath(), pathInRepo); err != nil { - // Rename didn't work, try copy and remove - inputFile, err := os.Open(info.upload.LocalPath()) - if err != nil { - return fmt.Errorf("could not open source file: %v", err) - } - defer inputFile.Close() - outputFile, err := os.Create(pathInRepo) - if err != nil { - return fmt.Errorf("could not open dest file: %v", err) - } - defer outputFile.Close() - _, err = io.Copy(outputFile, inputFile) - if err != nil { - return fmt.Errorf("could not copy to dest from source: %v", err) - } - inputFile.Close() - err = os.Remove(info.upload.LocalPath()) - if err != nil { - return fmt.Errorf("could not remove source file: %v", err) - } + return err } return t.AddAnnex(pathInRepo) } diff --git a/services/repository/fork.go b/services/repository/fork.go index 9d15b6207d..0378f7bae6 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -9,17 +9,17 @@ import ( "strings" "time" - "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/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/structs" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" ) // ErrForkAlreadyExist represents a "ForkAlreadyExist" kind of error. diff --git a/services/repository/fork_test.go b/services/repository/fork_test.go index 227dd1850e..2e1e72aaad 100644 --- a/services/repository/fork_test.go +++ b/services/repository/fork_test.go @@ -6,11 +6,11 @@ package repository import ( "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" + 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/setting" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/generate.go b/services/repository/generate.go index 9aeb057c3d..8bd14ace8d 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -16,14 +16,14 @@ import ( "strings" "time" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/util" + 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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/util" "github.com/gobwas/glob" "github.com/huandu/xstrings" @@ -126,32 +126,24 @@ func (gt *GiteaTemplate) Globs() []glob.Glob { } func checkGiteaTemplate(tmpDir string) (*GiteaTemplate, error) { - configDirs := []string{".forgejo", ".gitea"} - var templateFilePath string - - for _, dir := range configDirs { - candidatePath := filepath.Join(tmpDir, dir, "template") - if _, err := os.Stat(candidatePath); err == nil { - templateFilePath = candidatePath - break - } else if !os.IsNotExist(err) { - return nil, err - } - } - - if templateFilePath == "" { + gtPath := filepath.Join(tmpDir, ".gitea", "template") + if _, err := os.Stat(gtPath); os.IsNotExist(err) { return nil, nil + } else if err != nil { + return nil, err } - content, err := os.ReadFile(templateFilePath) + content, err := os.ReadFile(gtPath) if err != nil { return nil, err } - return &GiteaTemplate{ - Path: templateFilePath, + gt := &GiteaTemplate{ + Path: gtPath, Content: content, - }, nil + } + + return gt, nil } func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository, tmpDir string) error { diff --git a/services/repository/hooks.go b/services/repository/hooks.go index d3021414cf..97e9e290a3 100644 --- a/services/repository/hooks.go +++ b/services/repository/hooks.go @@ -7,12 +7,12 @@ import ( "context" "fmt" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/webhook" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" "xorm.io/builder" ) diff --git a/services/repository/init.go b/services/repository/init.go index 525b322752..817fa4abd7 100644 --- a/services/repository/init.go +++ b/services/repository/init.go @@ -9,13 +9,13 @@ import ( "os" "time" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - asymkey_service "forgejo.org/services/asymkey" + 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" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + asymkey_service "code.gitea.io/gitea/services/asymkey" ) // initRepoCommit temporarily changes with work directory. diff --git a/services/repository/lfs.go b/services/repository/lfs.go index 43acb8ee6c..4cd1110e55 100644 --- a/services/repository/lfs.go +++ b/services/repository/lfs.go @@ -8,14 +8,14 @@ import ( "fmt" "time" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" + git_model "code.gitea.io/gitea/models/git" + 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/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" ) // GarbageCollectLFSMetaObjectsOptions provides options for GarbageCollectLFSMetaObjects function diff --git a/services/repository/lfs_test.go b/services/repository/lfs_test.go index e38c38e29c..a0c01dff8f 100644 --- a/services/repository/lfs_test.go +++ b/services/repository/lfs_test.go @@ -5,17 +5,18 @@ package repository_test import ( "bytes" + "context" "testing" "time" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - repo_service "forgejo.org/services/repository" + "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" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + repo_service "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -40,7 +41,7 @@ func TestGarbageCollectLFSMetaObjects(t *testing.T) { lfsOid := storeObjectInRepo(t, repo.ID, &lfsContent) // gc - err = repo_service.GarbageCollectLFSMetaObjects(t.Context(), repo_service.GarbageCollectLFSMetaObjectsOptions{ + err = repo_service.GarbageCollectLFSMetaObjects(context.Background(), repo_service.GarbageCollectLFSMetaObjectsOptions{ AutoFix: true, OlderThan: time.Now().Add(7 * 24 * time.Hour).Add(5 * 24 * time.Hour), UpdatedLessRecentlyThan: time.Time{}, // ensure that the models/fixtures/lfs_meta_object.yml objects are considered as well diff --git a/services/repository/main_test.go b/services/repository/main_test.go index 942a805638..7ad1540aee 100644 --- a/services/repository/main_test.go +++ b/services/repository/main_test.go @@ -6,7 +6,7 @@ package repository import ( "testing" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/unittest" ) func TestMain(m *testing.M) { diff --git a/services/repository/migrate.go b/services/repository/migrate.go index 80f5d68231..39ced04ae3 100644 --- a/services/repository/migrate.go +++ b/services/repository/migrate.go @@ -8,20 +8,22 @@ import ( "errors" "fmt" "net/http" + "strings" "time" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/lfs" - "forgejo.org/modules/log" - "forgejo.org/modules/migration" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" + "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/migration" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" ) // MigrateRepositoryGitData starts migrating git related data after created migrating repository @@ -96,7 +98,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, } defer gitRepo.Close() - branch, err := gitRepo.GetHEADBranch() + branch, err := gitrepo.GetDefaultBranch(ctx, repo) if err != nil { log.Warn("Failed to get the default branch of a migrated wiki repo: %v", err) if err := util.RemoveAll(wikiPath); err != nil { @@ -105,7 +107,7 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, return repo, err } - repo.WikiBranch = branch.Name + repo.WikiBranch = branch if err := git.WriteCommitGraph(ctx, wikiPath); err != nil { return repo, err @@ -251,10 +253,10 @@ func MigrateRepositoryGitData(ctx context.Context, u *user_model.User, func cleanUpMigrateGitConfig(ctx context.Context, repoPath string) error { cmd := git.NewCommand(ctx, "remote", "rm", "origin") // if the origin does not exist - _, _, err := cmd.RunStdString(&git.RunOpts{ + _, stderr, err := cmd.RunStdString(&git.RunOpts{ Dir: repoPath, }) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(stderr, "fatal: No such remote") { return err } return nil @@ -273,7 +275,7 @@ func CleanUpMigrateInfo(ctx context.Context, repo *repo_model.Repository) (*repo } _, _, err := git.NewCommand(ctx, "remote", "rm", "origin").RunStdString(&git.RunOpts{Dir: repoPath}) - if err != nil && !git.IsRemoteNotExistError(err) { + if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") { return repo, fmt.Errorf("CleanUpMigrateInfo: %w", err) } diff --git a/services/repository/push.go b/services/repository/push.go index 53574a7d93..afd6308cdb 100644 --- a/services/repository/push.go +++ b/services/repository/push.go @@ -10,23 +10,22 @@ import ( "strings" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/queue" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - issue_service "forgejo.org/services/issue" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" + "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/cache" + "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/queue" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + issue_service "code.gitea.io/gitea/services/issue" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" ) // pushQueue represents a queue to handle update pull request tests @@ -134,26 +133,23 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { } else { // is new tag newCommit, err := gitRepo.GetCommit(opts.NewCommitID) if err != nil { - // in case there is dirty data, for example, the "github.com/git/git" repository has tags pointing to non-existing commits - if !errors.Is(err, util.ErrNotExist) { - log.Error("Unable to get tag commit: gitRepo.GetCommit(%s) in %s/%s[%d]: %v", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) - } - } else { - commits := repo_module.NewPushCommits() - commits.HeadCommit = repo_module.CommitToPushCommit(newCommit) - commits.CompareURL = repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), opts.NewCommitID) - - notify_service.PushCommits( - ctx, pusher, repo, - &repo_module.PushUpdateOptions{ - RefFullName: opts.RefFullName, - OldCommitID: objectFormat.EmptyObjectID().String(), - NewCommitID: opts.NewCommitID, - }, commits) - - addTags = append(addTags, tagName) - notify_service.CreateRef(ctx, pusher, repo, opts.RefFullName, opts.NewCommitID) + return fmt.Errorf("gitRepo.GetCommit(%s) in %s/%s[%d]: %w", opts.NewCommitID, repo.OwnerName, repo.Name, repo.ID, err) } + + commits := repo_module.NewPushCommits() + commits.HeadCommit = repo_module.CommitToPushCommit(newCommit) + commits.CompareURL = repo.ComposeCompareURL(objectFormat.EmptyObjectID().String(), opts.NewCommitID) + + notify_service.PushCommits( + ctx, pusher, repo, + &repo_module.PushUpdateOptions{ + RefFullName: opts.RefFullName, + OldCommitID: objectFormat.EmptyObjectID().String(), + NewCommitID: opts.NewCommitID, + }, commits) + + addTags = append(addTags, tagName) + notify_service.CreateRef(ctx, pusher, repo, opts.RefFullName, opts.NewCommitID) } } else if opts.RefFullName.IsBranch() { if pusher == nil || pusher.ID != opts.PusherID { @@ -187,7 +183,9 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { repo.IsEmpty = false if repo.DefaultBranch != setting.Repository.DefaultBranch { if err := gitrepo.SetDefaultBranch(ctx, repo, repo.DefaultBranch); err != nil { - return err + if !git.IsErrUnsupportedVersion(err) { + return err + } } } // Update the is empty and default_branch columns @@ -256,6 +254,10 @@ func pushUpdates(optsList []*repo_module.PushUpdateOptions) error { commits.CompareURL = "" } + if len(commits.Commits) > setting.UI.FeedMaxCommitNum { + commits.Commits = commits.Commits[:setting.UI.FeedMaxCommitNum] + } + notify_service.PushCommits(ctx, pusher, repo, opts, commits) // Cache for big repository @@ -307,10 +309,9 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo } releases, err := db.Find[repo_model.Release](ctx, repo_model.FindReleasesOptions{ - RepoID: repo.ID, - TagNames: tags, - IncludeDrafts: true, - IncludeTags: true, + RepoID: repo.ID, + TagNames: tags, + IncludeTags: true, }) if err != nil { return fmt.Errorf("db.Find[repo_model.Release]: %w", err) @@ -395,17 +396,13 @@ func pushUpdateAddTags(ctx context.Context, repo *repo_model.Repository, gitRepo } newReleases = append(newReleases, rel) } else { + rel.Title = parts[0] + rel.Note = note rel.Sha1 = commit.ID.String() rel.CreatedUnix = timeutil.TimeStamp(createdAt.Unix()) rel.NumCommits = commitsCount - if rel.IsTag { - rel.Title = parts[0] - rel.Note = note - if author != nil { - rel.PublisherID = author.ID - } - } else { - rel.IsDraft = false + if rel.IsTag && author != nil { + rel.PublisherID = author.ID } if err = repo_model.UpdateRelease(ctx, rel); err != nil { return fmt.Errorf("Update: %w", err) diff --git a/services/repository/repository.go b/services/repository/repository.go index a2620740b1..116e24151b 100644 --- a/services/repository/repository.go +++ b/services/repository/repository.go @@ -8,21 +8,23 @@ import ( "context" "fmt" - "forgejo.org/models/db" - "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - 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/graceful" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - notify_service "forgejo.org/services/notify" - pull_service "forgejo.org/services/pull" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + 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/graceful" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + federation_service "code.gitea.io/gitea/services/federation" + notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" ) // WebSearchRepository represents a repository returned by web search @@ -62,7 +64,15 @@ func DeleteRepository(ctx context.Context, doer *user_model.User, repo *repo_mod notify_service.DeleteRepository(ctx, doer, repo) } - return DeleteRepositoryDirectly(ctx, doer, repo.ID) + if err := DeleteRepositoryDirectly(ctx, doer, repo.ID); err != nil { + return err + } + + if err := federation_service.DeleteFollowingRepos(ctx, repo.ID); err != nil { + return err + } + + return packages_model.UnlinkRepositoryFromAllPackages(ctx, repo.ID) } // PushCreateRepo creates a repository when a new repository is pushed to an appropriate namespace diff --git a/services/repository/repository_test.go b/services/repository/repository_test.go index c08f7151ca..a5c0b3efcd 100644 --- a/services/repository/repository_test.go +++ b/services/repository/repository_test.go @@ -6,10 +6,10 @@ package repository import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/review.go b/services/repository/review.go index c4000a2846..40513e6bc6 100644 --- a/services/repository/review.go +++ b/services/repository/review.go @@ -6,9 +6,9 @@ package repository import ( "context" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + repo_model "code.gitea.io/gitea/models/repo" ) // GetReviewerTeams get all teams can be requested to review diff --git a/services/repository/review_test.go b/services/repository/review_test.go index 5ece99a2e3..eb1712c2ce 100644 --- a/services/repository/review_test.go +++ b/services/repository/review_test.go @@ -6,9 +6,9 @@ package repository import ( "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/repository/setting.go b/services/repository/setting.go index c127f3129e..33b00cca8c 100644 --- a/services/repository/setting.go +++ b/services/repository/setting.go @@ -7,12 +7,12 @@ import ( "context" "slices" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/modules/log" - actions_service "forgejo.org/services/actions" + actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/modules/log" + actions_service "code.gitea.io/gitea/services/actions" ) // UpdateRepositoryUnits updates a repository's units diff --git a/services/repository/star.go b/services/repository/star.go index 8cc2e0a243..505da0f099 100644 --- a/services/repository/star.go +++ b/services/repository/star.go @@ -6,10 +6,10 @@ package repository import ( "context" - "forgejo.org/models/repo" - "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/services/federation" + "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/services/federation" ) func StarRepoAndSendLikeActivities(ctx context.Context, doer user.User, repoID int64, star bool) error { diff --git a/services/repository/template.go b/services/repository/template.go index 3566aa2b7e..36a680c8e2 100644 --- a/services/repository/template.go +++ b/services/repository/template.go @@ -6,12 +6,12 @@ package repository import ( "context" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - notify_service "forgejo.org/services/notify" + "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" + user_model "code.gitea.io/gitea/models/user" + notify_service "code.gitea.io/gitea/services/notify" ) // GenerateIssueLabels generates issue labels from a template repository diff --git a/services/repository/transfer.go b/services/repository/transfer.go index 6026d85ae1..467c85ef6f 100644 --- a/services/repository/transfer.go +++ b/services/repository/transfer.go @@ -9,19 +9,19 @@ import ( "os" "strings" - "forgejo.org/models" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/sync" - "forgejo.org/modules/util" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + "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" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/sync" + "code.gitea.io/gitea/modules/util" + notify_service "code.gitea.io/gitea/services/notify" ) // repoWorkingPool represents a working pool to order the parallel changes to the same repository diff --git a/services/repository/transfer_test.go b/services/repository/transfer_test.go index 4bb0fc140c..cc51a05781 100644 --- a/services/repository/transfer_test.go +++ b/services/repository/transfer_test.go @@ -7,17 +7,17 @@ import ( "sync" "testing" - "forgejo.org/models" - activities_model "forgejo.org/models/activities" - "forgejo.org/models/db" - "forgejo.org/models/organization" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/util" - "forgejo.org/services/feed" - notify_service "forgejo.org/services/notify" + "code.gitea.io/gitea/models" + activities_model "code.gitea.io/gitea/models/activities" + "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" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/feed" + notify_service "code.gitea.io/gitea/services/notify" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/secrets/secrets.go b/services/secrets/secrets.go index 2d5aebdbc1..031c474dd7 100644 --- a/services/secrets/secrets.go +++ b/services/secrets/secrets.go @@ -6,8 +6,8 @@ package secrets import ( "context" - "forgejo.org/models/db" - secret_model "forgejo.org/models/secret" + "code.gitea.io/gitea/models/db" + secret_model "code.gitea.io/gitea/models/secret" ) func CreateOrUpdateSecret(ctx context.Context, ownerID, repoID int64, name, data string) (*secret_model.Secret, bool, error) { diff --git a/services/secrets/validation.go b/services/secrets/validation.go index 44250ba87b..3db5b96452 100644 --- a/services/secrets/validation.go +++ b/services/secrets/validation.go @@ -6,7 +6,7 @@ package secrets import ( "regexp" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/util" ) // https://docs.github.com/en/actions/security-guides/encrypted-secrets#naming-your-secrets diff --git a/services/shared/automerge/automerge.go b/services/shared/automerge/automerge.go deleted file mode 100644 index 1dc309f4b3..0000000000 --- a/services/shared/automerge/automerge.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2021 Gitea. All rights reserved. -// SPDX-License-Identifier: MIT - -package automerge - -import ( - "context" - "fmt" - "strconv" - "strings" - - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" -) - -// PRAutoMergeQueue represents a queue to handle update pull request tests -var PRAutoMergeQueue *queue.WorkerPoolQueue[string] - -func addToQueue(pr *issues_model.PullRequest, sha string) { - log.Trace("Adding pullID: %d to the pull requests patch checking queue with sha %s", pr.ID, sha) - if err := PRAutoMergeQueue.Push(fmt.Sprintf("%d_%s", pr.ID, sha)); err != nil { - log.Error("Error adding pullID: %d to the pull requests patch checking queue %v", pr.ID, err) - } -} - -// StartPRCheckAndAutoMergeBySHA start an automerge check and auto merge task for all pull requests of repository and SHA -func StartPRCheckAndAutoMergeBySHA(ctx context.Context, sha string, repo *repo_model.Repository) error { - pulls, err := getPullRequestsByHeadSHA(ctx, sha, repo, func(pr *issues_model.PullRequest) bool { - return !pr.HasMerged && pr.CanAutoMerge() - }) - if err != nil { - return err - } - - for _, pr := range pulls { - addToQueue(pr, sha) - } - - return nil -} - -// StartPRCheckAndAutoMerge start an automerge check and auto merge task for a pull request -func StartPRCheckAndAutoMerge(ctx context.Context, pull *issues_model.PullRequest) { - if pull == nil || pull.HasMerged || !pull.CanAutoMerge() { - return - } - - if err := pull.LoadBaseRepo(ctx); err != nil { - log.Error("LoadBaseRepo: %v", err) - return - } - - gitRepo, err := gitrepo.OpenRepository(ctx, pull.BaseRepo) - if err != nil { - log.Error("OpenRepository: %v", err) - return - } - defer gitRepo.Close() - commitID, err := gitRepo.GetRefCommitID(pull.GetGitRefName()) - if err != nil { - log.Error("GetRefCommitID: %v", err) - return - } - - addToQueue(pull, commitID) -} - -func getPullRequestsByHeadSHA(ctx context.Context, sha string, repo *repo_model.Repository, filter func(*issues_model.PullRequest) bool) (map[int64]*issues_model.PullRequest, error) { - gitRepo, err := gitrepo.OpenRepository(ctx, repo) - if err != nil { - return nil, err - } - defer gitRepo.Close() - - refs, err := gitRepo.GetRefsBySha(sha, "") - if err != nil { - return nil, err - } - - pulls := make(map[int64]*issues_model.PullRequest) - - for _, ref := range refs { - // Each pull branch starts with refs/pull/ we then go from there to find the index of the pr and then - // use that to get the pr. - if strings.HasPrefix(ref, git.PullPrefix) { - parts := strings.Split(ref[len(git.PullPrefix):], "/") - - // e.g. 'refs/pull/1/head' would be []string{"1", "head"} - if len(parts) != 2 { - log.Error("getPullRequestsByHeadSHA found broken pull ref [%s] on repo [%-v]", ref, repo) - continue - } - - prIndex, err := strconv.ParseInt(parts[0], 10, 64) - if err != nil { - log.Error("getPullRequestsByHeadSHA found broken pull ref [%s] on repo [%-v]", ref, repo) - continue - } - - p, err := issues_model.GetPullRequestByIndex(ctx, repo.ID, prIndex) - if err != nil { - // If there is no pull request for this branch, we don't try to merge it. - if issues_model.IsErrPullRequestNotExist(err) { - continue - } - return nil, err - } - - if filter(p) { - pulls[p.ID] = p - } - } - } - - return pulls, nil -} diff --git a/services/task/migrate.go b/services/task/migrate.go index a9f76299fd..9cef77a6c8 100644 --- a/services/task/migrate.go +++ b/services/task/migrate.go @@ -10,20 +10,20 @@ import ( "strings" "time" - admin_model "forgejo.org/models/admin" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/graceful" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/migration" - "forgejo.org/modules/process" - "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - "forgejo.org/services/migrations" - notify_service "forgejo.org/services/notify" + admin_model "code.gitea.io/gitea/models/admin" + "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/graceful" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/migrations" + notify_service "code.gitea.io/gitea/services/notify" ) func handleCreateError(owner *user_model.User, err error) error { diff --git a/services/task/task.go b/services/task/task.go index 3181fc79d7..ac659ac3e5 100644 --- a/services/task/task.go +++ b/services/task/task.go @@ -7,21 +7,21 @@ import ( "context" "fmt" - admin_model "forgejo.org/models/admin" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/graceful" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - base "forgejo.org/modules/migration" - "forgejo.org/modules/queue" - "forgejo.org/modules/secret" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/modules/util" - repo_service "forgejo.org/services/repository" + admin_model "code.gitea.io/gitea/models/admin" + "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/graceful" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/queue" + "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" + repo_service "code.gitea.io/gitea/services/repository" ) // taskQueue is a global queue of tasks diff --git a/services/uinotification/notify.go b/services/uinotification/notify.go index 25048e7b53..be5f7019a2 100644 --- a/services/uinotification/notify.go +++ b/services/uinotification/notify.go @@ -6,16 +6,16 @@ package uinotification import ( "context" - activities_model "forgejo.org/models/activities" - "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/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/queue" - notify_service "forgejo.org/services/notify" + activities_model "code.gitea.io/gitea/models/activities" + "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/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/queue" + notify_service "code.gitea.io/gitea/services/notify" ) type ( diff --git a/services/user/avatar.go b/services/user/avatar.go index 79dfc76503..3f87466eaa 100644 --- a/services/user/avatar.go +++ b/services/user/avatar.go @@ -10,11 +10,11 @@ import ( "io" "os" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/avatar" - "forgejo.org/modules/log" - "forgejo.org/modules/storage" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/avatar" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/storage" ) // UploadAvatar saves custom avatar for user. diff --git a/services/user/avatar_test.go b/services/user/avatar_test.go index b208efeb6f..21fca8dd09 100644 --- a/services/user/avatar_test.go +++ b/services/user/avatar_test.go @@ -10,11 +10,11 @@ import ( "os" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/storage" - "forgejo.org/modules/test" + "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/storage" + "code.gitea.io/gitea/modules/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/user/block.go b/services/user/block.go index 6be8dc5f70..0b31119dfb 100644 --- a/services/user/block.go +++ b/services/user/block.go @@ -5,10 +5,10 @@ package user import ( "context" - model "forgejo.org/models" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" + model "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" "xorm.io/builder" ) diff --git a/services/user/block_test.go b/services/user/block_test.go index a2ba5d71a7..f9e95ed7f7 100644 --- a/services/user/block_test.go +++ b/services/user/block_test.go @@ -6,12 +6,11 @@ package user import ( "testing" - model "forgejo.org/models" - "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" + model "code.gitea.io/gitea/models" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -90,24 +89,4 @@ func TestBlockUser(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3, OwnerID: blockedUser.ID}) assert.Equal(t, repo_model.RepositoryReady, repo.Status) }) - - t.Run("Issues", func(t *testing.T) { - doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - blockedUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - defer user_model.UnblockUser(db.DefaultContext, doer.ID, blockedUser.ID) - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2, OwnerID: doer.ID}) - issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 4, RepoID: repo.ID}, "is_closed = true") - - _, err := issues_model.ChangeIssueStatus(db.DefaultContext, issue, blockedUser, false) - require.NoError(t, err) - - _, err = issues_model.ChangeIssueStatus(db.DefaultContext, issue, doer, true) - require.NoError(t, err) - - require.NoError(t, BlockUser(db.DefaultContext, doer.ID, blockedUser.ID)) - - _, err = issues_model.ChangeIssueStatus(db.DefaultContext, issue, blockedUser, false) - require.Error(t, err) - }) } diff --git a/services/user/delete.go b/services/user/delete.go index 9ce917cd27..587e3c2a8f 100644 --- a/services/user/delete.go +++ b/services/user/delete.go @@ -10,20 +10,20 @@ import ( _ "image/jpeg" // Needed for jpeg support - actions_model "forgejo.org/models/actions" - activities_model "forgejo.org/models/activities" - asymkey_model "forgejo.org/models/asymkey" - auth_model "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" - pull_model "forgejo.org/models/pull" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - issue_service "forgejo.org/services/issue" + actions_model "code.gitea.io/gitea/models/actions" + activities_model "code.gitea.io/gitea/models/activities" + asymkey_model "code.gitea.io/gitea/models/asymkey" + auth_model "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" + 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/setting" + issue_service "code.gitea.io/gitea/services/issue" "xorm.io/builder" ) diff --git a/services/user/email.go b/services/user/email.go index f49efde1be..e8725267f4 100644 --- a/services/user/email.go +++ b/services/user/email.go @@ -8,12 +8,11 @@ import ( "errors" "strings" - "forgejo.org/models/db" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/modules/validation" - "forgejo.org/services/mailer" + "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/util" + "code.gitea.io/gitea/services/mailer" ) // AdminAddOrSetPrimaryEmailAddress is used by admins to add or set a user's primary email address @@ -22,7 +21,7 @@ func AdminAddOrSetPrimaryEmailAddress(ctx context.Context, u *user_model.User, e return nil } - if err := validation.ValidateEmailForAdmin(emailStr); err != nil { + if err := user_model.ValidateEmailForAdmin(emailStr); err != nil { return err } @@ -75,7 +74,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt return nil } - if err := validation.ValidateEmail(emailStr); err != nil { + if err := user_model.ValidateEmail(emailStr); err != nil { return err } @@ -120,7 +119,7 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error { for _, emailStr := range emails { - if err := validation.ValidateEmail(emailStr); err != nil { + if err := user_model.ValidateEmail(emailStr); err != nil { return err } diff --git a/services/user/email_test.go b/services/user/email_test.go index b48936a27e..86f31a8984 100644 --- a/services/user/email_test.go +++ b/services/user/email_test.go @@ -6,11 +6,11 @@ package user import ( "testing" - "forgejo.org/models/db" - organization_model "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/db" + organization_model "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" "github.com/gobwas/glob" "github.com/stretchr/testify/assert" diff --git a/services/user/update.go b/services/user/update.go index 65d3992751..26c90505c8 100644 --- a/services/user/update.go +++ b/services/user/update.go @@ -7,14 +7,14 @@ import ( "context" "fmt" - "forgejo.org/models" - auth_model "forgejo.org/models/auth" - user_model "forgejo.org/models/user" - password_module "forgejo.org/modules/auth/password" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/services/mailer" + "code.gitea.io/gitea/models" + auth_model "code.gitea.io/gitea/models/auth" + user_model "code.gitea.io/gitea/models/user" + password_module "code.gitea.io/gitea/modules/auth/password" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/mailer" ) type UpdateOptions struct { @@ -40,7 +40,6 @@ type UpdateOptions struct { SetLastLogin bool RepoAdminChangeTeamAccess optional.Option[bool] EnableRepoUnitHints optional.Option[bool] - KeepPronounsPrivate optional.Option[bool] } func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) error { @@ -98,12 +97,6 @@ func UpdateUser(ctx context.Context, u *user_model.User, opts *UpdateOptions) er cols = append(cols, "enable_repo_unit_hints") } - if opts.KeepPronounsPrivate.Has() { - u.KeepPronounsPrivate = opts.KeepPronounsPrivate.Value() - - cols = append(cols, "keep_pronouns_private") - } - if opts.AllowGitHook.Has() { u.AllowGitHook = opts.AllowGitHook.Value() diff --git a/services/user/update_test.go b/services/user/update_test.go index f1754b2db9..11379d4508 100644 --- a/services/user/update_test.go +++ b/services/user/update_test.go @@ -6,12 +6,12 @@ package user import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - password_module "forgejo.org/modules/auth/password" - "forgejo.org/modules/optional" - "forgejo.org/modules/structs" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + password_module "code.gitea.io/gitea/modules/auth/password" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/services/user/user.go b/services/user/user.go index d90fbac978..abaeb88f40 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -11,41 +11,28 @@ import ( "strings" "time" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/db" - "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - system_model "forgejo.org/models/system" - user_model "forgejo.org/models/user" - "forgejo.org/modules/eventsource" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/util" - "forgejo.org/services/agit" - org_service "forgejo.org/services/org" - "forgejo.org/services/packages" - container_service "forgejo.org/services/packages/container" - repo_service "forgejo.org/services/repository" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + repo_model "code.gitea.io/gitea/models/repo" + system_model "code.gitea.io/gitea/models/system" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/eventsource" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/agit" + org_service "code.gitea.io/gitea/services/org" + "code.gitea.io/gitea/services/packages" + container_service "code.gitea.io/gitea/services/packages/container" + repo_service "code.gitea.io/gitea/services/repository" ) // RenameUser renames a user func RenameUser(ctx context.Context, u *user_model.User, newUserName string) error { - return renameUser(ctx, u, newUserName, false) -} - -// RenameUser renames a user as an admin. -func AdminRenameUser(ctx context.Context, u *user_model.User, newUserName string) error { - return renameUser(ctx, u, newUserName, true) -} - -func renameUser(ctx context.Context, u *user_model.User, newUserName string, doerIsAdmin bool) error { - if newUserName == u.Name { - return nil - } - // Non-local users are not allowed to change their username. if !u.IsOrganization() && !u.IsLocal() { return user_model.ErrUserIsNotLocal{ @@ -54,19 +41,12 @@ func renameUser(ctx context.Context, u *user_model.User, newUserName string, doe } } - if err := user_model.IsUsableUsername(newUserName); err != nil { - return err + if newUserName == u.Name { + return nil } - // Check if the new username can be claimed. - if !doerIsAdmin { - if ok, expireTime, err := user_model.CanClaimUsername(ctx, newUserName, u.ID); err != nil { - return err - } else if !ok { - return user_model.ErrCooldownPeriod{ - ExpireTime: expireTime, - } - } + if err := user_model.IsUsableUsername(newUserName); err != nil { + return err } onlyCapitalization := strings.EqualFold(newUserName, u.Name) @@ -105,12 +85,6 @@ func renameUser(ctx context.Context, u *user_model.User, newUserName string, doe return err } - if setting.Service.MaxUserRedirects > 0 { - if err := user_model.LimitUserRedirects(ctx, u.ID, setting.Service.MaxUserRedirects); err != nil { - return err - } - } - if err := agit.UserNameChanged(ctx, u, newUserName); err != nil { return err } diff --git a/services/user/user_test.go b/services/user/user_test.go index 64a9ed2d23..ad5387c0bc 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -11,17 +11,17 @@ import ( "testing" "time" - "forgejo.org/models" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/timeutil" + "code.gitea.io/gitea/models" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/auth" + "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/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/timeutil" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -67,7 +67,13 @@ func TestDeleteUser(t *testing.T) { } func TestPurgeUser(t *testing.T) { - defer unittest.OverrideFixtures("services/user/TestPurgeUser")() + defer unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: []string{"services/user/TestPurgeUser/"}, + }, + )() require.NoError(t, unittest.PrepareTestDatabase()) defer test.MockVariableValue(&setting.SSH.RootPath, t.TempDir())() defer test.MockVariableValue(&setting.SSH.CreateAuthorizedKeysFile, true)() @@ -153,10 +159,12 @@ func TestRenameUser(t *testing.T) { }) t.Run("Non usable username", func(t *testing.T) { - usernames := []string{"--diff", ".well-known", "gitea-actions", "aaa.atom", "aa.png"} + usernames := []string{"--diff", "aa.png", ".well-known", "search", "aaa.atom"} for _, username := range usernames { - require.Error(t, user_model.IsUsableUsername(username), "non-usable username: %s", username) - require.Error(t, RenameUser(db.DefaultContext, user, username), "non-usable username: %s", username) + t.Run(username, func(t *testing.T) { + require.Error(t, user_model.IsUsableUsername(username)) + require.Error(t, RenameUser(db.DefaultContext, user, username)) + }) } }) @@ -193,29 +201,6 @@ func TestRenameUser(t *testing.T) { unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: user.ID, OwnerName: user.Name}) }) - - t.Run("Keep N redirects", func(t *testing.T) { - defer test.MockProtect(&setting.Service.MaxUserRedirects)() - // Start clean - unittest.AssertSuccessfulDelete(t, &user_model.Redirect{RedirectUserID: user.ID}) - - setting.Service.MaxUserRedirects = 1 - - require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-1")) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "user_rename"}) - - // The granularity of created_unix is a second. - time.Sleep(time.Second) - require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-2")) - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "user_rename"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-1"}) - - setting.Service.MaxUserRedirects = 2 - time.Sleep(time.Second) - require.NoError(t, RenameUser(db.DefaultContext, user, "redirect-3")) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-1"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "redirect-2"}) - }) } func TestCreateUser_Issue5882(t *testing.T) { diff --git a/services/webhook/TestPushCommits/webhook.yml b/services/webhook/TestPushCommits/webhook.yml deleted file mode 100644 index c1ee7ceb9e..0000000000 --- a/services/webhook/TestPushCommits/webhook.yml +++ /dev/null @@ -1,9 +0,0 @@ -- - id: 1001 - repo_id: 2 - type: forgejo - url: http://www.example.com/blÃ¥haj - http_method: POST - content_type: 1 # json - events: '{"send_everything":true,"branch_filter":"{master*,main*}"}' - is_active: true diff --git a/services/webhook/default.go b/services/webhook/default.go index 30717a7352..089ff8bae3 100644 --- a/services/webhook/default.go +++ b/services/webhook/default.go @@ -11,14 +11,14 @@ import ( "net/url" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/svg" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/svg" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) var _ Handler = defaultHandler{} diff --git a/services/webhook/default_test.go b/services/webhook/default_test.go index f946870d57..f3e2848659 100644 --- a/services/webhook/default_test.go +++ b/services/webhook/default_test.go @@ -4,11 +4,12 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + webhook_module "code.gitea.io/gitea/modules/webhook" jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" @@ -44,7 +45,7 @@ func TestGiteaPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -73,7 +74,7 @@ func TestGiteaPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -102,7 +103,7 @@ func TestGiteaPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -147,7 +148,7 @@ func TestForgejoPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -176,7 +177,7 @@ func TestForgejoPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -205,7 +206,7 @@ func TestForgejoPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dh.NewRequest(t.Context(), hook, task) + req, reqBody, err := dh.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) diff --git a/services/webhook/deliver.go b/services/webhook/deliver.go index 0c7c039f10..25668143e6 100644 --- a/services/webhook/deliver.go +++ b/services/webhook/deliver.go @@ -14,16 +14,16 @@ import ( "sync" "time" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/graceful" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/log" - "forgejo.org/modules/process" - "forgejo.org/modules/proxy" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/process" + "code.gitea.io/gitea/modules/proxy" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/timeutil" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/gobwas/glob" ) diff --git a/services/webhook/deliver_test.go b/services/webhook/deliver_test.go index 4dd898e60a..21af3c7116 100644 --- a/services/webhook/deliver_test.go +++ b/services/webhook/deliver_test.go @@ -4,30 +4,38 @@ package webhook import ( + "context" "io" "net/http" "net/http/httptest" "net/url" + "os" "strings" "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - webhook_module "forgejo.org/modules/webhook" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/setting" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestWebhookProxy(t *testing.T) { - defer test.MockProtect(&setting.Webhook)() - t.Setenv("http_proxy", "") - t.Setenv("https_proxy", "") + oldWebhook := setting.Webhook + oldHTTPProxy := os.Getenv("http_proxy") + oldHTTPSProxy := os.Getenv("https_proxy") + t.Cleanup(func() { + setting.Webhook = oldWebhook + os.Setenv("http_proxy", oldHTTPProxy) + os.Setenv("https_proxy", oldHTTPSProxy) + }) + os.Unsetenv("http_proxy") + os.Unsetenv("https_proxy") setting.Webhook.ProxyURL = "http://localhost:8080" setting.Webhook.ProxyURLFixed, _ = url.Parse(setting.Webhook.ProxyURL) @@ -116,7 +124,7 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) { require.NoError(t, err) assert.NotNil(t, hookTask) - require.NoError(t, Deliver(t.Context(), hookTask)) + require.NoError(t, Deliver(context.Background(), hookTask)) select { case <-done: case <-time.After(5 * time.Second): @@ -142,12 +150,12 @@ func TestWebhookDeliverHookTask(t *testing.T) { require.NoError(t, err) assert.Equal(t, `{"data": 42}`, string(body)) - case "/webhook/86aaa4d69df5aa487cb0148af4ae7e546933057b": + case "/webhook/6db5dc1e282529a8c162c7fe93dd2667494eeb51": // Version 2 assert.Equal(t, "application/json", r.Header.Get("Content-Type")) body, err := io.ReadAll(r.Body) require.NoError(t, err) - assert.Len(t, body, 1909) + assert.Len(t, body, 2147) default: w.WriteHeader(404) @@ -182,7 +190,7 @@ func TestWebhookDeliverHookTask(t *testing.T) { require.NoError(t, err) assert.NotNil(t, hookTask) - require.NoError(t, Deliver(t.Context(), hookTask)) + require.NoError(t, Deliver(context.Background(), hookTask)) select { case <-done: case <-time.After(5 * time.Second): @@ -208,7 +216,7 @@ func TestWebhookDeliverHookTask(t *testing.T) { require.NoError(t, err) assert.NotNil(t, hookTask) - require.NoError(t, Deliver(t.Context(), hookTask)) + require.NoError(t, Deliver(context.Background(), hookTask)) select { case <-done: case <-time.After(5 * time.Second): @@ -309,7 +317,7 @@ func TestWebhookDeliverSpecificTypes(t *testing.T) { require.NoError(t, err) assert.NotNil(t, hookTask) - require.NoError(t, Deliver(t.Context(), hookTask)) + require.NoError(t, Deliver(context.Background(), hookTask)) select { case gotBody := <-hc.gotBody: assert.NotEqual(t, string(data), string(gotBody), "request body must be different from the event payload") diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go index 9d5c7e573f..899c5b2d9f 100644 --- a/services/webhook/dingtalk.go +++ b/services/webhook/dingtalk.go @@ -11,13 +11,13 @@ import ( "net/url" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type dingtalkHandler struct{} diff --git a/services/webhook/dingtalk_test.go b/services/webhook/dingtalk_test.go index 5d2a240660..d0a2d48908 100644 --- a/services/webhook/dingtalk_test.go +++ b/services/webhook/dingtalk_test.go @@ -4,13 +4,14 @@ package webhook import ( + "context" "net/url" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -235,7 +236,7 @@ func TestDingTalkJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := dingtalkHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := dingtalkHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) diff --git a/services/webhook/discord.go b/services/webhook/discord.go index 3970a2552d..b0142b8509 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -10,24 +10,23 @@ import ( "html/template" "net/http" "net/url" - "regexp" "strconv" "strings" "unicode/utf8" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "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" + webhook_module "code.gitea.io/gitea/modules/webhook" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) type discordHandler struct{} @@ -203,9 +202,6 @@ func (d discordConvertor) Push(p *api.PushPayload) (DiscordPayload, error) { // limit the commit message display to just the summary, otherwise it would be hard to read message := strings.TrimRight(strings.SplitN(commit.Message, "\n", 1)[0], "\r") - // Escaping markdown character - message = escapeMarkdown(message) - // a limit of 50 is set because GitHub does the same if utf8.RuneCountInString(message) > 50 { message = fmt.Sprintf("%.47s...", message) @@ -369,40 +365,3 @@ func (d discordConvertor) createPayload(s *api.User, title, text, url string, co }, } } - -var orderedListPattern = regexp.MustCompile(`(\d+)\.`) - -var markdownPatterns = map[string]*regexp.Regexp{ - "~": regexp.MustCompile(`\~(.*?)\~`), - "*": regexp.MustCompile(`\*(.*?)\*`), - "_": regexp.MustCompile(`\_(.*?)\_`), -} - -var markdownToEscape = strings.NewReplacer( - "* ", "\\* ", - "`", "\\`", - "[", "\\[", - "]", "\\]", - "(", "\\(", - ")", "\\)", - "#", "\\#", - "+ ", "\\+ ", - "- ", "\\- ", - "---", "\\---", - "!", "\\!", - "|", "\\|", - "<", "\\<", - ">", "\\>", -) - -// Escape Markdown characters -func escapeMarkdown(input string) string { - // Escaping ordered list - output := orderedListPattern.ReplaceAllString(input, "$1\\.") - - for char, pattern := range markdownPatterns { - output = pattern.ReplaceAllString(output, fmt.Sprintf(`\%s$1\%s`, char, char)) - } - - return markdownToEscape.Replace(output) -} diff --git a/services/webhook/discord_test.go b/services/webhook/discord_test.go index ce3aaa10cf..680f7806a9 100644 --- a/services/webhook/discord_test.go +++ b/services/webhook/discord_test.go @@ -4,13 +4,14 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -93,20 +94,6 @@ func TestDiscordPayload(t *testing.T) { assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) }) - t.Run("PushWithMarkdownCharactersInCommitMessage", func(t *testing.T) { - p := pushTestEscapeCommitMessagePayload() - - pl, err := dc.Push(p) - require.NoError(t, err) - - assert.Len(t, pl.Embeds, 1) - assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title) - assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) \\# conflicts\n\\# \\- some/conflicting/file.txt - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) \\# conflicts\n\\# \\- some/conflicting/file.txt - user1", pl.Embeds[0].Description) - assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) - assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) - assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) - }) - t.Run("Issue", func(t *testing.T) { p := issueTestPayload() @@ -345,7 +332,7 @@ func TestDiscordJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := discordHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := discordHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) @@ -359,89 +346,3 @@ func TestDiscordJSONPayload(t *testing.T) { require.NoError(t, err) assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Embeds[0].Description) } - -var escapedMarkdownTests = map[string]struct { - input string - expected string -}{ - "Escape heading level 1": { - input: "# Heading level 1", - expected: "\\# Heading level 1", - }, - "Escape heading level 2": { - input: "## Heading level 2", - expected: "\\#\\# Heading level 2", - }, - "Escape heading level 3": { - input: "### Heading level 3", - expected: "\\#\\#\\# Heading level 3", - }, - "Escape bold text": { - input: "**bold text**", - expected: "\\*\\*bold text\\*\\*", - }, - "Escape italic text": { - input: "*italic text*", - expected: "\\*italic text\\*", - }, - "Escape italic text underline": { - input: "_italic text_", - expected: "\\_italic text\\_", - }, - "Escape strikethrough": { - input: "~~strikethrough~~", - expected: "\\~\\~strikethrough\\~\\~", - }, - "Escape Ordered list item": { - input: "1. Ordered list item\n2. Second ordered list item\n999999999999. 999999999999 ordered list item", - expected: "1\\. Ordered list item\n2\\. Second ordered list item\n999999999999\\. 999999999999 ordered list item", - }, - "Escape Unordered list item": { - input: "- Unordered list\n + using plus", - expected: "\\- Unordered list\n \\+ using plus", - }, - "Escape bullet list item": { - input: "* Bullet list item", - expected: "\\* Bullet list item", - }, - "Escape table": { - input: "| Table | Example |\n|-|-|\n| Lorem | Ipsum |", - expected: "\\| Table \\| Example \\|\n\\|-\\|-\\|\n\\| Lorem \\| Ipsum \\|", - }, - "Escape link": { - input: "[Link to Forgejo](https://forgejo.org/)", - expected: "\\[Link to Forgejo\\]\\(https://forgejo.org/\\)", - }, - "Escape Alt text for an image": { - input: "![Alt text for an image](https://forgejo.org/_astro/mascot-dark.1omhhgvT_Zm0N2n.webp)", - expected: "\\!\\[Alt text for an image\\]\\(https://forgejo.org/\\_astro/mascot-dark.1omhhgvT\\_Zm0N2n.webp\\)", - }, - "Escape URL if it has markdown character": { - input: "https://forgejo.org/_astro/mascot-dark.1omhhgvT_Zm0N2n.webp", - expected: "https://forgejo.org/\\_astro/mascot-dark.1omhhgvT\\_Zm0N2n.webp", - }, - "Escape blockquote text": { - input: "> Blockquote text.", - expected: "\\> Blockquote text.", - }, - "Escape inline code": { - input: "`Inline code`", - expected: "\\`Inline code\\`", - }, - "Escape multiple code": { - input: "```\nCode block\nwith multiple lines\n```\n", - expected: "\\`\\`\\`\nCode block\nwith multiple lines\n\\`\\`\\`\n", - }, - "Escape horizontal rule": { - input: "---", - expected: "\\---", - }, -} - -func TestEscapeMarkdownChar(t *testing.T) { - for name, test := range escapedMarkdownTests { - t.Run(name, func(t *testing.T) { - assert.Equal(t, test.expected, escapeMarkdown(test.input)) - }) - } -} diff --git a/services/webhook/feishu.go b/services/webhook/feishu.go index 01b3d07983..f77c3bbd65 100644 --- a/services/webhook/feishu.go +++ b/services/webhook/feishu.go @@ -10,12 +10,12 @@ import ( "net/http" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type feishuHandler struct{} diff --git a/services/webhook/feishu_test.go b/services/webhook/feishu_test.go index 7cf24b84ed..9744571b39 100644 --- a/services/webhook/feishu_test.go +++ b/services/webhook/feishu_test.go @@ -4,12 +4,13 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -176,7 +177,7 @@ func TestFeishuJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := feishuHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := feishuHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) diff --git a/services/webhook/general.go b/services/webhook/general.go index 40a2467177..c41f58fe8d 100644 --- a/services/webhook/general.go +++ b/services/webhook/general.go @@ -9,11 +9,11 @@ import ( "net/url" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" ) type linkFormatter = func(string, string) string @@ -92,6 +92,7 @@ func getIssuesCommentInfo(p *api.IssueCommentPayload) (title, link, by, operator } func getIssuesPayloadInfo(p *api.IssuePayload, linkFormatter linkFormatter, withSender bool) (string, string, string, int) { + repoLink := linkFormatter(p.Repository.HTMLURL, p.Repository.FullName) issueTitle := fmt.Sprintf("#%d %s", p.Index, p.Issue.Title) titleLink := linkFormatter(fmt.Sprintf("%s/issues/%d", p.Repository.HTMLURL, p.Index), issueTitle) var text string @@ -99,37 +100,39 @@ func getIssuesPayloadInfo(p *api.IssuePayload, linkFormatter linkFormatter, with switch p.Action { case api.HookIssueOpened: - text = fmt.Sprintf("[%s] Issue opened: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue opened: %s", repoLink, titleLink) color = orangeColor case api.HookIssueClosed: - text = fmt.Sprintf("[%s] Issue closed: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue closed: %s", repoLink, titleLink) color = redColor case api.HookIssueReOpened: - text = fmt.Sprintf("[%s] Issue re-opened: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue re-opened: %s", repoLink, titleLink) case api.HookIssueEdited: - text = fmt.Sprintf("[%s] Issue edited: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue edited: %s", repoLink, titleLink) case api.HookIssueAssigned: list := make([]string, len(p.Issue.Assignees)) for i, user := range p.Issue.Assignees { list[i] = linkFormatter(setting.AppURL+url.PathEscape(user.UserName), user.UserName) } - text = fmt.Sprintf("[%s] Issue assigned to %s: %s", p.Repository.FullName, strings.Join(list, ", "), titleLink) + text = fmt.Sprintf("[%s] Issue assigned to %s: %s", repoLink, strings.Join(list, ", "), titleLink) color = greenColor case api.HookIssueUnassigned: - text = fmt.Sprintf("[%s] Issue unassigned: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue unassigned: %s", repoLink, titleLink) case api.HookIssueLabelUpdated: - text = fmt.Sprintf("[%s] Issue labels updated: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue labels updated: %s", repoLink, titleLink) case api.HookIssueLabelCleared: - text = fmt.Sprintf("[%s] Issue labels cleared: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue labels cleared: %s", repoLink, titleLink) case api.HookIssueSynchronized: - text = fmt.Sprintf("[%s] Issue synchronized: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue synchronized: %s", repoLink, titleLink) case api.HookIssueMilestoned: - text = fmt.Sprintf("[%s] Issue milestoned to %s: %s", p.Repository.FullName, p.Issue.Milestone.Title, titleLink) + mileStoneLink := fmt.Sprintf("%s/milestone/%d", p.Repository.HTMLURL, p.Issue.Milestone.ID) + text = fmt.Sprintf("[%s] Issue milestoned to %s: %s", repoLink, + linkFormatter(mileStoneLink, p.Issue.Milestone.Title), titleLink) case api.HookIssueDemilestoned: - text = fmt.Sprintf("[%s] Issue milestone cleared: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Issue milestone cleared: %s", repoLink, titleLink) } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) } var attachmentText string @@ -141,6 +144,7 @@ func getIssuesPayloadInfo(p *api.IssuePayload, linkFormatter linkFormatter, with } func getPullRequestPayloadInfo(p *api.PullRequestPayload, linkFormatter linkFormatter, withSender bool) (string, string, string, int) { + repoLink := linkFormatter(p.Repository.HTMLURL, p.Repository.FullName) issueTitle := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) titleLink := linkFormatter(p.PullRequest.URL, issueTitle) var text string @@ -149,79 +153,83 @@ func getPullRequestPayloadInfo(p *api.PullRequestPayload, linkFormatter linkForm switch p.Action { case api.HookIssueOpened: - text = fmt.Sprintf("[%s] Pull request opened: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request opened: %s", repoLink, titleLink) attachmentText = p.PullRequest.Body color = greenColor case api.HookIssueClosed: if p.PullRequest.HasMerged { - text = fmt.Sprintf("[%s] Pull request merged: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request merged: %s", repoLink, titleLink) color = purpleColor } else { - text = fmt.Sprintf("[%s] Pull request closed: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request closed: %s", repoLink, titleLink) color = redColor } case api.HookIssueReOpened: - text = fmt.Sprintf("[%s] Pull request re-opened: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request re-opened: %s", repoLink, titleLink) case api.HookIssueEdited: - text = fmt.Sprintf("[%s] Pull request edited: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request edited: %s", repoLink, titleLink) attachmentText = p.PullRequest.Body case api.HookIssueAssigned: list := make([]string, len(p.PullRequest.Assignees)) for i, user := range p.PullRequest.Assignees { list[i] = linkFormatter(setting.AppURL+user.UserName, user.UserName) } - text = fmt.Sprintf("[%s] Pull request assigned to %s: %s", p.Repository.FullName, + text = fmt.Sprintf("[%s] Pull request assigned to %s: %s", repoLink, strings.Join(list, ", "), titleLink) color = greenColor case api.HookIssueUnassigned: - text = fmt.Sprintf("[%s] Pull request unassigned: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request unassigned: %s", repoLink, titleLink) case api.HookIssueLabelUpdated: - text = fmt.Sprintf("[%s] Pull request labels updated: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request labels updated: %s", repoLink, titleLink) case api.HookIssueLabelCleared: - text = fmt.Sprintf("[%s] Pull request labels cleared: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request labels cleared: %s", repoLink, titleLink) case api.HookIssueSynchronized: - text = fmt.Sprintf("[%s] Pull request synchronized: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request synchronized: %s", repoLink, titleLink) case api.HookIssueMilestoned: - text = fmt.Sprintf("[%s] Pull request milestoned to %s: %s", p.Repository.FullName, p.PullRequest.Milestone.Title, titleLink) + mileStoneLink := fmt.Sprintf("%s/milestone/%d", p.Repository.HTMLURL, p.PullRequest.Milestone.ID) + text = fmt.Sprintf("[%s] Pull request milestoned to %s: %s", repoLink, + linkFormatter(mileStoneLink, p.PullRequest.Milestone.Title), titleLink) case api.HookIssueDemilestoned: - text = fmt.Sprintf("[%s] Pull request milestone cleared: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request milestone cleared: %s", repoLink, titleLink) case api.HookIssueReviewed: - text = fmt.Sprintf("[%s] Pull request reviewed: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request reviewed: %s", repoLink, titleLink) attachmentText = p.Review.Content case api.HookIssueReviewRequested: - text = fmt.Sprintf("[%s] Pull request review requested: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request review requested: %s", repoLink, titleLink) case api.HookIssueReviewRequestRemoved: - text = fmt.Sprintf("[%s] Pull request review request removed: %s", p.Repository.FullName, titleLink) + text = fmt.Sprintf("[%s] Pull request review request removed: %s", repoLink, titleLink) } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName)) } return text, issueTitle, attachmentText, color } func getReleasePayloadInfo(p *api.ReleasePayload, linkFormatter linkFormatter, withSender bool) (text string, color int) { + repoLink := linkFormatter(p.Repository.HTMLURL, p.Repository.FullName) refLink := linkFormatter(p.Repository.HTMLURL+"/releases/tag/"+util.PathEscapeSegments(p.Release.TagName), p.Release.TagName) switch p.Action { case api.HookReleasePublished: - text = fmt.Sprintf("[%s] Release created: %s", p.Repository.FullName, refLink) + text = fmt.Sprintf("[%s] Release created: %s", repoLink, refLink) color = greenColor case api.HookReleaseUpdated: - text = fmt.Sprintf("[%s] Release updated: %s", p.Repository.FullName, refLink) + text = fmt.Sprintf("[%s] Release updated: %s", repoLink, refLink) color = yellowColor case api.HookReleaseDeleted: - text = fmt.Sprintf("[%s] Release deleted: %s", p.Repository.FullName, refLink) + text = fmt.Sprintf("[%s] Release deleted: %s", repoLink, refLink) color = redColor } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) } return text, color } func getWikiPayloadInfo(p *api.WikiPayload, linkFormatter linkFormatter, withSender bool) (string, int, string) { + repoLink := linkFormatter(p.Repository.HTMLURL, p.Repository.FullName) pageLink := linkFormatter(p.Repository.HTMLURL+"/wiki/"+url.PathEscape(p.Page), p.Page) var text string @@ -229,12 +237,12 @@ func getWikiPayloadInfo(p *api.WikiPayload, linkFormatter linkFormatter, withSen switch p.Action { case api.HookWikiCreated: - text = fmt.Sprintf("[%s] New wiki page '%s'", p.Repository.FullName, pageLink) + text = fmt.Sprintf("[%s] New wiki page '%s'", repoLink, pageLink) case api.HookWikiEdited: - text = fmt.Sprintf("[%s] Wiki page '%s' edited", p.Repository.FullName, pageLink) + text = fmt.Sprintf("[%s] Wiki page '%s' edited", repoLink, pageLink) color = yellowColor case api.HookWikiDeleted: - text = fmt.Sprintf("[%s] Wiki page '%s' deleted", p.Repository.FullName, pageLink) + text = fmt.Sprintf("[%s] Wiki page '%s' deleted", repoLink, pageLink) color = redColor } @@ -243,13 +251,14 @@ func getWikiPayloadInfo(p *api.WikiPayload, linkFormatter linkFormatter, withSen } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) } return text, color, pageLink } func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFormatter, withSender bool) (string, string, int) { + repoLink := linkFormatter(p.Repository.HTMLURL, p.Repository.FullName) issueTitle := fmt.Sprintf("#%d %s", p.Issue.Index, p.Issue.Title) var text, typ, titleLink string @@ -265,20 +274,20 @@ func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFo switch p.Action { case api.HookIssueCommentCreated: - text = fmt.Sprintf("[%s] New comment on %s %s", p.Repository.FullName, typ, titleLink) + text = fmt.Sprintf("[%s] New comment on %s %s", repoLink, typ, titleLink) if p.IsPull { color = greenColorLight } else { color = orangeColorLight } case api.HookIssueCommentEdited: - text = fmt.Sprintf("[%s] Comment edited on %s %s", p.Repository.FullName, typ, titleLink) + text = fmt.Sprintf("[%s] Comment edited on %s %s", repoLink, typ, titleLink) case api.HookIssueCommentDeleted: - text = fmt.Sprintf("[%s] Comment deleted on %s %s", p.Repository.FullName, typ, titleLink) + text = fmt.Sprintf("[%s] Comment deleted on %s %s", repoLink, typ, titleLink) color = redColor } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) } return text, issueTitle, color @@ -296,7 +305,7 @@ func getPackagePayloadInfo(p *api.PackagePayload, linkFormatter linkFormatter, w color = redColor } if withSender { - text += fmt.Sprintf(" by %s", p.Sender.UserName) + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) } return text, color diff --git a/services/webhook/general_test.go b/services/webhook/general_test.go index b321fb3f8c..6dcd787fab 100644 --- a/services/webhook/general_test.go +++ b/services/webhook/general_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - api "forgejo.org/modules/structs" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) @@ -72,10 +72,6 @@ func pushTestMultilineCommitMessagePayload() *api.PushPayload { return pushTestPayloadWithCommitMessage("This is a commit summary âš ï¸âš ï¸âš ï¸âš ï¸ containing 你好 âš ï¸âš ï¸ï¸\n\nThis is the message body.") } -func pushTestEscapeCommitMessagePayload() *api.PushPayload { - return pushTestPayloadWithCommitMessage("# conflicts\n# - some/conflicting/file.txt") -} - func pushTestPayloadWithCommitMessage(message string) *api.PushPayload { commit := &api.PayloadCommit{ ID: "2020558fe2e34debb818a514715839cabd25e778", diff --git a/services/webhook/gogs.go b/services/webhook/gogs.go index bbab1ad41d..7dbf64343f 100644 --- a/services/webhook/gogs.go +++ b/services/webhook/gogs.go @@ -7,10 +7,10 @@ import ( "html/template" "net/http" - webhook_model "forgejo.org/models/webhook" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type gogsHandler struct{ defaultHandler } diff --git a/services/webhook/main_test.go b/services/webhook/main_test.go index 97957291ca..756b9db230 100644 --- a/services/webhook/main_test.go +++ b/services/webhook/main_test.go @@ -6,13 +6,12 @@ package webhook import ( "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/setting" - _ "forgejo.org/models" - _ "forgejo.org/models/actions" - _ "forgejo.org/models/forgefed" + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" ) func TestMain(m *testing.M) { diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go index f1cc9384d3..e70e7a2f8e 100644 --- a/services/webhook/matrix.go +++ b/services/webhook/matrix.go @@ -9,23 +9,23 @@ import ( "crypto/sha1" "encoding/hex" "fmt" - "html" "html/template" "net/http" "net/url" "regexp" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/modules/svg" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/svg" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type matrixHandler struct{} @@ -143,8 +143,9 @@ func (m matrixConvertor) newPayload(text string, commits ...*api.PayloadCommit) // Create implements payloadConvertor Create method func (m matrixConvertor) Create(p *api.CreatePayload) (MatrixPayload, error) { + repoLink := htmlLinkFormatter(p.Repo.HTMLURL, p.Repo.FullName) refLink := MatrixLinkToRef(p.Repo.HTMLURL, p.Ref) - text := fmt.Sprintf("[%s:%s] %s created by %s", p.Repo.FullName, refLink, p.RefType, p.Sender.UserName) + text := fmt.Sprintf("[%s:%s] %s created by %s", repoLink, refLink, p.RefType, p.Sender.UserName) return m.newPayload(text) } @@ -205,8 +206,9 @@ func (m matrixConvertor) Push(p *api.PushPayload) (MatrixPayload, error) { commitDesc = fmt.Sprintf("%d commits", p.TotalCommits) } - refName := html.EscapeString(git.RefName(p.Ref).ShortName()) - text := fmt.Sprintf("[%s] %s pushed %s to %s:
      ", p.Repo.FullName, p.Pusher.UserName, commitDesc, refName) + repoLink := htmlLinkFormatter(p.Repo.HTMLURL, p.Repo.FullName) + branchLink := MatrixLinkToRef(p.Repo.HTMLURL, p.Ref) + text := fmt.Sprintf("[%s] %s pushed %s to %s:
      ", repoLink, p.Pusher.UserName, commitDesc, branchLink) // for each commit, generate a new line text for i, commit := range p.Commits { @@ -229,8 +231,10 @@ func (m matrixConvertor) PullRequest(p *api.PullRequestPayload) (MatrixPayload, // Review implements payloadConvertor Review method func (m matrixConvertor) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (MatrixPayload, error) { + senderLink := htmlLinkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName) title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) titleLink := htmlLinkFormatter(p.PullRequest.HTMLURL, title) + repoLink := htmlLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName) var text string if p.Action == api.HookIssueReviewed { @@ -239,7 +243,7 @@ func (m matrixConvertor) Review(p *api.PullRequestPayload, event webhook_module. return MatrixPayload{}, err } - text = fmt.Sprintf("[%s] Pull request review %s: %s by %s", p.Repository.FullName, action, titleLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Pull request review %s: %s by %s", repoLink, action, titleLink, senderLink) } return m.newPayload(text) @@ -247,27 +251,29 @@ func (m matrixConvertor) Review(p *api.PullRequestPayload, event webhook_module. // Repository implements payloadConvertor Repository method func (m matrixConvertor) Repository(p *api.RepositoryPayload) (MatrixPayload, error) { + senderLink := htmlLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) repoLink := htmlLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName) var text string switch p.Action { case api.HookRepoCreated: - text = fmt.Sprintf("[%s] Repository created by %s", repoLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Repository created by %s", repoLink, senderLink) case api.HookRepoDeleted: - text = fmt.Sprintf("[%s] Repository deleted by %s", repoLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Repository deleted by %s", repoLink, senderLink) } return m.newPayload(text) } func (m matrixConvertor) Package(p *api.PackagePayload) (MatrixPayload, error) { + senderLink := htmlLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) packageLink := htmlLinkFormatter(p.Package.HTMLURL, p.Package.Name) var text string switch p.Action { case api.HookPackageCreated: - text = fmt.Sprintf("[%s] Package published by %s", packageLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Package published by %s", packageLink, senderLink) case api.HookPackageDeleted: - text = fmt.Sprintf("[%s] Package deleted by %s", packageLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Package deleted by %s", packageLink, senderLink) } return m.newPayload(text) diff --git a/services/webhook/matrix_test.go b/services/webhook/matrix_test.go index 1644def0e1..6cedb15ef3 100644 --- a/services/webhook/matrix_test.go +++ b/services/webhook/matrix_test.go @@ -4,12 +4,13 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,8 +28,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo:[test](http://localhost:3000/test/repo/src/branch/test)] branch created by user1", pl.Body) - assert.Equal(t, `[test/repo:test] branch created by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo):[test](http://localhost:3000/test/repo/src/branch/test)] branch created by user1", pl.Body) + assert.Equal(t, `[test/repo:test] branch created by user1`, pl.FormattedBody) }) t.Run("Delete", func(t *testing.T) { @@ -60,8 +61,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] user1 pushed 2 commits to test:\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1", pl.Body) - assert.Equal(t, `[test/repo] user1 pushed 2 commits to test:
      2020558: commit message - user1
      2020558: commit message - user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] user1 pushed 2 commits to [test](http://localhost:3000/test/repo/src/branch/test):\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1", pl.Body) + assert.Equal(t, `[test/repo] user1 pushed 2 commits to test:
      2020558: commit message - user1
      2020558: commit message - user1`, pl.FormattedBody) }) t.Run("Issue", func(t *testing.T) { @@ -72,16 +73,16 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Issue opened: [#2 crash](http://localhost:3000/test/repo/issues/2) by user1", pl.Body) - assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Issue opened: [#2 crash](http://localhost:3000/test/repo/issues/2) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1`, pl.FormattedBody) p.Action = api.HookIssueClosed pl, err = mc.Issue(p) require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Issue closed: [#2 crash](http://localhost:3000/test/repo/issues/2) by user1", pl.Body) - assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Issue closed: [#2 crash](http://localhost:3000/test/repo/issues/2) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.FormattedBody) }) t.Run("IssueComment", func(t *testing.T) { @@ -91,8 +92,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] New comment on issue [#2 crash](http://localhost:3000/test/repo/issues/2) by user1", pl.Body) - assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] New comment on issue [#2 crash](http://localhost:3000/test/repo/issues/2) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1`, pl.FormattedBody) }) t.Run("PullRequest", func(t *testing.T) { @@ -102,8 +103,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Pull request opened: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by user1", pl.Body) - assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Pull request opened: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1`, pl.FormattedBody) }) t.Run("PullRequestComment", func(t *testing.T) { @@ -113,8 +114,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] New comment on pull request [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by user1", pl.Body) - assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] New comment on pull request [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1`, pl.FormattedBody) }) t.Run("Review", func(t *testing.T) { @@ -125,8 +126,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Pull request review approved: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by user1", pl.Body) - assert.Equal(t, `[test/repo] Pull request review approved: #12 Fix bug by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Pull request review approved: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Pull request review approved: #12 Fix bug by user1`, pl.FormattedBody) }) t.Run("Repository", func(t *testing.T) { @@ -136,8 +137,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, `[[test/repo](http://localhost:3000/test/repo)] Repository created by user1`, pl.Body) - assert.Equal(t, `[test/repo] Repository created by user1`, pl.FormattedBody) + assert.Equal(t, `[[test/repo](http://localhost:3000/test/repo)] Repository created by [user1](https://try.gitea.io/user1)`, pl.Body) + assert.Equal(t, `[test/repo] Repository created by user1`, pl.FormattedBody) }) t.Run("Package", func(t *testing.T) { @@ -147,8 +148,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, `[[GiteaContainer](http://localhost:3000/user1/-/packages/container/GiteaContainer/latest)] Package published by user1`, pl.Body) - assert.Equal(t, `[GiteaContainer] Package published by user1`, pl.FormattedBody) + assert.Equal(t, `[[GiteaContainer](http://localhost:3000/user1/-/packages/container/GiteaContainer/latest)] Package published by [user1](https://try.gitea.io/user1)`, pl.Body) + assert.Equal(t, `[GiteaContainer] Package published by user1`, pl.FormattedBody) }) t.Run("Wiki", func(t *testing.T) { @@ -159,24 +160,24 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] New wiki page '[index](http://localhost:3000/test/repo/wiki/index)' (Wiki change comment) by user1", pl.Body) - assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] New wiki page '[index](http://localhost:3000/test/repo/wiki/index)' (Wiki change comment) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.FormattedBody) p.Action = api.HookWikiEdited pl, err = mc.Wiki(p) require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Wiki page '[index](http://localhost:3000/test/repo/wiki/index)' edited (Wiki change comment) by user1", pl.Body) - assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Wiki page '[index](http://localhost:3000/test/repo/wiki/index)' edited (Wiki change comment) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.FormattedBody) p.Action = api.HookWikiDeleted pl, err = mc.Wiki(p) require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Wiki page '[index](http://localhost:3000/test/repo/wiki/index)' deleted by user1", pl.Body) - assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Wiki page '[index](http://localhost:3000/test/repo/wiki/index)' deleted by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.FormattedBody) }) t.Run("Release", func(t *testing.T) { @@ -186,8 +187,8 @@ func TestMatrixPayload(t *testing.T) { require.NoError(t, err) require.NotNil(t, pl) - assert.Equal(t, "[test/repo] Release created: [v1.0](http://localhost:3000/test/repo/releases/tag/v1.0) by user1", pl.Body) - assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.FormattedBody) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] Release created: [v1.0](http://localhost:3000/test/repo/releases/tag/v1.0) by [user1](https://try.gitea.io/user1)", pl.Body) + assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.FormattedBody) }) } @@ -210,18 +211,18 @@ func TestMatrixJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := matrixHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := matrixHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) assert.Equal(t, "PUT", req.Method) - assert.Equal(t, "/_matrix/client/v3/rooms/ROOM_ID/send/m.room.message/86aaa4d69df5aa487cb0148af4ae7e546933057b", req.URL.Path) + assert.Equal(t, "/_matrix/client/v3/rooms/ROOM_ID/send/m.room.message/6db5dc1e282529a8c162c7fe93dd2667494eeb51", req.URL.Path) assert.Equal(t, "application/json", req.Header.Get("Content-Type")) var body MatrixPayload err = json.NewDecoder(req.Body).Decode(&body) require.NoError(t, err) - assert.Equal(t, "[test/repo] user1 pushed 2 commits to test:\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1", body.Body) + assert.Equal(t, "[[test/repo](http://localhost:3000/test/repo)] user1 pushed 2 commits to [test](http://localhost:3000/test/repo/src/branch/test):\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778): commit message - user1", body.Body) } func Test_getTxnID(t *testing.T) { diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go index 1ed03afd26..736d084a8c 100644 --- a/services/webhook/msteams.go +++ b/services/webhook/msteams.go @@ -11,13 +11,13 @@ import ( "net/url" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type msteamsHandler struct{} diff --git a/services/webhook/msteams_test.go b/services/webhook/msteams_test.go index b210f299bc..a97e9f3de3 100644 --- a/services/webhook/msteams_test.go +++ b/services/webhook/msteams_test.go @@ -4,12 +4,13 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -438,7 +439,7 @@ func TestMSTeamsJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := msteamsHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := msteamsHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go index e9fd52c940..a9b3422653 100644 --- a/services/webhook/notifier.go +++ b/services/webhook/notifier.go @@ -6,20 +6,20 @@ package webhook import ( "context" - issues_model "forgejo.org/models/issues" - packages_model "forgejo.org/models/packages" - "forgejo.org/models/perm" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/convert" - notify_service "forgejo.org/services/notify" + issues_model "code.gitea.io/gitea/models/issues" + packages_model "code.gitea.io/gitea/models/packages" + "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" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/convert" + notify_service "code.gitea.io/gitea/services/notify" ) func init() { @@ -59,7 +59,7 @@ func (m *webhookNotifier) IssueClearLabels(ctx context.Context, doer *user_model err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelCleared, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -150,7 +150,7 @@ func (m *webhookNotifier) IssueChangeAssignee(ctx context.Context, doer *user_mo } apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), } @@ -201,7 +201,7 @@ func (m *webhookNotifier) IssueChangeTitle(ctx context.Context, doer *user_model From: oldTitle, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -236,7 +236,7 @@ func (m *webhookNotifier) IssueChangeStatus(ctx context.Context, doer *user_mode // Merge pull request calls issue.changeStatus so we need to handle separately. apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), CommitID: commitID, @@ -307,7 +307,7 @@ func (m *webhookNotifier) NewPullRequest(ctx context.Context, pull *issues_model if err := PrepareWebhooks(ctx, EventSource{Repository: pull.Issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ Action: api.HookIssueOpened, Index: pull.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pull, pull.Issue.Poster), + PullRequest: convert.ToAPIPullRequest(ctx, pull, nil), Repository: convert.ToRepo(ctx, pull.Issue.Repo, permission), Sender: convert.ToUser(ctx, pull.Issue.Poster, nil), }); err != nil { @@ -336,7 +336,7 @@ func (m *webhookNotifier) IssueChangeContent(ctx context.Context, doer *user_mod From: oldContent, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -375,20 +375,17 @@ func (m *webhookNotifier) UpdateComment(ctx context.Context, doer *user_model.Us } var eventType webhook_module.HookEventType - var pullRequest *api.PullRequest if c.Issue.IsPull { eventType = webhook_module.HookEventPullRequestComment - pullRequest = convert.ToAPIPullRequest(ctx, c.Issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, c.Issue.Repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentEdited, - Issue: convert.ToAPIIssue(ctx, doer, c.Issue), - PullRequest: pullRequest, - Comment: convert.ToAPIComment(ctx, c.Issue.Repo, c), + Action: api.HookIssueCommentEdited, + Issue: convert.ToAPIIssue(ctx, doer, c.Issue), + Comment: convert.ToAPIComment(ctx, c.Issue.Repo, c), Changes: &api.ChangesPayload{ Body: &api.ChangesFromPayload{ From: oldContent, @@ -406,27 +403,20 @@ func (m *webhookNotifier) CreateIssueComment(ctx context.Context, doer *user_mod issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User, ) { var eventType webhook_module.HookEventType - var pullRequest *api.PullRequest if issue.IsPull { eventType = webhook_module.HookEventPullRequestComment - if err := issue.LoadPullRequest(ctx); err != nil { - log.Error("LoadPullRequest: %v", err) - return - } - pullRequest = convert.ToAPIPullRequest(ctx, issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentCreated, - Issue: convert.ToAPIIssue(ctx, doer, issue), - PullRequest: pullRequest, - Comment: convert.ToAPIComment(ctx, repo, comment), - Repository: convert.ToRepo(ctx, repo, permission), - Sender: convert.ToUser(ctx, doer, nil), - IsPull: issue.IsPull, + Action: api.HookIssueCommentCreated, + Issue: convert.ToAPIIssue(ctx, doer, issue), + Comment: convert.ToAPIComment(ctx, repo, comment), + Repository: convert.ToRepo(ctx, repo, permission), + Sender: convert.ToUser(ctx, doer, nil), + IsPull: issue.IsPull, }); err != nil { log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } @@ -450,23 +440,20 @@ func (m *webhookNotifier) DeleteComment(ctx context.Context, doer *user_model.Us } var eventType webhook_module.HookEventType - var pullRequest *api.PullRequest if comment.Issue.IsPull { eventType = webhook_module.HookEventPullRequestComment - pullRequest = convert.ToAPIPullRequest(ctx, comment.Issue.PullRequest, doer) } else { eventType = webhook_module.HookEventIssueComment } permission, _ := access_model.GetUserRepoPermission(ctx, comment.Issue.Repo, doer) if err := PrepareWebhooks(ctx, EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ - Action: api.HookIssueCommentDeleted, - Issue: convert.ToAPIIssue(ctx, doer, comment.Issue), - PullRequest: pullRequest, - Comment: convert.ToAPIComment(ctx, comment.Issue.Repo, comment), - Repository: convert.ToRepo(ctx, comment.Issue.Repo, permission), - Sender: convert.ToUser(ctx, doer, nil), - IsPull: comment.Issue.IsPull, + Action: api.HookIssueCommentDeleted, + Issue: convert.ToAPIIssue(ctx, doer, comment.Issue), + Comment: convert.ToAPIComment(ctx, comment.Issue.Repo, comment), + Repository: convert.ToRepo(ctx, comment.Issue.Repo, permission), + Sender: convert.ToUser(ctx, doer, nil), + IsPull: comment.Issue.IsPull, }); err != nil { log.Error("PrepareWebhooks [comment_id: %d]: %v", comment.ID, err) } @@ -538,7 +525,7 @@ func (m *webhookNotifier) IssueChangeLabels(ctx context.Context, doer *user_mode err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ Action: api.HookIssueLabelUpdated, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, access_model.Permission{AccessMode: perm.AccessModeOwner}), Sender: convert.ToUser(ctx, doer, nil), }) @@ -580,7 +567,7 @@ func (m *webhookNotifier) IssueChangeMilestone(ctx context.Context, doer *user_m err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestMilestone, &api.PullRequestPayload{ Action: hookAction, Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), }) @@ -599,10 +586,6 @@ func (m *webhookNotifier) IssueChangeMilestone(ctx context.Context, doer *user_m } func (m *webhookNotifier) PushCommits(ctx context.Context, pusher *user_model.User, repo *repo_model.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { - if len(commits.Commits) > setting.Webhook.PayloadCommitLimit { - commits.Commits = commits.Commits[:setting.Webhook.PayloadCommitLimit] - } - apiPusher := convert.ToUser(ctx, pusher, nil) apiCommits, apiHeadCommit, err := commits.ToAPIPayloadCommits(ctx, repo.RepoPath(), repo.HTMLURL()) if err != nil { @@ -657,7 +640,7 @@ func (*webhookNotifier) MergePullRequest(ctx context.Context, doer *user_model.U // Merge pull request calls issue.changeStatus so we need to handle separately. apiPullRequest := &api.PullRequestPayload{ Index: pr.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), + PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), Repository: convert.ToRepo(ctx, pr.Issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), Action: api.HookIssueClosed, @@ -685,7 +668,7 @@ func (m *webhookNotifier) PullRequestChangeTargetBranch(ctx context.Context, doe From: oldBranch, }, }, - PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), + PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), Repository: convert.ToRepo(ctx, issue.Repo, mode), Sender: convert.ToUser(ctx, doer, nil), }); err != nil { @@ -720,12 +703,11 @@ func (m *webhookNotifier) PullRequestReview(ctx context.Context, pr *issues_mode return } if err := PrepareWebhooks(ctx, EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ - Action: api.HookIssueReviewed, - Index: review.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, review.Reviewer), - RequestedReviewer: convert.ToUser(ctx, review.Reviewer, nil), - Repository: convert.ToRepo(ctx, review.Issue.Repo, permission), - Sender: convert.ToUser(ctx, review.Reviewer, nil), + Action: api.HookIssueReviewed, + Index: review.Issue.Index, + PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), + Repository: convert.ToRepo(ctx, review.Issue.Repo, permission), + Sender: convert.ToUser(ctx, review.Reviewer, nil), Review: &api.ReviewPayload{ Type: string(reviewHookType), Content: review.Content, @@ -747,7 +729,7 @@ func (m *webhookNotifier) PullRequestReviewRequest(ctx context.Context, doer *us } apiPullRequest := &api.PullRequestPayload{ Index: issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer), + PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), RequestedReviewer: convert.ToUser(ctx, reviewer, nil), Repository: convert.ToRepo(ctx, issue.Repo, permission), Sender: convert.ToUser(ctx, doer, nil), @@ -791,7 +773,7 @@ func (m *webhookNotifier) PullRequestSynchronized(ctx context.Context, doer *use if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequestSync, &api.PullRequestPayload{ Action: api.HookIssueSynchronized, Index: pr.Issue.Index, - PullRequest: convert.ToAPIPullRequest(ctx, pr, doer), + PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), Repository: convert.ToRepo(ctx, pr.Issue.Repo, access_model.Permission{AccessMode: perm.AccessModeOwner}), Sender: convert.ToUser(ctx, doer, nil), }); err != nil { @@ -844,10 +826,6 @@ func (m *webhookNotifier) DeleteRelease(ctx context.Context, doer *user_model.Us } func (m *webhookNotifier) SyncPushCommits(ctx context.Context, pusher *user_model.User, repo *repo_model.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { - if len(commits.Commits) > setting.Webhook.PayloadCommitLimit { - commits.Commits = commits.Commits[:setting.Webhook.PayloadCommitLimit] - } - apiPusher := convert.ToUser(ctx, pusher, nil) apiCommits, apiHeadCommit, err := commits.ToAPIPayloadCommits(ctx, repo.RepoPath(), repo.HTMLURL()) if err != nil { diff --git a/services/webhook/notifier_test.go b/services/webhook/notifier_test.go deleted file mode 100644 index 46eb1f089c..0000000000 --- a/services/webhook/notifier_test.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package webhook - -import ( - "testing" - - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/test" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func pushCommits() *repository.PushCommits { - pushCommits := repository.NewPushCommits() - pushCommits.Commits = []*repository.PushCommit{ - { - Sha1: "2c54faec6c45d31c1abfaecdab471eac6633738a", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "not signed commit", - }, - { - Sha1: "205ac761f3326a7ebe416e8673760016450b5cec", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "good signed commit (with not yet validated email)", - }, - { - Sha1: "1032bbf17fbc0d9c95bb5418dabe8f8c99278700", - CommitterEmail: "user2@example.com", - CommitterName: "User2", - AuthorEmail: "user2@example.com", - AuthorName: "User2", - Message: "good signed commit", - }, - } - pushCommits.HeadCommit = &repository.PushCommit{Sha1: "2c54faec6c45d31c1abfaecdab471eac6633738a"} - return pushCommits -} - -func TestSyncPushCommits(t *testing.T) { - defer unittest.OverrideFixtures("services/webhook/TestPushCommits")() - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2, OwnerID: user.ID}) - - t.Run("All commits", func(t *testing.T) { - defer test.MockVariableValue(&setting.Webhook.PayloadCommitLimit, 10)() - - NewNotifier().SyncPushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("master-1")}, pushCommits()) - - hookTask := unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{}, unittest.Cond("payload_content LIKE '%master-1%'")) - - var payloadContent structs.PushPayload - require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payloadContent)) - assert.Len(t, payloadContent.Commits, 3) - }) - - t.Run("Only one commit", func(t *testing.T) { - defer test.MockVariableValue(&setting.Webhook.PayloadCommitLimit, 1)() - - NewNotifier().SyncPushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("main-1")}, pushCommits()) - - hookTask := unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{}, unittest.Cond("payload_content LIKE '%main-1%'")) - - var payloadContent structs.PushPayload - require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payloadContent)) - assert.Len(t, payloadContent.Commits, 1) - assert.EqualValues(t, "2c54faec6c45d31c1abfaecdab471eac6633738a", payloadContent.Commits[0].ID) - }) -} - -func TestPushCommits(t *testing.T) { - defer unittest.OverrideFixtures("services/webhook/TestPushCommits")() - require.NoError(t, unittest.PrepareTestDatabase()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2, OwnerID: user.ID}) - - t.Run("All commits", func(t *testing.T) { - defer test.MockVariableValue(&setting.Webhook.PayloadCommitLimit, 10)() - - NewNotifier().PushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("master-2")}, pushCommits()) - - hookTask := unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{}, unittest.Cond("payload_content LIKE '%master-2%'")) - - var payloadContent structs.PushPayload - require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payloadContent)) - assert.Len(t, payloadContent.Commits, 3) - }) - - t.Run("Only one commit", func(t *testing.T) { - defer test.MockVariableValue(&setting.Webhook.PayloadCommitLimit, 1)() - - NewNotifier().PushCommits(db.DefaultContext, user, repo, &repository.PushUpdateOptions{RefFullName: git.RefNameFromBranch("main-2")}, pushCommits()) - - hookTask := unittest.AssertExistsAndLoadBean(t, &webhook_model.HookTask{}, unittest.Cond("payload_content LIKE '%main-2%'")) - - var payloadContent structs.PushPayload - require.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payloadContent)) - assert.Len(t, payloadContent.Commits, 1) - assert.EqualValues(t, "2c54faec6c45d31c1abfaecdab471eac6633738a", payloadContent.Commits[0].ID) - }) -} diff --git a/services/webhook/packagist.go b/services/webhook/packagist.go index 7ae3e0c48f..9831a4e008 100644 --- a/services/webhook/packagist.go +++ b/services/webhook/packagist.go @@ -10,12 +10,12 @@ import ( "net/http" "net/url" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type packagistHandler struct{} diff --git a/services/webhook/packagist_test.go b/services/webhook/packagist_test.go index e5bf4ec8d1..320c1c85a1 100644 --- a/services/webhook/packagist_test.go +++ b/services/webhook/packagist_test.go @@ -4,13 +4,14 @@ package webhook import ( + "context" "fmt" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -52,7 +53,7 @@ func TestPackagistPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := packagistHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := packagistHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) diff --git a/services/webhook/shared/img.go b/services/webhook/shared/img.go index 95286c563e..2d65ba4e0f 100644 --- a/services/webhook/shared/img.go +++ b/services/webhook/shared/img.go @@ -5,7 +5,7 @@ import ( "html/template" "strconv" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) func ImgIcon(name string, size int) template.HTML { diff --git a/services/webhook/shared/payloader.go b/services/webhook/shared/payloader.go index 0a6535eddb..cf0bfa82cb 100644 --- a/services/webhook/shared/payloader.go +++ b/services/webhook/shared/payloader.go @@ -14,10 +14,10 @@ import ( "io" "net/http" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" ) var ErrPayloadTypeNotSupported = errors.New("unsupported webhook event") diff --git a/services/webhook/slack.go b/services/webhook/slack.go index e854f89c6c..af93976bd6 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -11,17 +11,18 @@ import ( "regexp" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" ) type slackHandler struct{} @@ -144,8 +145,9 @@ func SlackLinkToRef(repoURL, ref string) string { // Create implements payloadConvertor Create method func (s slackConvertor) Create(p *api.CreatePayload) (SlackPayload, error) { + repoLink := SlackLinkFormatter(p.Repo.HTMLURL, p.Repo.FullName) refLink := SlackLinkToRef(p.Repo.HTMLURL, p.Ref) - text := fmt.Sprintf("[%s:%s] %s created by %s", p.Repo.FullName, refLink, p.RefType, p.Sender.UserName) + text := fmt.Sprintf("[%s:%s] %s created by %s", repoLink, refLink, p.RefType, p.Sender.UserName) return s.createPayload(text, nil), nil } @@ -238,8 +240,9 @@ func (s slackConvertor) Push(p *api.PushPayload) (SlackPayload, error) { commitString = commitDesc } + repoLink := SlackLinkFormatter(p.Repo.HTMLURL, p.Repo.FullName) branchLink := SlackLinkToRef(p.Repo.HTMLURL, p.Ref) - text := fmt.Sprintf("[%s:%s] %s pushed by %s", p.Repo.FullName, branchLink, commitString, p.Pusher.UserName) + text := fmt.Sprintf("[%s:%s] %s pushed by %s", repoLink, branchLink, commitString, p.Pusher.UserName) var attachmentText string // for each commit, generate attachment text @@ -280,8 +283,10 @@ func (s slackConvertor) PullRequest(p *api.PullRequestPayload) (SlackPayload, er // Review implements payloadConvertor Review method func (s slackConvertor) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (SlackPayload, error) { + senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) titleLink := fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index) + repoLink := SlackLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName) var text string if p.Action == api.HookIssueReviewed { @@ -290,7 +295,7 @@ func (s slackConvertor) Review(p *api.PullRequestPayload, event webhook_module.H return SlackPayload{}, err } - text = fmt.Sprintf("[%s] Pull request review %s: [%s](%s) by %s", p.Repository.FullName, action, title, titleLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Pull request review %s: [%s](%s) by %s", repoLink, action, title, titleLink, senderLink) } return s.createPayload(text, nil), nil @@ -298,14 +303,15 @@ func (s slackConvertor) Review(p *api.PullRequestPayload, event webhook_module.H // Repository implements payloadConvertor Repository method func (s slackConvertor) Repository(p *api.RepositoryPayload) (SlackPayload, error) { + senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) repoLink := SlackLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName) var text string switch p.Action { case api.HookRepoCreated: - text = fmt.Sprintf("[%s] Repository created by %s", repoLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Repository created by %s", repoLink, senderLink) case api.HookRepoDeleted: - text = fmt.Sprintf("[%s] Repository deleted by %s", repoLink, p.Sender.UserName) + text = fmt.Sprintf("[%s] Repository deleted by %s", repoLink, senderLink) } return s.createPayload(text, nil), nil diff --git a/services/webhook/slack_test.go b/services/webhook/slack_test.go index 62090fd310..3d801843ae 100644 --- a/services/webhook/slack_test.go +++ b/services/webhook/slack_test.go @@ -4,12 +4,13 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,7 +25,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Create(p) require.NoError(t, err) - assert.Equal(t, "[test/repo:] branch created by user1", pl.Text) + assert.Equal(t, "[:] branch created by user1", pl.Text) }) t.Run("Delete", func(t *testing.T) { @@ -51,7 +52,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Push(p) require.NoError(t, err) - assert.Equal(t, "[test/repo:] 2 new commits pushed by user1", pl.Text) + assert.Equal(t, "[:] 2 new commits pushed by user1", pl.Text) }) t.Run("Issue", func(t *testing.T) { @@ -61,13 +62,13 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Issue(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Issue opened: by user1", pl.Text) + assert.Equal(t, "[] Issue opened: by ", pl.Text) p.Action = api.HookIssueClosed pl, err = sc.Issue(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Issue closed: by user1", pl.Text) + assert.Equal(t, "[] Issue closed: by ", pl.Text) }) t.Run("IssueComment", func(t *testing.T) { @@ -76,7 +77,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] New comment on issue by user1", pl.Text) + assert.Equal(t, "[] New comment on issue by ", pl.Text) }) t.Run("PullRequest", func(t *testing.T) { @@ -85,7 +86,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.PullRequest(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Pull request opened: by user1", pl.Text) + assert.Equal(t, "[] Pull request opened: by ", pl.Text) }) t.Run("PullRequestComment", func(t *testing.T) { @@ -94,7 +95,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] New comment on pull request by user1", pl.Text) + assert.Equal(t, "[] New comment on pull request by ", pl.Text) }) t.Run("Review", func(t *testing.T) { @@ -104,7 +105,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Review(p, webhook_module.HookEventPullRequestReviewApproved) require.NoError(t, err) - assert.Equal(t, "[test/repo] Pull request review approved: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by user1", pl.Text) + assert.Equal(t, "[] Pull request review approved: [#12 Fix bug](http://localhost:3000/test/repo/pulls/12) by ", pl.Text) }) t.Run("Repository", func(t *testing.T) { @@ -113,7 +114,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Repository(p) require.NoError(t, err) - assert.Equal(t, "[] Repository created by user1", pl.Text) + assert.Equal(t, "[] Repository created by ", pl.Text) }) t.Run("Package", func(t *testing.T) { @@ -122,7 +123,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Package(p) require.NoError(t, err) - assert.Equal(t, "Package created: by user1", pl.Text) + assert.Equal(t, "Package created: by ", pl.Text) }) t.Run("Wiki", func(t *testing.T) { @@ -132,19 +133,19 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Wiki(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] New wiki page '' (Wiki change comment) by user1", pl.Text) + assert.Equal(t, "[] New wiki page '' (Wiki change comment) by ", pl.Text) p.Action = api.HookWikiEdited pl, err = sc.Wiki(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Wiki page '' edited (Wiki change comment) by user1", pl.Text) + assert.Equal(t, "[] Wiki page '' edited (Wiki change comment) by ", pl.Text) p.Action = api.HookWikiDeleted pl, err = sc.Wiki(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Wiki page '' deleted by user1", pl.Text) + assert.Equal(t, "[] Wiki page '' deleted by ", pl.Text) }) t.Run("Release", func(t *testing.T) { @@ -153,7 +154,7 @@ func TestSlackPayload(t *testing.T) { pl, err := sc.Release(p) require.NoError(t, err) - assert.Equal(t, "[test/repo] Release created: by user1", pl.Text) + assert.Equal(t, "[] Release created: by ", pl.Text) }) } @@ -177,7 +178,7 @@ func TestSlackJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := slackHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := slackHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) @@ -189,7 +190,7 @@ func TestSlackJSONPayload(t *testing.T) { var body SlackPayload err = json.NewDecoder(req.Body).Decode(&body) require.NoError(t, err) - assert.Equal(t, "[test/repo:] 2 new commits pushed by user1", body.Text) + assert.Equal(t, "[:] 2 new commits pushed by user1", body.Text) } func TestIsValidSlackChannel(t *testing.T) { diff --git a/services/webhook/sourcehut/builds.go b/services/webhook/sourcehut/builds.go index bd3eeebc6c..7b7ace15bb 100644 --- a/services/webhook/sourcehut/builds.go +++ b/services/webhook/sourcehut/builds.go @@ -8,24 +8,23 @@ import ( "context" "fmt" "html/template" - "io" "io/fs" "net/http" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" - "code.forgejo.org/go-chi/binding" + "gitea.com/go-chi/binding" "gopkg.in/yaml.v3" ) @@ -190,11 +189,11 @@ func (pc sourcehutConvertor) Package(_ *api.PackagePayload) (graphqlPayload[buil return graphqlPayload[buildsVariables]{}, shared.ErrPayloadTypeNotSupported } -// newPayload opens and adjusts the manifest to submit to the builds service +// mustBuildManifest adjusts the manifest to submit to the builds service // // in case of an error the Error field will be set, to be visible by the end-user under recent deliveries func (pc sourcehutConvertor) newPayload(repo *api.Repository, commitID, ref, note string, trusted bool) (graphqlPayload[buildsVariables], error) { - manifest, err := pc.constructManifest(repo, commitID, ref) + manifest, err := pc.buildManifest(repo, commitID, ref) if err != nil { if len(manifest) == 0 { return graphqlPayload[buildsVariables]{}, err @@ -239,9 +238,9 @@ func (pc sourcehutConvertor) newPayload(repo *api.Repository, commitID, ref, not }, nil } -// constructManifest opens and adjusts the manifest to submit to the builds service +// buildManifest adjusts the manifest to submit to the builds service // in case of an error the []byte might contain an error that can be displayed to the user -func (pc sourcehutConvertor) constructManifest(repo *api.Repository, commitID, gitRef string) ([]byte, error) { +func (pc sourcehutConvertor) buildManifest(repo *api.Repository, commitID, gitRef string) ([]byte, error) { gitRepo, err := gitrepo.OpenRepository(pc.ctx, repo) if err != nil { msg := "could not open repository" @@ -266,10 +265,6 @@ func (pc sourcehutConvertor) constructManifest(repo *api.Repository, commitID, g } defer r.Close() - return adjustManifest(repo, commitID, gitRef, r, pc.meta.ManifestPath) -} - -func adjustManifest(repo *api.Repository, commitID, gitRef string, r io.Reader, path string) ([]byte, error) { // reference: https://man.sr.ht/builds.sr.ht/manifest.md var manifest struct { Sources []string `yaml:"sources"` @@ -278,7 +273,7 @@ func adjustManifest(repo *api.Repository, commitID, gitRef string, r io.Reader, Rest map[string]yaml.Node `yaml:",inline"` } if err := yaml.NewDecoder(r).Decode(&manifest); err != nil { - msg := fmt.Sprintf("could not decode manifest %q", path) + msg := fmt.Sprintf("could not decode manifest %q", pc.meta.ManifestPath) return []byte(msg), fmt.Errorf(msg+": %w", err) } @@ -289,21 +284,16 @@ func adjustManifest(repo *api.Repository, commitID, gitRef string, r io.Reader, manifest.Environment["BUILD_SUBMITTER_URL"] = setting.AppURL manifest.Environment["GIT_REF"] = gitRef + source := repo.CloneURL + "#" + commitID found := false for i, s := range manifest.Sources { - if s == repo.CloneURL || s == repo.SSHURL { - manifest.Sources[i] = s + "#" + commitID + if s == repo.CloneURL { + manifest.Sources[i] = source found = true break } } if !found { - source := repo.CloneURL - if repo.Private || setting.Repository.DisableHTTPGit { - // default to ssh for private repos or when git clone is disabled over http - source = repo.SSHURL - } - source += "#" + commitID manifest.Sources = append(manifest.Sources, source) } diff --git a/services/webhook/sourcehut/builds_test.go b/services/webhook/sourcehut/builds_test.go index ac4172f5ff..1a37279c99 100644 --- a/services/webhook/sourcehut/builds_test.go +++ b/services/webhook/sourcehut/builds_test.go @@ -4,17 +4,17 @@ package sourcehut import ( - "strings" + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/webhook/shared" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -25,7 +25,7 @@ func gitInit(t testing.TB) { return } t.Cleanup(test.MockVariableValue(&setting.Git.HomePath, t.TempDir())) - require.NoError(t, git.InitSimple(t.Context())) + require.NoError(t, git.InitSimple(context.Background())) } func TestSourcehutBuildsPayload(t *testing.T) { @@ -371,7 +371,7 @@ func TestSourcehutJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := BuildsHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := BuildsHandler{}.NewRequest(context.Background(), hook, task) require.NoError(t, err) require.NotNil(t, req) require.NotNil(t, reqBody) @@ -384,134 +384,3 @@ func TestSourcehutJSONPayload(t *testing.T) { require.NoError(t, err) assert.Equal(t, "json test", body.Variables.Note) } - -func TestSourcehutAdjustManifest(t *testing.T) { - defer test.MockVariableValue(&setting.AppURL, "https://example.forgejo.org/")() - t.Run("without sources", func(t *testing.T) { - repo := &api.Repository{ - CloneURL: "http://localhost:3000/testdata/repo.git", - } - - manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge -tasks: - - say-hello: | - echo hello - - say-world: echo world`), ".build.yml") - - require.NoError(t, err) - assert.Equal(t, `sources: - - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 -environment: - BUILD_SUBMITTER: forgejo - BUILD_SUBMITTER_URL: https://example.forgejo.org/ - GIT_REF: refs/heads/main -image: alpine/edge -tasks: - - say-hello: | - echo hello - - say-world: echo world -`, string(manifest)) - }) - - t.Run("with other sources", func(t *testing.T) { - repo := &api.Repository{ - CloneURL: "http://localhost:3000/testdata/repo.git", - } - - manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge -sources: -- http://other.example.conm/repo.git -tasks: - - hello: echo world`), ".build.yml") - - require.NoError(t, err) - assert.Equal(t, `sources: - - http://other.example.conm/repo.git - - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 -environment: - BUILD_SUBMITTER: forgejo - BUILD_SUBMITTER_URL: https://example.forgejo.org/ - GIT_REF: refs/heads/main -image: alpine/edge -tasks: - - hello: echo world -`, string(manifest)) - }) - - t.Run("with same source", func(t *testing.T) { - repo := &api.Repository{ - CloneURL: "http://localhost:3000/testdata/repo.git", - } - - manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge -sources: -- http://localhost:3000/testdata/repo.git -- http://other.example.conm/repo.git -tasks: - - hello: echo world`), ".build.yml") - - require.NoError(t, err) - assert.Equal(t, `sources: - - http://localhost:3000/testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 - - http://other.example.conm/repo.git -environment: - BUILD_SUBMITTER: forgejo - BUILD_SUBMITTER_URL: https://example.forgejo.org/ - GIT_REF: refs/heads/main -image: alpine/edge -tasks: - - hello: echo world -`, string(manifest)) - }) - - t.Run("with ssh source", func(t *testing.T) { - repo := &api.Repository{ - CloneURL: "http://localhost:3000/testdata/repo.git", - SSHURL: "git@localhost:testdata/repo.git", - } - - manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge -sources: -- git@localhost:testdata/repo.git -- http://other.example.conm/repo.git -tasks: - - hello: echo world`), ".build.yml") - - require.NoError(t, err) - assert.Equal(t, `sources: - - git@localhost:testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 - - http://other.example.conm/repo.git -environment: - BUILD_SUBMITTER: forgejo - BUILD_SUBMITTER_URL: https://example.forgejo.org/ - GIT_REF: refs/heads/main -image: alpine/edge -tasks: - - hello: echo world -`, string(manifest)) - }) - - t.Run("private without source", func(t *testing.T) { - repo := &api.Repository{ - CloneURL: "http://localhost:3000/testdata/repo.git", - SSHURL: "git@localhost:testdata/repo.git", - Private: true, - } - - manifest, err := adjustManifest(repo, "58771003157b81abc6bf41df0c5db4147a3e3c83", "refs/heads/main", strings.NewReader(`image: alpine/edge -tasks: - - hello: echo world`), ".build.yml") - - require.NoError(t, err) - assert.Equal(t, `sources: - - git@localhost:testdata/repo.git#58771003157b81abc6bf41df0c5db4147a3e3c83 -environment: - BUILD_SUBMITTER: forgejo - BUILD_SUBMITTER_URL: https://example.forgejo.org/ - GIT_REF: refs/heads/main -image: alpine/edge -tasks: - - hello: echo world -`, string(manifest)) - }) -} diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index d0abd667f4..bacfa64db5 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -11,15 +11,15 @@ import ( "net/url" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/markup" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type telegramHandler struct{} @@ -79,7 +79,7 @@ func (telegramHandler) Metadata(w *webhook_model.Webhook) any { func (t telegramConvertor) Create(p *api.CreatePayload) (TelegramPayload, error) { // created tag/branch refName := git.RefName(p.Ref).ShortName() - title := fmt.Sprintf(`[%s] %s %s created`, p.Repo.FullName, p.RefType, + title := fmt.Sprintf(`[%s] %s %s created`, p.Repo.HTMLURL, p.Repo.FullName, p.RefType, p.Repo.HTMLURL+"/src/"+refName, refName) return createTelegramPayload(title), nil @@ -89,7 +89,7 @@ func (t telegramConvertor) Create(p *api.CreatePayload) (TelegramPayload, error) func (t telegramConvertor) Delete(p *api.DeletePayload) (TelegramPayload, error) { // created tag/branch refName := git.RefName(p.Ref).ShortName() - title := fmt.Sprintf(`[%s] %s %s deleted`, p.Repo.FullName, p.RefType, + title := fmt.Sprintf(`[%s] %s %s deleted`, p.Repo.HTMLURL, p.Repo.FullName, p.RefType, p.Repo.HTMLURL+"/src/"+refName, refName) return createTelegramPayload(title), nil @@ -108,13 +108,19 @@ func (t telegramConvertor) Push(p *api.PushPayload) (TelegramPayload, error) { branchName = git.RefName(p.Ref).ShortName() commitDesc string ) + + var titleLink string if p.TotalCommits == 1 { commitDesc = "1 new commit" + titleLink = p.Commits[0].URL } else { commitDesc = fmt.Sprintf("%d new commits", p.TotalCommits) + titleLink = p.CompareURL } - - title := fmt.Sprintf(`[%s:%s] %s`, p.Repo.FullName, branchName, commitDesc) + if titleLink == "" { + titleLink = p.Repo.HTMLURL + "/src/" + branchName + } + title := fmt.Sprintf(`[%s:%s] %s`, p.Repo.HTMLURL, p.Repo.FullName, titleLink, branchName, commitDesc) var text string // for each commit, generate attachment text diff --git a/services/webhook/telegram_test.go b/services/webhook/telegram_test.go index 5066e55b8c..0e27535a03 100644 --- a/services/webhook/telegram_test.go +++ b/services/webhook/telegram_test.go @@ -4,12 +4,13 @@ package webhook import ( + "context" "testing" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/json" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -32,7 +33,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Create(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test created`, pl.Message) + assert.Equal(t, `[test/repo] branch test created`, pl.Message) }) t.Run("Delete", func(t *testing.T) { @@ -41,7 +42,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Delete(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test deleted`, pl.Message) + assert.Equal(t, `[test/repo] branch test deleted`, pl.Message) }) t.Run("Fork", func(t *testing.T) { @@ -59,7 +60,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Push(p) require.NoError(t, err) - assert.Equal(t, `[test/repo:test] 2 new commits + assert.Equal(t, `[test/repo:test] 2 new commits [2020558] commit message - user1 [2020558] commit message - user1`, pl.Message) }) @@ -71,7 +72,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Issue(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1 + assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1 issue body`, pl.Message) @@ -79,7 +80,7 @@ issue body`, pl.Message) pl, err = tc.Issue(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message) + assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message) }) t.Run("IssueComment", func(t *testing.T) { @@ -88,7 +89,7 @@ issue body`, pl.Message) pl, err := tc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1 + assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1 more info needed`, pl.Message) }) @@ -98,7 +99,7 @@ more info needed`, pl.Message) pl, err := tc.PullRequest(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1 + assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1 fixes bug #2`, pl.Message) }) @@ -108,7 +109,7 @@ fixes bug #2`, pl.Message) pl, err := tc.IssueComment(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1 + assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1 changes requested`, pl.Message) }) @@ -138,7 +139,7 @@ good job`, pl.Message) pl, err := tc.Package(p) require.NoError(t, err) - assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message) + assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message) }) t.Run("Wiki", func(t *testing.T) { @@ -148,19 +149,19 @@ good job`, pl.Message) pl, err := tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message) p.Action = api.HookWikiEdited pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message) p.Action = api.HookWikiDeleted pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message) }) t.Run("Release", func(t *testing.T) { @@ -169,7 +170,7 @@ good job`, pl.Message) pl, err := tc.Release(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message) + assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message) }) } @@ -193,7 +194,7 @@ func TestTelegramJSONPayload(t *testing.T) { PayloadVersion: 2, } - req, reqBody, err := telegramHandler{}.NewRequest(t.Context(), hook, task) + req, reqBody, err := telegramHandler{}.NewRequest(context.Background(), hook, task) require.NotNil(t, req) require.NotNil(t, reqBody) require.NoError(t, err) @@ -205,7 +206,7 @@ func TestTelegramJSONPayload(t *testing.T) { var body TelegramPayload err = json.NewDecoder(req.Body).Decode(&body) require.NoError(t, err) - assert.Equal(t, `[test/repo:test] 2 new commits + assert.Equal(t, `[test/repo:test] 2 new commits [2020558] commit message - user1 [2020558] commit message - user1`, body.Message) } diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index 989b535564..1366ea8e8f 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -11,21 +11,21 @@ import ( "net/http" "strings" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/sourcehut" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/sourcehut" "github.com/gobwas/glob" ) diff --git a/services/webhook/webhook_test.go b/services/webhook/webhook_test.go index c9af09d3e9..816940a2b5 100644 --- a/services/webhook/webhook_test.go +++ b/services/webhook/webhook_test.go @@ -7,15 +7,12 @@ import ( "fmt" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/convert" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + webhook_model "code.gitea.io/gitea/models/webhook" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -101,11 +98,3 @@ func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) { }) } } - -func TestWebhookUserMail(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - setting.Service.NoReplyAddress = "no-reply.com" - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - assert.Equal(t, user.GetPlaceholderEmail(), convert.ToUser(db.DefaultContext, user, nil).Email) - assert.Equal(t, user.Email, convert.ToUser(db.DefaultContext, user, user).Email) -} diff --git a/services/webhook/wechatwork.go b/services/webhook/wechatwork.go index 323d23aba7..87f8bb8b18 100644 --- a/services/webhook/wechatwork.go +++ b/services/webhook/wechatwork.go @@ -10,12 +10,12 @@ import ( "net/http" "strings" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/forms" - "forgejo.org/services/webhook/shared" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/webhook/shared" ) type wechatworkHandler struct{} diff --git a/services/wiki/wiki.go b/services/wiki/wiki.go index cf1477e72c..aba1115aab 100644 --- a/services/wiki/wiki.go +++ b/services/wiki/wiki.go @@ -11,17 +11,17 @@ import ( "os" "strings" - 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/gitrepo" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/sync" - asymkey_service "forgejo.org/services/asymkey" - repo_service "forgejo.org/services/repository" + 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/gitrepo" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/sync" + asymkey_service "code.gitea.io/gitea/services/asymkey" + repo_service "code.gitea.io/gitea/services/repository" ) // TODO: use clustered lock (unique queue? or *abuse* cache) @@ -422,7 +422,7 @@ func SearchWikiContents(ctx context.Context, repo *repo_model.Repository, keywor grepRes, err := git.GrepSearch(ctx, gitRepo, keyword, git.GrepOptions{ ContextLineNumber: 0, - Mode: git.FixedAnyGrepMode, + IsFuzzy: true, RefName: repo.GetWikiBranchName(), MaxResultLimit: 10, MatchesPerFile: 3, diff --git a/services/wiki/wiki_path.go b/services/wiki/wiki_path.go index ca312388af..74c7064043 100644 --- a/services/wiki/wiki_path.go +++ b/services/wiki/wiki_path.go @@ -8,11 +8,11 @@ import ( "path" "strings" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/services/convert" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/convert" ) // To define the wiki related concepts: diff --git a/services/wiki/wiki_test.go b/services/wiki/wiki_test.go index d76104dfc7..efcc13db99 100644 --- a/services/wiki/wiki_test.go +++ b/services/wiki/wiki_test.go @@ -8,13 +8,13 @@ import ( "strings" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" + 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" - _ "forgejo.org/models/actions" + _ "code.gitea.io/gitea/models/actions" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index 1ca5573cae..8a8bd61148 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -326,28 +326,19 @@ - {{range .OAuth2Providers}} - {{if .CustomURLSettings}} - - - - - - - {{end}} - {{if .CanProvideSSHKeys}} - - {{end}} - {{end}} + {{range .OAuth2Providers}}{{if .CustomURLSettings}} + + + + + + + {{end}}{{end}}
      -
      - - -
      @@ -380,6 +371,51 @@
      {{end}} + + {{if .Source.IsSSPI}} + {{$cfg:=.Source.Cfg}} +
      +
      + + +

      {{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"}}

      +
      + {{end}} {{if .Source.IsLDAP}}
      diff --git a/templates/admin/auth/list.tmpl b/templates/admin/auth/list.tmpl index 0c7138bd68..6483ec800c 100644 --- a/templates/admin/auth/list.tmpl +++ b/templates/admin/auth/list.tmpl @@ -26,12 +26,10 @@
      - - + + - {{else}} - {{end}}
      images/icon-install.png Installation
      images/icon-usage.png Usage
      {{.Name}} {{.TypeName}} {{if .IsActive}}{{svg "octicon-check"}}{{else}}{{svg "octicon-x"}}{{end}}{{DateUtils.AbsoluteShort .UpdatedUnix}}{{DateUtils.AbsoluteShort .CreatedUnix}}{{DateTime "short" .UpdatedUnix}}{{DateTime "short" .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 12d3798278..c70bd3ba43 100644 --- a/templates/admin/auth/new.tmpl +++ b/templates/admin/auth/new.tmpl @@ -50,6 +50,9 @@ {{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 7d0a64d269..0560cc8256 100644 --- a/templates/admin/auth/source/oauth.tmpl +++ b/templates/admin/auth/source/oauth.tmpl @@ -63,27 +63,19 @@
      - {{range .OAuth2Providers}} - {{if .CustomURLSettings}} - - - - - - - {{end}} - {{if .CanProvideSSHKeys}} - - {{end}} - {{end}} + {{range .OAuth2Providers}}{{if .CustomURLSettings}} + + + + + + + {{end}}{{end}} +
      -
      - - -
      diff --git a/templates/admin/auth/source/sspi.tmpl b/templates/admin/auth/source/sspi.tmpl new file mode 100644 index 0000000000..6a3f00f9a8 --- /dev/null +++ b/templates/admin/auth/source/sspi.tmpl @@ -0,0 +1,43 @@ +
      +
      +
      + + +

      {{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 ee37f6ca75..3cb641488c 100644 --- a/templates/admin/cron.tmpl +++ b/templates/admin/cron.tmpl @@ -23,8 +23,8 @@ {{ctx.Locale.Tr (printf "admin.dashboard.%s" .Name)}} {{.Spec}} - {{DateUtils.FullTime .Next}} - {{if gt .Prev.Year 1}}{{DateUtils.FullTime .Prev}}{{else}}-{{end}} + {{DateTime "full" .Next}} + {{if gt .Prev.Year 1}}{{DateTime "full" .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 5c30df87af..b07c6fcc01 100644 --- a/templates/admin/emails/list.tmpl +++ b/templates/admin/emails/list.tmpl @@ -66,8 +66,6 @@
      - {{else}} - {{ctx.Locale.Tr "repo.pulls.no_results"}} {{end}} diff --git a/templates/admin/notice.tmpl b/templates/admin/notice.tmpl index 08f0a4f204..33d8a2f963 100644 --- a/templates/admin/notice.tmpl +++ b/templates/admin/notice.tmpl @@ -21,11 +21,9 @@ {{.ID}} {{ctx.Locale.Tr .TrStr}} {{.Description}} - {{DateUtils.AbsoluteShort .CreatedUnix}} + {{DateTime "short" .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 8c9c198897..987ceab1e0 100644 --- a/templates/admin/org/list.tmpl +++ b/templates/admin/org/list.tmpl @@ -63,11 +63,9 @@ {{.NumTeams}} {{.NumMembers}} {{.NumRepos}} - {{DateUtils.AbsoluteShort .CreatedUnix}} + {{DateTime "short" .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 5f9965e34c..4ff49b8c43 100644 --- a/templates/admin/packages/list.tmpl +++ b/templates/admin/packages/list.tmpl @@ -71,11 +71,9 @@ {{end}} {{ctx.Locale.TrSize .CalculateBlobSize}} - {{DateUtils.AbsoluteShort .Version.CreatedUnix}} + {{DateTime "short" .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 7a75ceded7..1ea6183d80 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -82,12 +82,10 @@ {{.NumIssues}} {{ctx.Locale.TrSize .GitSize}} {{ctx.Locale.TrSize .LFSSize}} - {{DateUtils.AbsoluteShort .UpdatedUnix}} - {{DateUtils.AbsoluteShort .CreatedUnix}} + {{DateTime "short" .UpdatedUnix}} + {{DateTime "short" .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 a95f6b5120..a33cb43a2f 100644 --- a/templates/admin/repo/unadopted.tmpl +++ b/templates/admin/repo/unadopted.tmpl @@ -54,7 +54,7 @@ - {{template "base/modal_actions_confirm"}} + {{template "base/modal_actions_confirm" (dict "ModalButtonColors" "primary")}}
diff --git a/templates/admin/stacktrace-row.tmpl b/templates/admin/stacktrace-row.tmpl index 048056cf4e..694bf56d96 100644 --- a/templates/admin/stacktrace-row.tmpl +++ b/templates/admin/stacktrace-row.tmpl @@ -7,15 +7,13 @@ {{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"}}{{DateUtils.TimeSince .Process.Start}}{{end}}
+
{{if ne .Process.Type "none"}}{{TimeSince .Process.Start ctx.Locale}}{{end}}
{{if or (eq .Process.Type "request") (eq .Process.Type "normal")}} diff --git a/templates/admin/stacktrace.tmpl b/templates/admin/stacktrace.tmpl index afe8e6942a..e324570c96 100644 --- a/templates/admin/stacktrace.tmpl +++ b/templates/admin/stacktrace.tmpl @@ -8,12 +8,11 @@ {{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 368e113d24..e5d429952f 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}} - {{DateUtils.AbsoluteShort .CreatedUnix}} + {{DateTime "short" .CreatedUnix}} {{if .LastLoginUnix}} - {{DateUtils.AbsoluteShort .LastLoginUnix}} + {{DateTime "short" .LastLoginUnix}} {{else}} {{ctx.Locale.Tr "admin.users.never_login"}} {{end}} @@ -109,8 +109,6 @@ - {{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 c394b4bd3d..be2f32b5ec 100644 --- a/templates/admin/user/view_details.tmpl +++ b/templates/admin/user/view_details.tmpl @@ -26,14 +26,6 @@ {{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 7e77206f1c..22ce305a88 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 133ebac33a..5db7464480 100644 --- a/templates/base/footer_content.tmpl +++ b/templates/base/footer_content.tmpl @@ -8,7 +8,7 @@ {{if .IsAdmin}} {{AppVer}} {{else}} - {{AppVerNoMetadata}} + {{AppVer}} {{end}} {{end}} {{if and .TemplateLoadTimes ShowFooterTemplateLoadTime}} diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index 7ec2ac87b3..7753f49243 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -20,7 +20,12 @@ {{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 0c13f9e844..ba17222f9b 100644 --- a/templates/base/head_navbar.tmpl +++ b/templates/base/head_navbar.tmpl @@ -194,13 +194,11 @@ {{else}} {{if .ShowRegistrationButton}} - {{svg "octicon-person" 16 "tw-mr-1"}} - {{ctx.Locale.Tr "register"}} + {{svg "octicon-person"}} {{ctx.Locale.Tr "register"}} {{end}} - {{svg "octicon-sign-in" 16 "tw-mr-1"}} - {{ctx.Locale.Tr "sign_in"}} + {{svg "octicon-sign-in"}} {{ctx.Locale.Tr "sign_in"}} {{end}}
diff --git a/templates/base/head_opengraph.tmpl b/templates/base/head_opengraph.tmpl index 7f6eae3f49..292c3bdd92 100644 --- a/templates/base/head_opengraph.tmpl +++ b/templates/base/head_opengraph.tmpl @@ -1,37 +1,53 @@ -{{- /* See https://ogp.me for specification */ -}} -{{if .OpenGraphTitle}} - -{{else if .Title}} - +{{- /* 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}} {{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 d2774010b6..22e08e9c8f 100644 --- a/templates/base/head_script.tmpl +++ b/templates/base/head_script.tmpl @@ -42,7 +42,6 @@ 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 8c4e346088..c44320deff 100644 --- a/templates/base/modal_actions_confirm.tmpl +++ b/templates/base/modal_actions_confirm.tmpl @@ -1,6 +1,7 @@ {{/* Two buttons (negative, positive): * ModalButtonTypes: "yes" (default) or "confirm" +* ModalButtonColors: "primary" (default) / "blue" / "yellow" * ModalButtonCancelText * ModalButtonOkText @@ -22,7 +23,13 @@ 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 253892c009..2ca72f6a34 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 5b94afc4f1..5cd36721a7 100644 --- a/templates/devtest/fomantic-modal.tmpl +++ b/templates/devtest/fomantic-modal.tmpl @@ -54,6 +54,18 @@ {{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
+ + + + {{end}} -
{{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .UpdatedUnix)}}
+
{{ctx.Locale.Tr "org.repo_updated" (TimeSinceUnix .UpdatedUnix ctx.Locale)}}
{{else}} diff --git a/templates/explore/user_list.tmpl b/templates/explore/user_list.tmpl index 4cfb6c9bf5..f2cf939ffb 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" (DateUtils.AbsoluteShort .CreatedUnix)}} + {{svg "octicon-calendar"}}{{ctx.Locale.Tr "user.joined_on" (DateTime "short" .CreatedUnix)}}
diff --git a/templates/home.tmpl b/templates/home.tmpl index 168bfbefa6..a97434457d 100644 --- a/templates/home.tmpl +++ b/templates/home.tmpl @@ -11,6 +11,41 @@ - {{template "home_forgejo" .}} +
+
+

+ {{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"}} +

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

- {{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 7a9b40826f..ae800df130 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 4359b819a1..494dedf67a 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 a4fafc3432..3ae5f01d04 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 .DisableMigrations}} + {{if not .DisableNewPullMirrors}} {{ctx.Locale.Tr "new_migrate.link"}} {{end}}
diff --git a/templates/org/member/members.tmpl b/templates/org/member/members.tmpl index dccf588f6a..4388dc9520 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 bd74114fe2..e1ab81c4cd 100644 --- a/templates/org/projects/view.tmpl +++ b/templates/org/projects/view.tmpl @@ -1,13 +1,9 @@ {{template "base/head" .}} -
- {{if .ContextUser.IsOrganization}} - {{template "org/header" .}} - {{else}} - {{template "shared/user/org_profile_avatar" .}} -
- {{template "user/overview/header" .}} -
- {{end}} +
+ {{template "shared/user/org_profile_avatar" .}} +
+ {{template "user/overview/header" .}} +
{{template "projects/view" .}}
diff --git a/templates/org/settings/blocked_users.tmpl b/templates/org/settings/blocked_users.tmpl index d139276b55..f685a1b998 100644 --- a/templates/org/settings/blocked_users.tmpl +++ b/templates/org/settings/blocked_users.tmpl @@ -1,8 +1,5 @@ {{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 4ae7f56aca..b245768203 100644 --- a/templates/org/settings/navbar.tmpl +++ b/templates/org/settings/navbar.tmpl @@ -38,14 +38,9 @@
{{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 2ef7031aef..62debfc0ae 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -6,18 +6,14 @@
{{.CsrfTokenHtml}} -
- {{$timeStr := DateUtils.TimeSince .PackageDescriptor.Version.CreatedUnix}} + {{$timeStr := TimeSinceUnix .PackageDescriptor.Version.CreatedUnix ctx.Locale}} {{if .HasRepositoryAccess}} {{ctx.Locale.Tr "packages.published_by_in" $timeStr .PackageDescriptor.Creator.HomeLink .PackageDescriptor.Creator.GetDisplayName .PackageDescriptor.Repository.Link .PackageDescriptor.Repository.FullName}} {{else}} @@ -37,7 +37,6 @@ {{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" .}} @@ -49,7 +48,7 @@ {{if .HasRepositoryAccess}}
{{svg "octicon-repo" 16 "tw-mr-2"}} {{.PackageDescriptor.Repository.FullName}}
{{end}} -
{{svg "octicon-calendar" 16 "tw-mr-2"}} {{DateUtils.TimeSince .PackageDescriptor.Version.CreatedUnix}}
+
{{svg "octicon-calendar" 16 "tw-mr-2"}} {{TimeSinceUnix .PackageDescriptor.Version.CreatedUnix ctx.Locale}}
{{svg "octicon-download" 16 "tw-mr-2"}} {{.PackageDescriptor.Version.DownloadCount}}
{{template "package/metadata/alpine" .}} {{template "package/metadata/arch" .}} @@ -69,7 +68,6 @@ {{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" .}} @@ -96,7 +94,7 @@ {{range .LatestVersions}}
{{.Version}} - {{DateUtils.AbsoluteShort .CreatedUnix}} + {{DateTime "short" .CreatedUnix}}
{{end}}
diff --git a/templates/projects/list.tmpl b/templates/projects/list.tmpl index 8c9b7c6e6f..b892cff996 100644 --- a/templates/projects/list.tmpl +++ b/templates/projects/list.tmpl @@ -1,12 +1,12 @@ {{if and $.CanWriteProjects (not $.Repository.IsArchived)}}
-
+ @@ -41,21 +41,19 @@
{{range .Projects}}
  • -
    -

    - {{svg .IconName 16}} - {{.Title}} -

    -
    +

    + {{svg .IconName 16}} + {{.Title}} +

    {{svg "octicon-issue-opened" 14}} - {{ctx.Locale.PrettyNumber (index $.NumOpenIssuesInProject .ID)}} {{ctx.Locale.Tr "repo.issues.open_title"}} + {{ctx.Locale.PrettyNumber (.NumOpenIssues ctx)}} {{ctx.Locale.Tr "repo.issues.open_title"}}
    {{svg "octicon-check" 14}} - {{ctx.Locale.PrettyNumber (index $.NumClosedIssuesInProject .ID)}} {{ctx.Locale.Tr "repo.issues.closed_title"}} + {{ctx.Locale.PrettyNumber (.NumClosedIssues ctx)}} {{ctx.Locale.Tr "repo.issues.closed_title"}}
    {{if and $.CanWriteProjects (not $.Repository.IsArchived)}} diff --git a/templates/projects/view.tmpl b/templates/projects/view.tmpl index 0e2fc87958..08b08b95e5 100644 --- a/templates/projects/view.tmpl +++ b/templates/projects/view.tmpl @@ -70,7 +70,7 @@
    - {{len (index $.IssuesMap .ID)}} + {{.NumIssues ctx}}
    {{.Title}}
    diff --git a/templates/repo/actions/dispatch.tmpl b/templates/repo/actions/dispatch.tmpl index 8157e11a44..48c2aa5a26 100644 --- a/templates/repo/actions/dispatch.tmpl +++ b/templates/repo/actions/dispatch.tmpl @@ -33,7 +33,7 @@ {{if eq $val.Type "boolean"}}
    - {{/* These two inputs need to stay in exactly this order (checkbox first, hidden second) or boolean fields won't work correctly! */}} + {{/* These two inputs need to stay in exactly this order (checkbox first, hidden second) or boolean fields wont work correctly! */}}
    diff --git a/templates/repo/actions/no_workflows.tmpl b/templates/repo/actions/no_workflows.tmpl index fb3a77fb9a..88d6e513ef 100644 --- a/templates/repo/actions/no_workflows.tmpl +++ b/templates/repo/actions/no_workflows.tmpl @@ -2,8 +2,7 @@ {{svg "octicon-no-entry" 48}}

    {{ctx.Locale.Tr "actions.runs.no_workflows"}}

    {{if and .CanWriteCode .CanWriteActions}} -

    {{ctx.Locale.Tr "actions.runs.no_workflows.help_write_access" "https://forgejo.org/docs/latest/user/actions/#quick-start" "https://forgejo.org/docs/latest/admin/runner-installation/"}}

    - {{else}} -

    {{ctx.Locale.Tr "actions.runs.no_workflows.help_no_write_access" "https://forgejo.org/docs/latest/user/actions/"}}

    +

    {{ctx.Locale.Tr "actions.runs.no_workflows.quick_start" "https://forgejo.org/docs/latest/admin/actions/"}}

    {{end}} +

    {{ctx.Locale.Tr "actions.runs.no_workflows.documentation" "https://forgejo.org/docs/latest/admin/actions/"}}

    diff --git a/templates/repo/actions/runs_list.tmpl b/templates/repo/actions/runs_list.tmpl index 060fc1b66a..7bab492d7b 100644 --- a/templates/repo/actions/runs_list.tmpl +++ b/templates/repo/actions/runs_list.tmpl @@ -27,13 +27,13 @@
  • - {{if .IsRefDeleted}} - {{.PrettyRef}} + {{if .RefLink}} + {{.PrettyRef}} {{else}} - {{.PrettyRef}} + {{.PrettyRef}} {{end}}
    -
    {{svg "octicon-calendar" 16}}{{DateUtils.TimeSince .Updated}}
    +
    {{svg "octicon-calendar" 16}}{{TimeSinceUnix .Updated ctx.Locale}}
    {{svg "octicon-stopwatch" 16}}{{.Duration}}
    diff --git a/templates/repo/actions/status.tmpl b/templates/repo/actions/status.tmpl index 99fa74ac17..a0e02cf8d7 100644 --- a/templates/repo/actions/status.tmpl +++ b/templates/repo/actions/status.tmpl @@ -17,15 +17,13 @@ {{svg "octicon-check-circle-fill" $size (printf "text green %s" $className)}} {{else if eq .status "skipped"}} {{svg "octicon-skip" $size (printf "text grey %s" $className)}} -{{else if eq .status "cancelled"}} - {{svg "octicon-stop" $size (printf "text grey %s" $className)}} {{else if eq .status "waiting"}} {{svg "octicon-clock" $size (printf "text yellow %s" $className)}} {{else if eq .status "blocked"}} {{svg "octicon-blocked" $size (printf "text yellow %s" $className)}} {{else if eq .status "running"}} {{svg "octicon-meter" $size (printf "text yellow job-status-rotate %s" $className)}} -{{else}}{{/*failure, unknown*/}} +{{else if or (eq .status "failure") or (eq .status "cancelled") or (eq .status "unknown")}} {{svg "octicon-x-circle-fill" $size (printf "text red %s" $className)}} {{end}} diff --git a/templates/repo/branch/list.tmpl b/templates/repo/branch/list.tmpl index fe945324ea..f5bffb097e 100644 --- a/templates/repo/branch/list.tmpl +++ b/templates/repo/branch/list.tmpl @@ -27,10 +27,10 @@ {{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DefaultBranchBranch.DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DefaultBranchBranch.DBBranch.CommitID)}}
    -

    {{svg "octicon-git-commit" 16 "tw-mr-1"}}{{ShortSha .DefaultBranchBranch.DBBranch.CommitID}} · {{RenderCommitMessage $.Context .DefaultBranchBranch.DBBranch.CommitMessage (.Repository.ComposeMetas ctx)}} · {{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .DefaultBranchBranch.DBBranch.CommitTime)}}{{if .DefaultBranchBranch.DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DefaultBranchBranch.DBBranch.Pusher}}{{template "shared/user/namelink" .DefaultBranchBranch.DBBranch.Pusher}}{{end}}

    +

    {{svg "octicon-git-commit" 16 "tw-mr-1"}}{{ShortSha .DefaultBranchBranch.DBBranch.CommitID}} · {{RenderCommitMessage $.Context .DefaultBranchBranch.DBBranch.CommitMessage (.Repository.ComposeMetas ctx)}} · {{ctx.Locale.Tr "org.repo_updated" (TimeSince .DefaultBranchBranch.DBBranch.CommitTime.AsTime ctx.Locale)}} {{if .DefaultBranchBranch.DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DefaultBranchBranch.DBBranch.Pusher}}{{template "shared/user/namelink" .DefaultBranchBranch.DBBranch.Pusher}}{{end}}

    - {{if and $.IsWriter (not $.Repository.IsArchived) (not $.Repository.IsMirror) (not .IsDeleted)}} + {{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}
    -

    {{ctx.Locale.Tr "repo.branch.deleted_by" .DBBranch.DeletedBy.Name}} {{DateUtils.TimeSince .DBBranch.DeletedUnix}}

    +

    {{ctx.Locale.Tr "repo.branch.deleted_by" .DBBranch.DeletedBy.Name}} {{TimeSinceUnix .DBBranch.DeletedUnix ctx.Locale}}

    {{else}}
    {{.DBBranch.Name}} @@ -102,7 +102,7 @@ {{template "repo/commit_statuses" dict "Status" (index $.CommitStatus .DBBranch.CommitID) "Statuses" (index $.CommitStatuses .DBBranch.CommitID)}}
    -

    {{svg "octicon-git-commit" 16 "tw-mr-1"}}{{ShortSha .DBBranch.CommitID}} · {{RenderCommitMessage $.Context .DBBranch.CommitMessage ($.Repository.ComposeMetas ctx)}} · {{ctx.Locale.Tr "org.repo_updated" (DateUtils.TimeSince .DBBranch.CommitTime)}}{{if .DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DBBranch.Pusher}}  {{template "shared/user/namelink" .DBBranch.Pusher}}{{end}}

    +

    {{svg "octicon-git-commit" 16 "tw-mr-1"}}{{ShortSha .DBBranch.CommitID}} · {{RenderCommitMessage $.Context .DBBranch.CommitMessage ($.Repository.ComposeMetas ctx)}} · {{ctx.Locale.Tr "org.repo_updated" (TimeSince .DBBranch.CommitTime.AsTime ctx.Locale)}} {{if .DBBranch.Pusher}}  {{template "shared/user/avatarlink" dict "user" .DBBranch.Pusher}}  {{template "shared/user/namelink" .DBBranch.Pusher}}{{end}}

    {{end}} @@ -151,7 +151,7 @@ {{end}} - {{if and $.IsWriter (not $.Repository.IsArchived) (not $.Repository.IsMirror) (not .DBBranch.IsDeleted)}} + {{if and $.IsWriter (not $.Repository.IsArchived) (not .DBBranch.IsDeleted)}}
    - - - - {{end}} + {{TimeSince .NoteCommit.Author.When ctx.Locale}} -
    +
    {{.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 a9015e6089..c8c695e332 100644 --- a/templates/repo/commits_list.tmpl +++ b/templates/repo/commits_list.tmpl @@ -74,21 +74,13 @@ {{end}} {{if .Committer}} - {{DateUtils.TimeSince .Committer.When}} + {{TimeSince .Committer.When ctx.Locale}} {{else}} - {{DateUtils.TimeSince .Author.When}} + {{TimeSince .Author.When ctx.Locale}} {{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}} -
    - {{template "repo/create_basic" .}} -
    +
    + + + {{ctx.Locale.Tr "repo.owner_helper"}} +
    -
    - - {{ctx.Locale.Tr "repo.new_from_template"}} - {{ctx.Locale.Tr "repo.new_from_template_description"}} - - {{template "repo/create_from_template" .}} -
    +
    + + + {{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.auto_init"}} - {{template "repo/create_init" .}} -
    +
    + + +
    -
    - {{ctx.Locale.Tr "repo.new_advanced"}} -
    {{ctx.Locale.Tr "repo.new_advanced_expand"}} - {{template "repo/create_advanced" .}} -
    -
    +
    + +
    + + + {{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"}} +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    - diff --git a/templates/repo/create_advanced.tmpl b/templates/repo/create_advanced.tmpl deleted file mode 100644 index c0274701f8..0000000000 --- a/templates/repo/create_advanced.tmpl +++ /dev/null @@ -1,45 +0,0 @@ - - -{{$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 deleted file mode 100644 index 0396629fef..0000000000 --- a/templates/repo/create_basic.tmpl +++ /dev/null @@ -1,47 +0,0 @@ - - - - diff --git a/templates/repo/create_from_template.tmpl b/templates/repo/create_from_template.tmpl deleted file mode 100644 index 47cda3df02..0000000000 --- a/templates/repo/create_from_template.tmpl +++ /dev/null @@ -1,49 +0,0 @@ - -{{/* 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 deleted file mode 100644 index 729b44c8e6..0000000000 --- a/templates/repo/create_init.tmpl +++ /dev/null @@ -1,56 +0,0 @@ - - -
    - - - - - {{$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 e24c880746..230e49752f 100644 --- a/templates/repo/diff/box.tmpl +++ b/templates/repo/diff/box.tmpl @@ -85,6 +85,7 @@ diffFileInfo.files.push(...diffDataFiles); window.config.pageData.diffFileInfo = diffFileInfo; +
    {{end}}
    {{if $showFileTree}} @@ -129,7 +130,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}} @@ -247,8 +248,8 @@ {{end}}
    - - + +
    diff --git a/templates/repo/diff/comment_form.tmpl b/templates/repo/diff/comment_form.tmpl index bb29583059..856b3da01a 100644 --- a/templates/repo/diff/comment_form.tmpl +++ b/templates/repo/diff/comment_form.tmpl @@ -31,6 +31,7 @@ {{if $.reply}} + {{else}} {{if $.root.CurrentReview}} diff --git a/templates/repo/diff/comments.tmpl b/templates/repo/diff/comments.tmpl index 3128149c75..2e0c85d0a1 100644 --- a/templates/repo/diff/comments.tmpl +++ b/templates/repo/diff/comments.tmpl @@ -1,6 +1,6 @@ {{range .comments}} -{{$createdStr:= DateUtils.TimeSince .CreatedUnix}} +{{$createdStr:= TimeSinceUnix .CreatedUnix ctx.Locale}}
    {{if .OriginalAuthor}} {{ctx.AvatarUtils.Avatar nil}} @@ -33,15 +33,19 @@
    {{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)}} @@ -49,7 +53,7 @@
    -
    +
    {{if .RenderedContent}} {{.RenderedContent}} {{else}} diff --git a/templates/repo/diff/compare.tmpl b/templates/repo/diff/compare.tmpl index c1b00c5f9e..110f8ac60b 100644 --- a/templates/repo/diff/compare.tmpl +++ b/templates/repo/diff/compare.tmpl @@ -39,13 +39,21 @@ {{svg "octicon-filter" 16}}
    -
    - - {{svg "octicon-git-branch"}}{{ctx.Locale.Tr "repo.branches"}} - - - {{svg "octicon-tag"}}{{ctx.Locale.Tr "repo.tags"}} - + -
    - - {{svg "octicon-git-branch"}}{{ctx.Locale.Tr "repo.branches"}} - - - {{svg "octicon-tag"}}{{ctx.Locale.Tr "repo.tags"}} - + - {{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 9753bd80e1..c80d999f47 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 a793f54da1..0612854609 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 13d09babe1..a2eae007a5 100644 --- a/templates/repo/diff/new_review.tmpl +++ b/templates/repo/diff/new_review.tmpl @@ -1,16 +1,9 @@
    -
    - -
    + {{if $.IsShowingAllCommits}}
    diff --git a/templates/repo/diff/options_dropdown.tmpl b/templates/repo/diff/options_dropdown.tmpl index 44b0743e09..09b7b80e41 100644 --- a/templates/repo/diff/options_dropdown.tmpl +++ b/templates/repo/diff/options_dropdown.tmpl @@ -1,6 +1,7 @@ @@ -163,22 +157,6 @@ {{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 c29c14a54b..0b255d6705 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 := DateUtils.TimeSince .GetLastEventTimestamp}} + {{$timeStr := TimeSinceUnix .GetLastEventTimestamp ctx.Locale}} {{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 60237f225d..58b1ef8ecd 100644 --- a/templates/repo/issue/filter_actions.tmpl +++ b/templates/repo/issue/filter_actions.tmpl @@ -85,7 +85,7 @@
    {{range .OpenProjects}}
    - {{svg .IconName 16 "tw-mr-2"}}{{.Title}} + {{svg .IconName 18 "tw-mr-2"}}{{.Title}}
    {{end}} {{end}} @@ -96,7 +96,7 @@
    {{range .ClosedProjects}}
    - {{svg .IconName 16 "tw-mr-2"}}{{.Title}} + {{svg .IconName 18 "tw-mr-2"}}{{.Title}}
    {{end}} {{end}} diff --git a/templates/repo/issue/filter_list.tmpl b/templates/repo/issue/filter_list.tmpl index ae50ac4c46..09f87b582f 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 16 "tw-mr-2 tw-shrink-0"}}{{.Title}} + + {{svg .IconName 18 "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 16 "tw-mr-2"}}{{.Title}} + + {{svg .IconName 18 "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,11 +146,13 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
    diff --git a/templates/repo/issue/milestone_issues.tmpl b/templates/repo/issue/milestone_issues.tmpl index 8b8b194f46..e5dc8cb605 100644 --- a/templates/repo/issue/milestone_issues.tmpl +++ b/templates/repo/issue/milestone_issues.tmpl @@ -30,7 +30,7 @@
    - {{$closedDate:= DateUtils.TimeSince .Milestone.ClosedDateUnix}} + {{$closedDate:= TimeSinceUnix .Milestone.ClosedDateUnix ctx.Locale}} {{if .IsClosed}} {{svg "octicon-clock"}} {{ctx.Locale.Tr "repo.milestones.closed" $closedDate}} {{else}} @@ -38,7 +38,7 @@ {{if .Milestone.DeadlineString}} {{svg "octicon-calendar"}} - {{DateUtils.AbsoluteShort (.Milestone.DeadlineString|DateUtils.ParseLegacy)}} + {{DateTime "short" .Milestone.DeadlineString}} {{else}} {{svg "octicon-calendar"}} diff --git a/templates/repo/issue/milestone_new.tmpl b/templates/repo/issue/milestone_new.tmpl index 4a5f0a15ba..9f32df00e3 100644 --- a/templates/repo/issue/milestone_new.tmpl +++ b/templates/repo/issue/milestone_new.tmpl @@ -35,15 +35,8 @@
    - {{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 a070a02f72..63a6f6b26a 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" (DateUtils.TimeSince .UpdatedUnix)}} + {{ctx.Locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix ctx.Locale)}}
    {{end}}
    {{if .IsClosed}} - {{$closedDate:= DateUtils.TimeSince .ClosedDateUnix}} + {{$closedDate:= TimeSinceUnix .ClosedDateUnix ctx.Locale}} {{svg "octicon-clock" 14}} {{ctx.Locale.Tr "repo.milestones.closed" $closedDate}} {{else}} {{if .DeadlineString}} {{svg "octicon-calendar" 14}} - {{DateUtils.AbsoluteShort (.DeadlineString|DateUtils.ParseLegacy)}} + {{DateTime "short" .DeadlineString}} {{else}} {{svg "octicon-calendar" 14}} diff --git a/templates/repo/issue/navbar.tmpl b/templates/repo/issue/navbar.tmpl index 4d90ca3c0e..30e42c77cc 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 2c7807206e..c2cf4ee7a7 100644 --- a/templates/repo/issue/new_form.tmpl +++ b/templates/repo/issue/new_form.tmpl @@ -110,7 +110,7 @@
    {{range .OpenProjects}} - {{svg .IconName 16 "tw-mr-2"}}{{.Title}} + {{svg .IconName 18 "tw-mr-2"}}{{.Title}} {{end}} {{end}} @@ -121,7 +121,7 @@
    {{range .ClosedProjects}} - {{svg .IconName 16 "tw-mr-2"}}{{.Title}} + {{svg .IconName 18 "tw-mr-2"}}{{.Title}} {{end}} {{end}} @@ -133,7 +133,7 @@ diff --git a/templates/repo/issue/openclose.tmpl b/templates/repo/issue/openclose.tmpl index 5d5cf4140e..eb2d6e09ee 100644 --- a/templates/repo/issue/openclose.tmpl +++ b/templates/repo/issue/openclose.tmpl @@ -1,22 +1,16 @@ -
    - + diff --git a/templates/repo/issue/search.tmpl b/templates/repo/issue/search.tmpl index 17abe263e7..f1c0ea3290 100644 --- a/templates/repo/issue/search.tmpl +++ b/templates/repo/issue/search.tmpl @@ -10,11 +10,11 @@ {{end}} {{if .PageIsPullList}} - {{template "shared/search/combo" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.pull_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} + {{template "shared/search/combo_fuzzy" dict "Value" .Keyword "IsFuzzy" .IsFuzzy "Placeholder" (ctx.Locale.Tr "search.pull_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} {{else if .PageIsMilestones}} - {{template "shared/search/combo" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.milestone_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} + {{template "shared/search/combo_fuzzy" dict "Value" .Keyword "IsFuzzy" .IsFuzzy "Placeholder" (ctx.Locale.Tr "search.milestone_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} {{else}} - {{template "shared/search/combo" dict "Value" .Keyword "Placeholder" (ctx.Locale.Tr "search.issue_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} + {{template "shared/search/combo_fuzzy" dict "Value" .Keyword "IsFuzzy" .IsFuzzy "Placeholder" (ctx.Locale.Tr "search.issue_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} {{end}}
    diff --git a/templates/repo/issue/view_content.tmpl b/templates/repo/issue/view_content.tmpl index 8ede0f36e5..683dea8425 100644 --- a/templates/repo/issue/view_content.tmpl +++ b/templates/repo/issue/view_content.tmpl @@ -6,7 +6,7 @@ - {{$createdStr:= DateUtils.TimeSince .Issue.CreatedUnix}} + {{$createdStr:= TimeSinceUnix .Issue.CreatedUnix ctx.Locale}}
    @@ -52,7 +52,7 @@
    -
    +
    {{if .Issue.RenderedContent}} {{.Issue.RenderedContent}} {{else}} @@ -79,7 +79,7 @@ {{template "repo/issue/view_content/pull".}} {{end}} - {{if and .IsSigned (not .IsBlocked)}} + {{if .IsSigned}} {{if and (or .IsRepoAdmin .HasIssuesOrPullsWritePermission (not .Issue.IsLocked)) (not .Repository.IsArchived)}}
    @@ -90,7 +90,7 @@ {{template "repo/issue/comment_tab" .}} {{.CsrfTokenHtml}}
  • {{end}} {{end}} -
  • {{svg "octicon-calendar"}} {{ctx.Locale.Tr "user.joined_on" (DateUtils.AbsoluteShort .ContextUser.CreatedUnix)}}
  • +
  • {{svg "octicon-calendar"}} {{ctx.Locale.Tr "user.joined_on" (DateTime "short" .ContextUser.CreatedUnix)}}
  • {{if and .Orgs .HasOrgsVisible}}
    • diff --git a/templates/shared/variables/variable_list.tmpl b/templates/shared/variables/variable_list.tmpl index 7a0ab48cef..06c71c0610 100644 --- a/templates/shared/variables/variable_list.tmpl +++ b/templates/shared/variables/variable_list.tmpl @@ -30,7 +30,7 @@
  • - {{ctx.Locale.Tr "settings.added_on" (DateUtils.AbsoluteShort .CreatedUnix)}} + {{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix)}}
    {{template "base/footer" .}} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 9aa2195a0c..c7c444107f 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -992,34 +992,6 @@ } } }, - "/admin/runners/jobs": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "admin" - ], - "summary": "Search action jobs according filter conditions", - "operationId": "adminSearchRunJobs", - "parameters": [ - { - "type": "string", - "description": "a comma separated list of run job labels to search for", - "name": "labels", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/RunJobList" - }, - "403": { - "$ref": "#/responses/forbidden" - } - } - } - }, "/admin/runners/registration-token": { "get": { "produces": [ @@ -1174,20 +1146,6 @@ "name": "login_name", "in": "query" }, - { - "enum": [ - "oldest", - "newest", - "alphabetically", - "reversealphabetically", - "recentupdate", - "leastupdate" - ], - "type": "string", - "description": "sort order of results", - "name": "sort", - "in": "query" - }, { "type": "integer", "description": "page number of results to return (1-based)", @@ -1877,7 +1835,7 @@ "tags": [ "miscellaneous" ], - "summary": "Returns the nodeinfo of the Forgejo application", + "summary": "Returns the nodeinfo of the Gitea application", "operationId": "getNodeInfo", "responses": { "200": { @@ -2305,44 +2263,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/error" - } - } - } - }, - "/orgs/{org}/actions/runners/jobs": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "organization" - ], - "summary": "Search for organization's action jobs according filter conditions", - "operationId": "orgSearchRunJobs", - "parameters": [ - { - "type": "string", - "description": "name of the organization", - "name": "org", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "a comma separated list of run job labels to search for", - "name": "labels", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/RunJobList" - }, - "403": { - "$ref": "#/responses/forbidden" } } } @@ -3772,46 +3692,6 @@ } } }, - "/orgs/{org}/rename": { - "post": { - "produces": [ - "application/json" - ], - "tags": [ - "organization" - ], - "summary": "Rename an organization", - "operationId": "renameOrg", - "parameters": [ - { - "type": "string", - "description": "existing org name", - "name": "org", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/RenameOrgOption" - } - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "403": { - "$ref": "#/responses/forbidden" - }, - "422": { - "$ref": "#/responses/validationError" - } - } - } - }, "/orgs/{org}/repos": { "get": { "produces": [ @@ -4159,93 +4039,6 @@ } } }, - "/packages/{owner}/{type}/{name}/-/link/{repo_name}": { - "post": { - "tags": [ - "package" - ], - "summary": "Link a package to a repository", - "operationId": "linkPackage", - "parameters": [ - { - "type": "string", - "description": "owner of the package", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "type of the package", - "name": "type", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the package", - "name": "name", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repository to link.", - "name": "repo_name", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - } - } - } - }, - "/packages/{owner}/{type}/{name}/-/unlink": { - "post": { - "tags": [ - "package" - ], - "summary": "Unlink a package from a repository", - "operationId": "unlinkPackage", - "parameters": [ - { - "type": "string", - "description": "owner of the package", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "type of the package", - "name": "type", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the package", - "name": "name", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - } - } - } - }, "/packages/{owner}/{type}/{name}/{version}": { "get": { "produces": [ @@ -4403,125 +4196,107 @@ "operationId": "issueSearchIssues", "parameters": [ { - "enum": [ - "open", - "closed", - "all" - ], "type": "string", - "default": "open", - "description": "State of the issue", + "description": "whether issue is open or closed", "name": "state", "in": "query" }, { "type": "string", - "description": "Comma-separated list of label names. Fetch only issues that have any of these labels. Non existent labels are discarded.", + "description": "comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded", "name": "labels", "in": "query" }, { "type": "string", - "description": "Comma-separated list of milestone names. Fetch only issues that have any of these milestones. Non existent milestones are discarded.", + "description": "comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded", "name": "milestones", "in": "query" }, { "type": "string", - "description": "Search string", + "description": "search string", "name": "q", "in": "query" }, { "type": "integer", "format": "int64", - "description": "Repository ID to prioritize in the results", + "description": "repository to prioritize in the results", "name": "priority_repo_id", "in": "query" }, { - "enum": [ - "issues", - "pulls" - ], "type": "string", - "description": "Filter by issue type", + "description": "filter by type (issues / pulls) if set", "name": "type", "in": "query" }, { "type": "string", "format": "date-time", - "description": "Only show issues updated after the given time (RFC 3339 format)", + "description": "Only show notifications updated after the given time. This is a timestamp in RFC 3339 format", "name": "since", "in": "query" }, { "type": "string", "format": "date-time", - "description": "Only show issues updated before the given time (RFC 3339 format)", + "description": "Only show notifications updated before the given time. This is a timestamp in RFC 3339 format", "name": "before", "in": "query" }, { "type": "boolean", - "default": false, - "description": "Filter issues or pulls assigned to the authenticated user", + "description": "filter (issues / pulls) assigned to you, default is false", "name": "assigned", "in": "query" }, { "type": "boolean", - "default": false, - "description": "Filter issues or pulls created by the authenticated user", + "description": "filter (issues / pulls) created by you, default is false", "name": "created", "in": "query" }, { "type": "boolean", - "default": false, - "description": "Filter issues or pulls mentioning the authenticated user", + "description": "filter (issues / pulls) mentioning you, default is false", "name": "mentioned", "in": "query" }, { "type": "boolean", - "default": false, - "description": "Filter pull requests where the authenticated user's review was requested", + "description": "filter pulls requesting your review, default is false", "name": "review_requested", "in": "query" }, { "type": "boolean", - "default": false, - "description": "Filter pull requests reviewed by the authenticated user", + "description": "filter pulls reviewed by you, default is false", "name": "reviewed", "in": "query" }, { "type": "string", - "description": "Filter by repository owner", + "description": "filter by owner", "name": "owner", "in": "query" }, { "type": "string", - "description": "Filter by team (requires organization owner parameter)", + "description": "filter by team (requires organization owner parameter to be provided)", "name": "team", "in": "query" }, { - "minimum": 1, "type": "integer", - "default": 1, - "description": "Page number of results to return (1-based)", + "description": "page number of results to return (1-based)", "name": "page", "in": "query" }, { - "minimum": 0, "type": "integer", - "description": "Number of items per page", + "description": "page size of results", "name": "limit", "in": "query" } @@ -4529,12 +4304,6 @@ "responses": { "200": { "$ref": "#/responses/IssueList" - }, - "400": { - "$ref": "#/responses/error" - }, - "422": { - "$ref": "#/responses/validationError" } } } @@ -4645,7 +4414,7 @@ }, { "type": "boolean", - "description": "show only public, private or all repositories (defaults to all)", + "description": "show only pubic, private or all repositories (defaults to all)", "name": "is_private", "in": "query" }, @@ -4829,48 +4598,6 @@ } } }, - "/repos/{owner}/{repo}/actions/runners/jobs": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Search for repository's action jobs according filter conditions", - "operationId": "repoSearchRunJobs", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "a comma separated list of run job labels to search for", - "name": "labels", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/RunJobList" - }, - "403": { - "$ref": "#/responses/forbidden" - } - } - } - }, "/repos/{owner}/{repo}/actions/runners/registration-token": { "get": { "produces": [ @@ -5414,9 +5141,6 @@ } ], "responses": { - "201": { - "$ref": "#/responses/DispatchWorkflowRun" - }, "204": { "$ref": "#/responses/empty" }, @@ -6055,63 +5779,6 @@ "$ref": "#/responses/repoArchivedError" } } - }, - "patch": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Update a branch", - "operationId": "repoUpdateBranch", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the branch", - "name": "branch", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/UpdateBranchRepoOption" - } - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "403": { - "$ref": "#/responses/forbidden" - }, - "404": { - "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - } - } } }, "/repos/{owner}/{repo}/collaborators": { @@ -6164,7 +5831,6 @@ }, "/repos/{owner}/{repo}/collaborators/{collaborator}": { "get": { - "description": "If the user is a collaborator, return 204. If the user is not a collaborator, return 404.", "produces": [ "application/json" ], @@ -7685,101 +7351,6 @@ "$ref": "#/responses/validationError" } } - }, - "post": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Set a note corresponding to a single commit from a repository", - "operationId": "repoSetNote", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "a git ref or commit sha", - "name": "sha", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/NoteOptions" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/Note" - }, - "404": { - "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - } - } - }, - "delete": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Removes a note corresponding to a single commit from a repository", - "operationId": "repoRemoveNote", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "a git ref or commit sha", - "name": "sha", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - } - } } }, "/repos/{owner}/{repo}/git/refs": { @@ -8631,24 +8202,6 @@ "description": "page size of results", "name": "limit", "in": "query" - }, - { - "enum": [ - "relevance", - "latest", - "oldest", - "recentupdate", - "leastupdate", - "mostcomment", - "leastcomment", - "nearduedate", - "farduedate" - ], - "type": "string", - "default": "latest", - "description": "Type of sort", - "name": "sort", - "in": "query" } ], "responses": { @@ -8775,12 +8328,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - }, - "500": { - "$ref": "#/responses/internalServerError" } } } @@ -8834,9 +8381,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "500": { - "$ref": "#/responses/internalServerError" } } }, @@ -8877,8 +8421,8 @@ "403": { "$ref": "#/responses/forbidden" }, - "500": { - "$ref": "#/responses/internalServerError" + "404": { + "$ref": "#/responses/notFound" } } }, @@ -8940,9 +8484,6 @@ }, "423": { "$ref": "#/responses/repoArchivedError" - }, - "500": { - "$ref": "#/responses/internalServerError" } } } @@ -10079,12 +9620,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - }, - "500": { - "$ref": "#/responses/internalServerError" } } }, @@ -10143,9 +9678,6 @@ }, "423": { "$ref": "#/responses/repoArchivedError" - }, - "500": { - "$ref": "#/responses/internalServerError" } } } @@ -10196,8 +9728,8 @@ "403": { "$ref": "#/responses/forbidden" }, - "500": { - "$ref": "#/responses/internalServerError" + "404": { + "$ref": "#/responses/notFound" } } }, @@ -10264,9 +9796,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "500": { - "$ref": "#/responses/internalServerError" } } } @@ -11518,12 +11047,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "422": { - "$ref": "#/responses/validationError" - }, - "500": { - "$ref": "#/responses/internalServerError" } } } @@ -12772,27 +12295,26 @@ "parameters": [ { "type": "string", - "description": "Owner of the repo", + "description": "owner of the repo", "name": "owner", "in": "path", "required": true }, { "type": "string", - "description": "Name of the repo", + "description": "name of the repo", "name": "repo", "in": "path", "required": true }, { "enum": [ - "open", "closed", + "open", "all" ], "type": "string", - "default": "open", - "description": "State of pull request", + "description": "State of pull request: open or closed (optional)", "name": "state", "in": "query" }, @@ -12829,23 +12351,14 @@ "in": "query" }, { - "type": "string", - "description": "Filter by pull request author", - "name": "poster", - "in": "query" - }, - { - "minimum": 1, "type": "integer", - "default": 1, - "description": "Page number of results to return (1-based)", + "description": "page number of results to return (1-based)", "name": "page", "in": "query" }, { - "minimum": 0, "type": "integer", - "description": "Page size of results", + "description": "page size of results", "name": "limit", "in": "query" } @@ -12856,9 +12369,6 @@ }, "404": { "$ref": "#/responses/notFound" - }, - "500": { - "$ref": "#/responses/error" } } }, @@ -14616,12 +14126,6 @@ "name": "pre-release", "in": "query" }, - { - "type": "string", - "description": "Search string", - "name": "q", - "in": "query" - }, { "type": "integer", "description": "page number of results to return (1-based)", @@ -17683,37 +17187,6 @@ } } }, - "/user/actions/runners/jobs": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Search for user's action jobs according filter conditions", - "operationId": "userSearchRunJobs", - "parameters": [ - { - "type": "string", - "description": "a comma separated list of run job labels to search for", - "name": "labels", - "in": "query" - } - ], - "responses": { - "200": { - "$ref": "#/responses/RunJobList" - }, - "401": { - "$ref": "#/responses/unauthorized" - }, - "403": { - "$ref": "#/responses/forbidden" - } - } - } - }, "/user/actions/runners/registration-token": { "get": { "produces": [ @@ -19364,28 +18837,8 @@ "in": "query" }, { - "enum": [ - "name", - "id", - "newest", - "oldest", - "recentupdate", - "leastupdate", - "reversealphabetically", - "alphabetically", - "reversesize", - "size", - "reversegitsize", - "gitsize", - "reverselfssize", - "lfssize", - "moststars", - "feweststars", - "mostforks", - "fewestforks" - ], "type": "string", - "description": "order the repositories", + "description": "order the repositories by name (default), id, or size", "name": "order_by", "in": "query" } @@ -20571,7 +20024,7 @@ "tags": [ "miscellaneous" ], - "summary": "Returns the version of the running application", + "summary": "Returns the version of the Gitea application", "operationId": "getVersion", "responses": { "200": { @@ -20595,7 +20048,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "APIForbiddenError": { "type": "object", @@ -20609,21 +20062,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/services/context" - }, - "APIInternalServerError": { - "type": "object", - "properties": { - "message": { - "type": "string", - "x-go-name": "Message" - }, - "url": { - "type": "string", - "x-go-name": "URL" - } - }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "APIInvalidTopicsError": { "type": "object", @@ -20640,7 +20079,7 @@ "x-go-name": "Message" } }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "APINotFound": { "type": "object", @@ -20661,7 +20100,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "APIRepoArchivedError": { "type": "object", @@ -20675,7 +20114,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "APIUnauthorizedError": { "type": "object", @@ -20689,7 +20128,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "APIValidationError": { "type": "object", @@ -20703,7 +20142,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/services/context" + "x-go-package": "code.gitea.io/gitea/services/context" }, "AccessToken": { "type": "object", @@ -20734,64 +20173,7 @@ "x-go-name": "TokenLastEight" } }, - "x-go-package": "forgejo.org/modules/structs" - }, - "ActionRunJob": { - "description": "ActionRunJob represents a job of a run", - "type": "object", - "properties": { - "id": { - "description": "the action run job id", - "type": "integer", - "format": "int64", - "x-go-name": "ID" - }, - "name": { - "description": "the action run job name", - "type": "string", - "x-go-name": "Name" - }, - "needs": { - "description": "the action run job needed ids", - "type": "array", - "items": { - "type": "string" - }, - "x-go-name": "Needs" - }, - "owner_id": { - "description": "the owner id", - "type": "integer", - "format": "int64", - "x-go-name": "OwnerID" - }, - "repo_id": { - "description": "the repository id", - "type": "integer", - "format": "int64", - "x-go-name": "RepoID" - }, - "runs_on": { - "description": "the action run job labels to run on", - "type": "array", - "items": { - "type": "string" - }, - "x-go-name": "RunsOn" - }, - "status": { - "description": "the action run job status", - "type": "string", - "x-go-name": "Status" - }, - "task_id": { - "description": "the action run job latest task id", - "type": "integer", - "format": "int64", - "x-go-name": "TaskID" - } - }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ActionTask": { "description": "ActionTask represents a ActionTask", @@ -20855,7 +20237,7 @@ "x-go-name": "WorkflowID" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ActionTaskResponse": { "description": "ActionTaskResponse returns a ActionTask", @@ -20874,7 +20256,7 @@ "x-go-name": "Entries" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ActionVariable": { "description": "ActionVariable return value of the query API", @@ -20903,7 +20285,7 @@ "x-go-name": "RepoID" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Activity": { "type": "object", @@ -20994,7 +20376,7 @@ "x-go-name": "UserID" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ActivityPub": { "description": "ActivityPub type", @@ -21005,7 +20387,7 @@ "x-go-name": "Context" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "AddCollaboratorOption": { "description": "AddCollaboratorOption options when adding a user as a collaborator of a repository", @@ -21021,7 +20403,7 @@ "x-go-name": "Permission" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "AddTimeOption": { "description": "AddTimeOption options for adding time to an issue", @@ -21047,7 +20429,7 @@ "x-go-name": "User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "AnnotatedTag": { "description": "AnnotatedTag represents an annotated tag", @@ -21082,7 +20464,7 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "AnnotatedTagObject": { "description": "AnnotatedTagObject contains meta information of the tag object", @@ -21101,7 +20483,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Attachment": { "description": "Attachment a generic attachment", @@ -21148,7 +20530,7 @@ "x-go-name": "UUID" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "BlockedUser": { "type": "object", @@ -21165,7 +20547,7 @@ "x-go-name": "Created" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Branch": { "description": "Branch represents a repository branch", @@ -21211,7 +20593,7 @@ "x-go-name": "UserCanPush" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "BranchProtection": { "description": "BranchProtection represents a branch protection for a repository", @@ -21351,7 +20733,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ChangeFileOperation": { "description": "ChangeFileOperation for creating, updating or deleting a file", @@ -21392,7 +20774,7 @@ "x-go-name": "SHA" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ChangeFilesOptions": { "description": "ChangeFilesOptions options for creating, updating or deleting multiple files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", @@ -21439,7 +20821,7 @@ "x-go-name": "Signoff" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ChangedFile": { "description": "ChangedFile store information about files affected by the pull request", @@ -21485,7 +20867,7 @@ "x-go-name": "Status" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CombinedStatus": { "description": "CombinedStatus holds the combined state of several statuses for a single commit", @@ -21522,7 +20904,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Comment": { "description": "Comment represents a comment on a commit or issue", @@ -21579,7 +20961,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Commit": { "type": "object", @@ -21629,7 +21011,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitAffectedFiles": { "description": "CommitAffectedFiles store information about files affected by the commit", @@ -21644,7 +21026,7 @@ "x-go-name": "Status" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitDateOptions": { "description": "CommitDateOptions store dates for GIT_AUTHOR_DATE and GIT_COMMITTER_DATE", @@ -21661,7 +21043,7 @@ "x-go-name": "Committer" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitMeta": { "type": "object", @@ -21681,7 +21063,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitStats": { "description": "CommitStats is statistics for a RepoCommit", @@ -21703,7 +21085,7 @@ "x-go-name": "Total" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitStatus": { "description": "CommitStatus holds a single status of a single Commit", @@ -21747,12 +21129,12 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitStatusState": { "description": "CommitStatusState holds the state of a CommitStatus\nIt can be \"pending\", \"success\", \"error\" and \"failure\"", "type": "string", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CommitUser": { "type": "object", @@ -21772,7 +21154,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Compare": { "type": "object", @@ -21785,20 +21167,13 @@ }, "x-go-name": "Commits" }, - "files": { - "type": "array", - "items": { - "$ref": "#/definitions/CommitAffectedFiles" - }, - "x-go-name": "Files" - }, "total_commits": { "type": "integer", "format": "int64", "x-go-name": "TotalCommits" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ContentsResponse": { "description": "ContentsResponse contains information about a repo's entry's (dir, file, symlink, submodule) metadata and content", @@ -21870,7 +21245,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateAccessTokenOption": { "description": "CreateAccessTokenOption options when create access token", @@ -21891,7 +21266,7 @@ "x-go-name": "Scopes" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateBranchProtectionOption": { "description": "CreateBranchProtectionOption options for creating a branch protection", @@ -22021,7 +21396,7 @@ "x-go-name": "UnprotectedFilePatterns" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateBranchRepoOption": { "description": "CreateBranchRepoOption options when creating a branch in a repository", @@ -22049,7 +21424,7 @@ "x-go-name": "OldRefName" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateEmailOption": { "description": "CreateEmailOption options when creating email addresses", @@ -22064,7 +21439,7 @@ "x-go-name": "Emails" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateFileOptions": { "description": "CreateFileOptions options for creating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", @@ -22108,7 +21483,7 @@ "x-go-name": "Signoff" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateForkOption": { "description": "CreateForkOption options for creating a fork", @@ -22125,7 +21500,7 @@ "x-go-name": "Organization" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateGPGKeyOption": { "description": "CreateGPGKeyOption options create user GPG key", @@ -22145,7 +21520,7 @@ "x-go-name": "Signature" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateHookOption": { "description": "CreateHookOption options when create a hook", @@ -22178,10 +21553,6 @@ }, "x-go-name": "Events" }, - "is_system_webhook": { - "type": "boolean", - "x-go-name": "IsSystemWebhook" - }, "type": { "type": "string", "enum": [ @@ -22200,7 +21571,7 @@ "x-go-name": "Type" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateHookOptionConfig": { "description": "CreateHookOptionConfig has all config options in it\nrequired are \"content_type\" and \"url\" Required", @@ -22208,7 +21579,7 @@ "additionalProperties": { "type": "string" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateIssueCommentOption": { "description": "CreateIssueCommentOption options for creating a comment on an issue", @@ -22227,7 +21598,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateIssueOption": { "description": "CreateIssueOption options to create one issue", @@ -22285,7 +21656,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateKeyOption": { "description": "CreateKeyOption options when creating a key", @@ -22313,7 +21684,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateLabelOption": { "description": "CreateLabelOption options for creating a label", @@ -22347,7 +21718,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateMilestoneOption": { "description": "CreateMilestoneOption options for creating a milestone", @@ -22375,7 +21746,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateOAuth2ApplicationOptions": { "description": "CreateOAuth2ApplicationOptions holds options to create an oauth2 application", @@ -22397,7 +21768,7 @@ "x-go-name": "RedirectURIs" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateOrUpdateSecretOption": { "description": "CreateOrUpdateSecretOption options when creating or updating secret", @@ -22412,7 +21783,7 @@ "x-go-name": "Data" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateOrgOption": { "description": "CreateOrgOption options for creating an organization", @@ -22460,7 +21831,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreatePullRequestOption": { "description": "CreatePullRequestOption options when creating a pull request", @@ -22512,7 +21883,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreatePullReviewComment": { "description": "CreatePullReviewComment represent a review comment for creation api", @@ -22540,9 +21911,10 @@ "x-go-name": "Path" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreatePullReviewCommentOptions": { + "description": "CreatePullReviewCommentOptions are options to create a pull review comment", "$ref": "#/definitions/CreatePullReviewComment" }, "CreatePullReviewOptions": { @@ -22568,7 +21940,7 @@ "$ref": "#/definitions/ReviewStateType" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreatePushMirrorOption": { "type": "object", @@ -22599,7 +21971,7 @@ "x-go-name": "UseSSH" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateQuotaGroupOptions": { "description": "CreateQutaGroupOptions represents the options for creating a quota group", @@ -22619,7 +21991,7 @@ "x-go-name": "Rules" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateQuotaRuleOptions": { "description": "CreateQuotaRuleOptions represents the options for creating a quota rule", @@ -22645,7 +22017,7 @@ "x-go-name": "Subjects" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateReleaseOption": { "description": "CreateReleaseOption options when creating a release", @@ -22683,7 +22055,7 @@ "x-go-name": "Target" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateRepoOption": { "description": "CreateRepoOption options when creating repository", @@ -22764,7 +22136,7 @@ "x-go-name": "TrustModel" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateStatusOption": { "description": "CreateStatusOption holds the information needed to create a new CommitStatus for a Commit", @@ -22786,7 +22158,7 @@ "x-go-name": "TargetURL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateTagOption": { "description": "CreateTagOption options when creating a tag", @@ -22808,7 +22180,7 @@ "x-go-name": "Target" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateTagProtectionOption": { "description": "CreateTagProtectionOption options for creating a tag protection", @@ -22833,7 +22205,7 @@ "x-go-name": "WhitelistUsernames" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateTeamOption": { "description": "CreateTeamOption options for creating a team", @@ -22895,7 +22267,7 @@ "example": "{\"repo.actions\",\"repo.packages\",\"repo.code\":\"read\",\"repo.issues\":\"write\",\"repo.ext_issues\":\"none\",\"repo.wiki\":\"admin\",\"repo.pulls\":\"owner\",\"repo.releases\":\"none\",\"repo.projects\":\"none\",\"repo.ext_wiki\":\"none\"}" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateUserOption": { "description": "CreateUserOption create user options", @@ -22954,7 +22326,7 @@ "x-go-name": "Visibility" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateVariableOption": { "description": "CreateVariableOption the option when creating variable", @@ -22969,7 +22341,7 @@ "x-go-name": "Value" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "CreateWikiPageOptions": { "description": "CreateWikiPageOptions form for creating wiki", @@ -22991,7 +22363,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Cron": { "description": "Cron represents a Cron task", @@ -23021,7 +22393,7 @@ "x-go-name": "Schedule" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DeleteEmailOption": { "description": "DeleteEmailOption options when deleting email addresses", @@ -23036,7 +22408,7 @@ "x-go-name": "Emails" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DeleteFileOptions": { "description": "DeleteFileOptions options for deleting files (used for other File structs below)\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", @@ -23080,7 +22452,7 @@ "x-go-name": "Signoff" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DeleteLabelsOption": { "description": "DeleteLabelOption options for deleting a label", @@ -23092,7 +22464,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DeployKey": { "description": "DeployKey a deploy key", @@ -23137,7 +22509,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DismissPullReviewOptions": { "description": "DismissPullReviewOptions are options to dismiss a pull review", @@ -23152,7 +22524,7 @@ "x-go-name": "Priors" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "DispatchWorkflowOption": { "description": "DispatchWorkflowOption options when dispatching a workflow", @@ -23173,42 +22545,9 @@ "description": "Git reference for the workflow", "type": "string", "x-go-name": "Ref" - }, - "return_run_info": { - "description": "Flag to return the run info", - "type": "boolean", - "default": false, - "x-go-name": "ReturnRunInfo" } }, - "x-go-package": "forgejo.org/modules/structs" - }, - "DispatchWorkflowRun": { - "description": "DispatchWorkflowRun represents a workflow run", - "type": "object", - "properties": { - "id": { - "description": "the workflow run id", - "type": "integer", - "format": "int64", - "x-go-name": "ID" - }, - "jobs": { - "description": "the jobs name", - "type": "array", - "items": { - "type": "string" - }, - "x-go-name": "Jobs" - }, - "run_number": { - "description": "a unique number for each run of a repository", - "type": "integer", - "format": "int64", - "x-go-name": "RunNumber" - } - }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditAttachmentOptions": { "description": "EditAttachmentOptions options for editing attachments", @@ -23224,7 +22563,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditBranchProtectionOption": { "description": "EditBranchProtectionOption options for editing a branch protection", @@ -23345,7 +22684,7 @@ "x-go-name": "UnprotectedFilePatterns" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditDeadlineOption": { "description": "EditDeadlineOption options for creating a deadline", @@ -23360,7 +22699,7 @@ "x-go-name": "Deadline" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditGitHookOption": { "description": "EditGitHookOption options when modifying one Git hook", @@ -23371,7 +22710,7 @@ "x-go-name": "Content" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditHookOption": { "description": "EditHookOption options when modify one hook", @@ -23404,7 +22743,7 @@ "x-go-name": "Events" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditIssueCommentOption": { "description": "EditIssueCommentOption options for editing a comment", @@ -23423,7 +22762,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditIssueOption": { "description": "EditIssueOption options for editing an issue", @@ -23477,7 +22816,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditLabelOption": { "description": "EditLabelOption options for editing a label", @@ -23507,7 +22846,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditMilestoneOption": { "description": "EditMilestoneOption options for editing a milestone", @@ -23531,7 +22870,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditOrgOption": { "description": "EditOrgOption options for editing an organization", @@ -23572,7 +22911,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditPullRequestOption": { "description": "EditPullRequestOption options when modify pull request", @@ -23632,7 +22971,7 @@ "x-go-name": "RemoveDeadline" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditQuotaRuleOptions": { "description": "EditQuotaRuleOptions represents the options for editing a quota rule", @@ -23653,7 +22992,7 @@ "x-go-name": "Subjects" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditReactionOption": { "description": "EditReactionOption contain the reaction type", @@ -23664,7 +23003,7 @@ "x-go-name": "Reaction" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditReleaseOption": { "description": "EditReleaseOption options when editing a release", @@ -23699,7 +23038,7 @@ "x-go-name": "Target" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditRepoOption": { "description": "EditRepoOption options when editing a repository's properties", @@ -23766,15 +23105,10 @@ "x-go-name": "DefaultDeleteBranchAfterMerge" }, "default_merge_style": { - "description": "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\".", + "description": "set to a merge style to be used by this repository: \"merge\", \"rebase\", \"rebase-merge\", \"squash\", or \"fast-forward-only\".", "type": "string", "x-go-name": "DefaultMergeStyle" }, - "default_update_style": { - "description": "set to a update style to be used by this repository: \"rebase\" or \"merge\"", - "type": "string", - "x-go-name": "DefaultUpdateStyle" - }, "description": { "description": "a short description of the repository.", "type": "string", @@ -23871,7 +23205,7 @@ "x-go-name": "WikiBranch" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditTagProtectionOption": { "description": "EditTagProtectionOption options for editing a tag protection", @@ -23896,7 +23230,7 @@ "x-go-name": "WhitelistUsernames" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditTeamOption": { "description": "EditTeamOption options for editing a team", @@ -23965,7 +23299,7 @@ } } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "EditUserOption": { "description": "EditUserOption edit user options", @@ -24051,7 +23385,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Email": { "description": "Email an email address belonging to a user", @@ -24080,7 +23414,7 @@ "x-go-name": "Verified" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ExternalTracker": { "description": "ExternalTracker represents settings for external tracker", @@ -24107,7 +23441,7 @@ "x-go-name": "ExternalTrackerURL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ExternalWiki": { "description": "ExternalWiki represents setting for external wiki", @@ -24119,7 +23453,7 @@ "x-go-name": "ExternalWikiURL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "FileCommitResponse": { "type": "object", @@ -24163,7 +23497,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "FileDeleteResponse": { "description": "FileDeleteResponse contains information about a repo's file that was deleted", @@ -24179,7 +23513,7 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "FileLinksResponse": { "description": "FileLinksResponse contains the links for a repo's file", @@ -24198,7 +23532,7 @@ "x-go-name": "Self" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "FileResponse": { "description": "FileResponse contains information about a repo's file", @@ -24214,7 +23548,7 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "FilesResponse": { "description": "FilesResponse contains information about multiple files from a repo", @@ -24234,12 +23568,12 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ForgeLike": { "description": "ForgeLike activity data type", "type": "object", - "x-go-package": "forgejo.org/modules/forgefed" + "x-go-package": "code.gitea.io/gitea/modules/forgefed" }, "GPGKey": { "description": "GPGKey a user GPG key to sign commit and tag in repository", @@ -24307,7 +23641,7 @@ "x-go-name": "Verified" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GPGKeyEmail": { "description": "GPGKeyEmail an email attached to a GPGKey", @@ -24322,7 +23656,7 @@ "x-go-name": "Verified" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GeneralAPISettings": { "description": "GeneralAPISettings contains global api settings exposed by it", @@ -24349,7 +23683,7 @@ "x-go-name": "MaxResponseItems" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GeneralAttachmentSettings": { "description": "GeneralAttachmentSettings contains global Attachment settings exposed by API", @@ -24374,7 +23708,7 @@ "x-go-name": "MaxSize" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GeneralRepoSettings": { "description": "GeneralRepoSettings contains global repository settings exposed by API", @@ -24409,7 +23743,7 @@ "x-go-name": "TimeTrackingDisabled" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GeneralUISettings": { "description": "GeneralUISettings contains global ui settings exposed by API", @@ -24434,7 +23768,7 @@ "x-go-name": "DefaultTheme" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GenerateRepoOption": { "description": "GenerateRepoOption options when creating repository using a template", @@ -24506,7 +23840,7 @@ "x-go-name": "Webhooks" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitBlobResponse": { "description": "GitBlobResponse represents a git blob", @@ -24534,7 +23868,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitEntry": { "description": "GitEntry represents a git tree", @@ -24566,7 +23900,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitHook": { "description": "GitHook represents a Git repository hook", @@ -24585,7 +23919,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitObject": { "type": "object", @@ -24604,7 +23938,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitTreeResponse": { "description": "GitTreeResponse returns a git tree", @@ -24640,7 +23974,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "GitignoreTemplateInfo": { "description": "GitignoreTemplateInfo name and text of a gitignore template", @@ -24655,7 +23989,7 @@ "x-go-name": "Source" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Hook": { "description": "Hook a hook is a web hook when one repository changed", @@ -24719,7 +24053,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Identity": { "description": "Identity for a person's identity like an author or committer", @@ -24735,7 +24069,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "InternalTracker": { "description": "InternalTracker represents settings for internal tracker", @@ -24757,7 +24091,7 @@ "x-go-name": "EnableTimeTracker" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Issue": { "description": "Issue represents an issue in a repository", @@ -24876,7 +24210,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueConfig": { "type": "object", @@ -24893,7 +24227,7 @@ "x-go-name": "ContactLinks" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueConfigContactLink": { "type": "object", @@ -24911,7 +24245,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueConfigValidation": { "type": "object", @@ -24925,7 +24259,7 @@ "x-go-name": "Valid" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueDeadline": { "description": "IssueDeadline represents an issue deadline", @@ -24937,7 +24271,7 @@ "x-go-name": "Deadline" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueFormField": { "description": "IssueFormField represents a form field", @@ -24968,17 +24302,17 @@ "x-go-name": "Visible" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueFormFieldType": { "type": "string", "title": "IssueFormFieldType defines issue form field type, can be \"markdown\", \"textarea\", \"input\", \"dropdown\" or \"checkboxes\"", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueFormFieldVisible": { "description": "IssueFormFieldVisible defines issue form field visible", "type": "string", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueLabelsOption": { "description": "IssueLabelsOption a collection of labels", @@ -24996,7 +24330,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueMeta": { "description": "IssueMeta basic issue information", @@ -25016,7 +24350,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueTemplate": { "description": "IssueTemplate represents an issue template for a repository", @@ -25057,14 +24391,14 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "IssueTemplateLabels": { "type": "array", "items": { "type": "string" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Label": { "description": "Label a label to an issue or a pr", @@ -25103,7 +24437,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "LabelTemplate": { "description": "LabelTemplate info of a Label template", @@ -25128,7 +24462,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "LicenseTemplateInfo": { "description": "LicensesInfo contains information about a License", @@ -25155,7 +24489,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "LicensesTemplateListEntry": { "description": "LicensesListEntry is used for the API", @@ -25174,7 +24508,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "MarkdownOption": { "description": "MarkdownOption markdown options", @@ -25197,16 +24531,12 @@ "type": "boolean" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "MarkupOption": { "description": "MarkupOption markup options", "type": "object", "properties": { - "BranchPath": { - "description": "The current branch path where the form gets posted\n\nin: body", - "type": "string" - }, "Context": { "description": "Context to render\n\nin: body", "type": "string" @@ -25228,7 +24558,7 @@ "type": "boolean" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "MergePullRequestOption": { "description": "MergePullRequestForm form for merging Pull Request", @@ -25275,7 +24605,7 @@ } }, "x-go-name": "MergePullRequestForm", - "x-go-package": "forgejo.org/services/forms" + "x-go-package": "code.gitea.io/gitea/services/forms" }, "MigrateRepoOptions": { "description": "MigrateRepoOptions options for migrating repository's\nthis is used to interact with api v1", @@ -25379,7 +24709,7 @@ "x-go-name": "Wiki" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Milestone": { "description": "Milestone milestone is a collection of issues on one repository", @@ -25432,7 +24762,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NewIssuePinsAllowed": { "description": "NewIssuePinsAllowed represents an API response that says if new Issue Pins are allowed", @@ -25447,7 +24777,7 @@ "x-go-name": "PullRequests" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NodeInfo": { "description": "NodeInfo contains standardized way of exposing metadata about a server running one of the distributed social networks", @@ -25482,7 +24812,7 @@ "x-go-name": "Version" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NodeInfoServices": { "description": "NodeInfoServices contains the third party sites this server can connect to via their application API", @@ -25503,7 +24833,7 @@ "x-go-name": "Outbound" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NodeInfoSoftware": { "description": "NodeInfoSoftware contains Metadata about server software in use", @@ -25526,7 +24856,7 @@ "x-go-name": "Version" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NodeInfoUsage": { "description": "NodeInfoUsage contains usage statistics for this server", @@ -25546,7 +24876,7 @@ "$ref": "#/definitions/NodeInfoUsageUsers" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NodeInfoUsageUsers": { "description": "NodeInfoUsageUsers contains statistics about the users of this server", @@ -25568,7 +24898,7 @@ "x-go-name": "Total" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Note": { "description": "Note contains information related to a git note", @@ -25582,17 +24912,7 @@ "x-go-name": "Message" } }, - "x-go-package": "forgejo.org/modules/structs" - }, - "NoteOptions": { - "type": "object", - "properties": { - "message": { - "type": "string", - "x-go-name": "Message" - } - }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NotificationCount": { "description": "NotificationCount number of unread notifications", @@ -25604,7 +24924,7 @@ "x-go-name": "New" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NotificationSubject": { "description": "NotificationSubject contains the notification subject (Issue/Pull/Commit)", @@ -25637,7 +24957,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NotificationThread": { "description": "NotificationThread expose Notification on API", @@ -25672,12 +24992,12 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "NotifySubjectType": { "description": "NotifySubjectType represent type of notification subject", "type": "string", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "OAuth2Application": { "type": "object", @@ -25717,7 +25037,7 @@ "x-go-name": "RedirectURIs" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Organization": { "description": "Organization represents an organization", @@ -25770,7 +25090,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "OrganizationPermissions": { "description": "OrganizationPermissions list different users permissions on an organization", @@ -25797,7 +25117,7 @@ "x-go-name": "IsOwner" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PRBranchInfo": { "description": "PRBranchInfo information about a branch", @@ -25824,7 +25144,7 @@ "x-go-name": "Sha" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Package": { "description": "Package represents a package", @@ -25866,7 +25186,7 @@ "x-go-name": "Version" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PackageFile": { "description": "PackageFile represents a package file", @@ -25902,7 +25222,7 @@ "x-go-name": "HashSHA512" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PayloadCommit": { "description": "PayloadCommit represents a commit", @@ -25957,7 +25277,7 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PayloadCommitVerification": { "description": "PayloadCommitVerification represents the GPG verification of a commit", @@ -25983,7 +25303,7 @@ "x-go-name": "Verified" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PayloadUser": { "description": "PayloadUser represents the author or committer of a commit", @@ -26004,7 +25324,7 @@ "x-go-name": "UserName" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Permission": { "description": "Permission represents a set of permissions", @@ -26023,7 +25343,7 @@ "x-go-name": "Push" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PublicKey": { "description": "PublicKey publickey is a user key to push code to repository", @@ -26067,7 +25387,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullRequest": { "description": "PullRequest represents a pull request", @@ -26137,11 +25457,6 @@ "format": "date-time", "x-go-name": "Deadline" }, - "flow": { - "type": "integer", - "format": "int64", - "x-go-name": "Flow" - }, "head": { "$ref": "#/definitions/PRBranchInfo" }, @@ -26246,7 +25561,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullRequestMeta": { "description": "PullRequestMeta PR info if an issue is a PR", @@ -26270,7 +25585,7 @@ "x-go-name": "Merged" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullReview": { "description": "PullReview represents a pull request review", @@ -26334,7 +25649,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullReviewComment": { "description": "PullReviewComment represents a comment on a pull request review", @@ -26405,7 +25720,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PullReviewRequestOptions": { "description": "PullReviewRequestOptions are options to add or remove pull review requests", @@ -26426,7 +25741,7 @@ "x-go-name": "TeamReviewers" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "PushMirror": { "description": "PushMirror represents information of a push mirror", @@ -26471,7 +25786,7 @@ "x-go-name": "SyncOnCommit" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaGroup": { "description": "QuotaGroup represents a quota group", @@ -26491,7 +25806,7 @@ "x-go-name": "Rules" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaGroupList": { "description": "QuotaGroupList represents a list of quota groups", @@ -26499,7 +25814,7 @@ "items": { "$ref": "#/definitions/QuotaGroup" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaInfo": { "description": "QuotaInfo represents information about a user's quota", @@ -26512,7 +25827,7 @@ "$ref": "#/definitions/QuotaUsed" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaRuleInfo": { "description": "QuotaRuleInfo contains information about a quota rule", @@ -26538,7 +25853,7 @@ "x-go-name": "Subjects" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsed": { "description": "QuotaUsed represents the quota usage of a user", @@ -26548,7 +25863,7 @@ "$ref": "#/definitions/QuotaUsedSize" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedArtifact": { "description": "QuotaUsedArtifact represents an artifact counting towards a user's quota", @@ -26571,7 +25886,7 @@ "x-go-name": "Size" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedArtifactList": { "description": "QuotaUsedArtifactList represents a list of artifacts counting towards a user's quota", @@ -26579,7 +25894,7 @@ "items": { "$ref": "#/definitions/QuotaUsedArtifact" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedAttachment": { "description": "QuotaUsedAttachment represents an attachment counting towards a user's quota", @@ -26619,7 +25934,7 @@ "x-go-name": "Size" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedAttachmentList": { "description": "QuotaUsedAttachmentList represents a list of attachment counting towards a user's quota", @@ -26627,7 +25942,7 @@ "items": { "$ref": "#/definitions/QuotaUsedAttachment" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedPackage": { "description": "QuotaUsedPackage represents a package counting towards a user's quota", @@ -26660,7 +25975,7 @@ "x-go-name": "Version" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedPackageList": { "description": "QuotaUsedPackageList represents a list of packages counting towards a user's quota", @@ -26668,7 +25983,7 @@ "items": { "$ref": "#/definitions/QuotaUsedPackage" }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSize": { "description": "QuotaUsedSize represents the size-based quota usage of a user", @@ -26684,7 +25999,7 @@ "$ref": "#/definitions/QuotaUsedSizeRepos" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSizeAssets": { "description": "QuotaUsedSizeAssets represents the size-based asset usage of a user", @@ -26703,7 +26018,7 @@ "$ref": "#/definitions/QuotaUsedSizeAssetsPackages" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSizeAssetsAttachments": { "description": "QuotaUsedSizeAssetsAttachments represents the size-based attachment quota usage of a user", @@ -26722,7 +26037,7 @@ "x-go-name": "Releases" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSizeAssetsPackages": { "description": "QuotaUsedSizeAssetsPackages represents the size-based package quota usage of a user", @@ -26735,7 +26050,7 @@ "x-go-name": "All" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSizeGit": { "description": "QuotaUsedSizeGit represents the size-based git (lfs) quota usage of a user", @@ -26747,7 +26062,7 @@ "format": "int64" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "QuotaUsedSizeRepos": { "description": "QuotaUsedSizeRepos represents the size-based repository quota usage of a user", @@ -26766,7 +26081,7 @@ "x-go-name": "Public" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Reaction": { "description": "Reaction contain one reaction", @@ -26785,7 +26100,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Reference": { "type": "object", @@ -26803,7 +26118,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Release": { "description": "Release represents a repository release", @@ -26886,23 +26201,7 @@ "x-go-name": "ZipURL" } }, - "x-go-package": "forgejo.org/modules/structs" - }, - "RenameOrgOption": { - "description": "RenameOrgOption options when renaming an organization", - "type": "object", - "required": [ - "new_name" - ], - "properties": { - "new_name": { - "description": "New username for this org. This name cannot be in use yet by any other user.", - "type": "string", - "uniqueItems": true, - "x-go-name": "NewName" - } - }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RenameUserOption": { "description": "RenameUserOption options when renaming a user", @@ -26918,7 +26217,7 @@ "x-go-name": "NewName" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ReplaceFlagsOption": { "description": "ReplaceFlagsOption options when replacing the flags of a repository", @@ -26932,7 +26231,7 @@ "x-go-name": "Flags" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RepoCollaboratorPermission": { "description": "RepoCollaboratorPermission to get repository permission for a collaborator", @@ -26950,7 +26249,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RepoCommit": { "type": "object", @@ -26977,7 +26276,7 @@ "$ref": "#/definitions/PayloadCommitVerification" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RepoTopicOptions": { "description": "RepoTopicOptions a collection of repo topic names", @@ -26992,7 +26291,7 @@ "x-go-name": "Topics" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RepoTransfer": { "description": "RepoTransfer represents a pending repo transfer", @@ -27012,7 +26311,7 @@ "x-go-name": "Teams" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Repository": { "description": "Repository represents a repository", @@ -27080,10 +26379,6 @@ "type": "string", "x-go-name": "DefaultMergeStyle" }, - "default_update_style": { - "type": "string", - "x-go-name": "DefaultUpdateStyle" - }, "description": { "type": "string", "x-go-name": "Description" @@ -27284,7 +26579,7 @@ "x-go-name": "WikiBranch" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "RepositoryMeta": { "description": "RepositoryMeta basic repository information", @@ -27308,12 +26603,12 @@ "x-go-name": "Owner" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ReviewStateType": { "description": "ReviewStateType review state type", "type": "string", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "SearchResults": { "description": "SearchResults results of a successful search", @@ -27331,7 +26626,7 @@ "x-go-name": "OK" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Secret": { "description": "Secret represents a secret", @@ -27348,7 +26643,7 @@ "x-go-name": "Name" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "ServerVersion": { "description": "ServerVersion wraps the version of the server", @@ -27359,7 +26654,7 @@ "x-go-name": "Version" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "SetUserQuotaGroupsOptions": { "description": "SetUserQuotaGroupsOptions represents the quota groups of a user", @@ -27377,12 +26672,12 @@ "x-go-name": "Groups" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "StateType": { "description": "StateType issue state type", "type": "string", - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "StopWatch": { "description": "StopWatch represent a running stopwatch", @@ -27420,7 +26715,7 @@ "x-go-name": "Seconds" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "SubmitPullReviewOptions": { "description": "SubmitPullReviewOptions are options to submit a pending pull review", @@ -27434,7 +26729,7 @@ "$ref": "#/definitions/ReviewStateType" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Tag": { "description": "Tag represents a repository tag", @@ -27467,7 +26762,7 @@ "x-go-name": "ZipballURL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TagArchiveDownloadCount": { "description": "TagArchiveDownloadCount counts how many times a archive was downloaded", @@ -27484,7 +26779,7 @@ "x-go-name": "Zip" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TagProtection": { "description": "TagProtection represents a tag protection", @@ -27524,7 +26819,7 @@ "x-go-name": "WhitelistUsernames" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "Team": { "description": "Team represents a team in an organization", @@ -27600,13 +26895,13 @@ } } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TimeStamp": { "description": "TimeStamp defines a timestamp", "type": "integer", "format": "int64", - "x-go-package": "forgejo.org/modules/timeutil" + "x-go-package": "code.gitea.io/gitea/modules/timeutil" }, "TimelineComment": { "description": "TimelineComment represents a timeline comment (comment of any type) on a commit or issue", @@ -27726,7 +27021,7 @@ "$ref": "#/definitions/User" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TopicName": { "description": "TopicName a list of repo topic names", @@ -27740,7 +27035,7 @@ "x-go-name": "TopicNames" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TopicResponse": { "description": "TopicResponse for returning topics", @@ -27771,7 +27066,7 @@ "x-go-name": "Updated" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TrackedTime": { "description": "TrackedTime worked time for an issue / pr", @@ -27813,7 +27108,7 @@ "x-go-name": "UserName" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "TransferRepoOption": { "description": "TransferRepoOption options when transfer a repository's ownership", @@ -27836,23 +27131,7 @@ "x-go-name": "TeamIDs" } }, - "x-go-package": "forgejo.org/modules/structs" - }, - "UpdateBranchRepoOption": { - "description": "UpdateBranchRepoOption options when updating a branch in a repository", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "New branch name", - "type": "string", - "uniqueItems": true, - "x-go-name": "Name" - } - }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UpdateFileOptions": { "description": "UpdateFileOptions options for updating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", @@ -27907,7 +27186,7 @@ "x-go-name": "Signoff" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UpdateRepoAvatarOption": { "description": "UpdateRepoAvatarUserOption options when updating the repo avatar", @@ -27919,7 +27198,7 @@ "x-go-name": "Image" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UpdateUserAvatarOption": { "description": "UpdateUserAvatarUserOption options when updating the user avatar", @@ -27931,7 +27210,7 @@ "x-go-name": "Image" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UpdateVariableOption": { "description": "UpdateVariableOption the option when updating variable", @@ -27951,7 +27230,7 @@ "x-go-name": "Value" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "User": { "description": "User represents a user", @@ -27999,7 +27278,7 @@ "x-go-name": "FullName" }, "html_url": { - "description": "URL to the user's profile page", + "description": "URL to the user's gitea page", "type": "string", "x-go-name": "HTMLURL" }, @@ -28077,7 +27356,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UserHeatmapData": { "description": "UserHeatmapData represents the data needed to create a heatmap", @@ -28092,7 +27371,7 @@ "$ref": "#/definitions/TimeStamp" } }, - "x-go-package": "forgejo.org/models/activities" + "x-go-package": "code.gitea.io/gitea/models/activities" }, "UserSettings": { "description": "UserSettings represents user settings", @@ -28123,10 +27402,6 @@ "type": "boolean", "x-go-name": "HideEmail" }, - "hide_pronouns": { - "type": "boolean", - "x-go-name": "HidePronouns" - }, "language": { "type": "string", "x-go-name": "Language" @@ -28148,7 +27423,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "UserSettingsOptions": { "description": "UserSettingsOptions represents options to change user settings", @@ -28179,10 +27454,6 @@ "type": "boolean", "x-go-name": "HideEmail" }, - "hide_pronouns": { - "type": "boolean", - "x-go-name": "HidePronouns" - }, "language": { "type": "string", "x-go-name": "Language" @@ -28204,7 +27475,7 @@ "x-go-name": "Website" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "WatchInfo": { "description": "WatchInfo represents an API watch status of one repository", @@ -28235,7 +27506,7 @@ "x-go-name": "URL" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "WikiCommit": { "description": "WikiCommit page commit/revision", @@ -28256,7 +27527,7 @@ "x-go-name": "ID" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "WikiCommitList": { "description": "WikiCommitList commit/revision list", @@ -28275,7 +27546,7 @@ "x-go-name": "Count" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "WikiPage": { "description": "WikiPage a wiki page", @@ -28315,7 +27586,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" }, "WikiPageMetaData": { "description": "WikiPageMetaData wiki page meta information", @@ -28337,7 +27608,7 @@ "x-go-name": "Title" } }, - "x-go-package": "forgejo.org/modules/structs" + "x-go-package": "code.gitea.io/gitea/modules/structs" } }, "responses": { @@ -28594,12 +27865,6 @@ } } }, - "DispatchWorkflowRun": { - "description": "DispatchWorkflowRun is a Workflow Run after dispatching", - "schema": { - "$ref": "#/definitions/DispatchWorkflowRun" - } - }, "EmailList": { "description": "EmailList", "schema": { @@ -29155,15 +28420,6 @@ } } }, - "RunJobList": { - "description": "RunJobList is a list of action run jobs", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/ActionRunJob" - } - } - }, "SearchResults": { "description": "SearchResults", "schema": { @@ -29392,12 +28648,6 @@ "$ref": "#/definitions/APIForbiddenError" } }, - "internalServerError": { - "description": "APIInternalServerError is an error that is raised when an internal server error occurs", - "schema": { - "$ref": "#/definitions/APIInternalServerError" - } - }, "invalidTopicsError": { "description": "APIInvalidTopicsError is error format response to invalid topics", "schema": { @@ -29413,7 +28663,7 @@ "parameterBodies": { "description": "parameterBodies", "schema": { - "$ref": "#/definitions/NoteOptions" + "$ref": "#/definitions/SetUserQuotaGroupsOptions" } }, "quotaExceeded": { diff --git a/templates/user/auth/captcha.tmpl b/templates/user/auth/captcha.tmpl index 9d0d6cfb6f..03e360703b 100644 --- a/templates/user/auth/captcha.tmpl +++ b/templates/user/auth/captcha.tmpl @@ -1,7 +1,7 @@ {{if .EnableCaptcha}}{{if eq .CaptchaType "image"}}
    - {{ctx.Locale.Tr +
    diff --git a/templates/user/auth/finalize_openid.tmpl b/templates/user/auth/finalize_openid.tmpl index 372471368f..f84f860b02 100644 --- a/templates/user/auth/finalize_openid.tmpl +++ b/templates/user/auth/finalize_openid.tmpl @@ -30,7 +30,7 @@ {{if .ShowRegistrationButton}}
    diff --git a/templates/user/auth/oauth_container.tmpl b/templates/user/auth/oauth_container.tmpl index 7531320394..bb6a10d408 100644 --- a/templates/user/auth/oauth_container.tmpl +++ b/templates/user/auth/oauth_container.tmpl @@ -1,9 +1,7 @@ {{if or .OAuth2Providers .EnableOpenIDSignIn}} -{{if or (and .PageIsSignUp (not .DisableRegistration)) (and .PageIsSignIn .EnableInternalSignIn)}} -
    - {{ctx.Locale.Tr "sign_in_or"}} -
    -{{end}} +
    + {{ctx.Locale.Tr "sign_in_or"}} +
    @@ -19,6 +17,12 @@ {{ctx.Locale.Tr "auth.sign_in_openid"}} {{end}} + {{if .EnableSSPI}} + + {{svg "fontawesome-windows"}} +  SSPI + + {{end}}
    diff --git a/templates/user/auth/signin_inner.tmpl b/templates/user/auth/signin_inner.tmpl index 4abb4646d1..56532f4b98 100644 --- a/templates/user/auth/signin_inner.tmpl +++ b/templates/user/auth/signin_inner.tmpl @@ -10,7 +10,6 @@ {{end}}
    - {{if .EnableInternalSignIn}}
    {{.CsrfTokenHtml}}
    @@ -44,13 +43,11 @@
    - {{end}} {{template "user/auth/oauth_container" .}}
    -{{if not .DisablePassword}}
    {{template "user/auth/webauthn_error" .}} @@ -66,5 +63,3 @@
    -{{end}} - diff --git a/templates/user/auth/twofa_scratch.tmpl b/templates/user/auth/twofa_scratch.tmpl index 7d7e3c1b54..23ad77f2a9 100644 --- a/templates/user/auth/twofa_scratch.tmpl +++ b/templates/user/auth/twofa_scratch.tmpl @@ -16,7 +16,6 @@
    - {{ctx.Locale.Tr "auth.use_onetime_code"}}
    diff --git a/templates/user/dashboard/dashboard.tmpl b/templates/user/dashboard/dashboard.tmpl index 3ce3c1eb73..5dc46dc0a5 100644 --- a/templates/user/dashboard/dashboard.tmpl +++ b/templates/user/dashboard/dashboard.tmpl @@ -5,11 +5,7 @@
    {{template "base/alert" .}} {{template "user/heatmap" .}} - {{if .Feeds}} - {{template "user/dashboard/feeds" .}} - {{else}} - {{template "user/dashboard/guide" .}} - {{end}} + {{template "user/dashboard/feeds" .}}
    {{template "user/dashboard/repolist" .}}
    diff --git a/templates/user/dashboard/feeds.tmpl b/templates/user/dashboard/feeds.tmpl index e9fbb7a5b9..60aa194534 100644 --- a/templates/user/dashboard/feeds.tmpl +++ b/templates/user/dashboard/feeds.tmpl @@ -37,9 +37,6 @@ {{else if .GetOpType.InActions "merge_pull_request"}} {{$index := index .GetIssueInfos 0}} {{ctx.Locale.Tr "action.merge_pull_request" (printf "%s/pulls/%s" (.GetRepoLink ctx) $index) $index (.ShortRepoPath ctx)}} - {{else if .GetOpType.InActions "auto_merge_pull_request"}} - {{$index := index .GetIssueInfos 0}} - {{ctx.Locale.Tr "action.auto_merge_pull_request" (printf "%s/pulls/%s" (.GetRepoLink ctx) $index) $index (.ShortRepoPath ctx)}} {{else if .GetOpType.InActions "close_issue"}} {{$index := index .GetIssueInfos 0}} {{ctx.Locale.Tr "action.close_issue" (printf "%s/issues/%s" (.GetRepoLink ctx) $index) $index (.ShortRepoPath ctx)}} @@ -81,7 +78,7 @@ {{$reviewer := index .GetIssueInfos 1}} {{ctx.Locale.Tr "action.review_dismissed" (printf "%s/pulls/%s" (.GetRepoLink ctx) $index) $index (.ShortRepoPath ctx) $reviewer}} {{end}} - {{DateUtils.TimeSince .GetCreate}} + {{TimeSince .GetCreate ctx.Locale}}
    {{if .GetOpType.InActions "commit_repo" "mirror_sync_push"}} {{$push := ActionContent2Commits .}} @@ -91,7 +88,7 @@ {{range $push.Commits}} {{$commitLink := printf "%s/commit/%s" $repoLink .Sha1}}
    - + {{ShortSha .Sha1}} {{RenderCommitMessage $.Context .Message ($repo.ComposeMetas ctx)}} @@ -103,9 +100,9 @@ {{ctx.Locale.Tr "action.compare_commits" $push.Len}} » {{end}} {{else if .GetOpType.InActions "create_issue"}} - {{RenderIssueTitle ctx (index .GetIssueInfos 1) (.Repo.ComposeMetas ctx)}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} {{else if .GetOpType.InActions "create_pull_request"}} - {{RenderIssueTitle ctx (index .GetIssueInfos 1) (.Repo.ComposeMetas ctx)}} + {{index .GetIssueInfos 1 | RenderEmoji $.Context | RenderCodeBlock}} {{else if .GetOpType.InActions "comment_issue" "approve_pull_request" "reject_pull_request" "comment_pull"}} {{(.GetIssueTitle ctx) | RenderEmoji $.Context | RenderCodeBlock}} {{$comment := index .GetIssueInfos 1}} @@ -115,7 +112,7 @@ {{else if .GetOpType.InActions "merge_pull_request"}}
    {{index .GetIssueInfos 1}}
    {{else if .GetOpType.InActions "close_issue" "reopen_issue" "close_pull_request" "reopen_pull_request"}} - {{RenderIssueTitle ctx (.GetIssueTitle ctx) (.Repo.ComposeMetas ctx)}} + {{(.GetIssueTitle ctx) | RenderEmoji $.Context | RenderCodeBlock}} {{else if .GetOpType.InActions "pull_review_dismissed"}}
    {{ctx.Locale.Tr "action.review_dismissed_reason"}}
    {{index .GetIssueInfos 2 | RenderEmoji $.Context}}
    diff --git a/templates/user/dashboard/guide.tmpl b/templates/user/dashboard/guide.tmpl deleted file mode 100644 index a80c211030..0000000000 --- a/templates/user/dashboard/guide.tmpl +++ /dev/null @@ -1,16 +0,0 @@ -
    - {{svg "octicon-inbox" 64 "tw-text-placeholder-text"}} -

    {{ctx.Locale.Tr "home.welcome.no_activity"}}

    -

    {{ctx.Locale.Tr "home.welcome.activity_hint"}}

    -
    - {{ctx.Locale.Tr "home.explore_repos"}} - {{if not .UsersPageIsDisabled}} - · - {{ctx.Locale.Tr "home.explore_users"}} - {{end}} - {{if not .OrganizationsPageIsDisabled}} - · - {{ctx.Locale.Tr "home.explore_orgs"}} - {{end}} -
    -
    diff --git a/templates/user/dashboard/issues.tmpl b/templates/user/dashboard/issues.tmpl index c76a61c393..09d282b029 100644 --- a/templates/user/dashboard/issues.tmpl +++ b/templates/user/dashboard/issues.tmpl @@ -4,13 +4,13 @@
    {{template "base/alert" .}}
    -
    - - {{svg "octicon-issue-opened" 16}} + @@ -20,9 +20,9 @@ {{if .PageIsPulls}} - {{template "shared/search/combo" dict "Value" $.Keyword "Placeholder" (ctx.Locale.Tr "search.pull_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} + {{template "shared/search/combo_fuzzy" dict "Value" $.Keyword "IsFuzzy" $.IsFuzzy "Placeholder" (ctx.Locale.Tr "search.pull_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} {{else}} - {{template "shared/search/combo" dict "Value" $.Keyword "Placeholder" (ctx.Locale.Tr "search.issue_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} + {{template "shared/search/combo_fuzzy" dict "Value" $.Keyword "IsFuzzy" $.IsFuzzy "Placeholder" (ctx.Locale.Tr "search.issue_kind") "Tooltip" (ctx.Locale.Tr "explore.go_to")}} {{end}}
    @@ -38,29 +38,29 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
    diff --git a/templates/user/dashboard/milestones.tmpl b/templates/user/dashboard/milestones.tmpl index 347e7a81bf..fe8e246db6 100644 --- a/templates/user/dashboard/milestones.tmpl +++ b/templates/user/dashboard/milestones.tmpl @@ -35,13 +35,13 @@
    -
    + @@ -73,7 +73,7 @@ {{range .Milestones}}
  • -

    +

    {{.Repo.FullName}} @@ -104,19 +104,19 @@ {{if .UpdatedUnix}}
    {{svg "octicon-clock"}} - {{ctx.Locale.Tr "repo.milestones.update_ago" (DateUtils.TimeSince .UpdatedUnix)}} + {{ctx.Locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix ctx.Locale)}}
    {{end}}
    {{if .IsClosed}} - {{$closedDate:= DateUtils.TimeSince .ClosedDateUnix}} + {{$closedDate:= TimeSinceUnix .ClosedDateUnix ctx.Locale}} {{svg "octicon-clock" 14}} {{ctx.Locale.Tr "repo.milestones.closed" $closedDate}} {{else}} {{if .DeadlineString}} {{svg "octicon-calendar" 14}} - {{DateUtils.AbsoluteShort (.DeadlineString|DateUtils.ParseLegacy)}} + {{DateTime "short" .DeadlineString}} {{else}} {{svg "octicon-calendar" 14}} diff --git a/templates/user/dashboard/navbar.tmpl b/templates/user/dashboard/navbar.tmpl index f1059c75ff..1fa356f95d 100644 --- a/templates/user/dashboard/navbar.tmpl +++ b/templates/user/dashboard/navbar.tmpl @@ -6,8 +6,8 @@ {{ctx.AvatarUtils.Avatar .ContextUser}} {{.ContextUser.ShortName 40}} - {{if .ContextUser.Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} - {{if .ContextUser.Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}} + {{if .ContextUser.Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} + {{if .ContextUser.Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}}
    {{svg "octicon-triangle-down" 14 "dropdown icon"}} @@ -20,8 +20,8 @@ {{ctx.AvatarUtils.Avatar .SignedUser}} {{.SignedUser.ShortName 40}} - {{if .SignedUser.Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} - {{if .SignedUser.Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}} + {{if .SignedUser.Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} + {{if .SignedUser.Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}}
    {{range .Orgs}} @@ -29,8 +29,8 @@ {{ctx.AvatarUtils.Avatar .}} {{.ShortName 40}} - {{if .Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} - {{if .Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}} + {{if .Visibility.IsLimited}}
    {{ctx.Locale.Tr "org.settings.visibility.limited_shortname"}}
    {{end}} + {{if .Visibility.IsPrivate}}
    {{ctx.Locale.Tr "org.settings.visibility.private_shortname"}}
    {{end}}
    {{end}} diff --git a/templates/user/notification/notification_div.tmpl b/templates/user/notification/notification_div.tmpl index 3340c83e63..5c27ba8b41 100644 --- a/templates/user/notification/notification_div.tmpl +++ b/templates/user/notification/notification_div.tmpl @@ -2,7 +2,7 @@
    {{$notificationUnreadCount := call .NotificationUnreadCount}}
    -
    +

    -
    {{ctx.Locale.Tr "settings.email_desc"}}
    {{if $.EnableNotifyMail}}
    +
    {{ctx.Locale.Tr "settings.email_desc"}}
    {{$.CsrfTokenHtml}} diff --git a/templates/user/settings/appearance.tmpl b/templates/user/settings/appearance.tmpl index df4d6f3999..2aaf24adca 100644 --- a/templates/user/settings/appearance.tmpl +++ b/templates/user/settings/appearance.tmpl @@ -19,15 +19,15 @@ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
    - {{- range $i,$a := .AllThemes -}} - {{if eq $.SignedUser.Theme $a}}{{call $.ThemeName $a}}{{end}} - {{- end -}} + {{range $i,$a := .AllThemes}} + {{if eq $.SignedUser.Theme $a}}{{$a}}{{end}} + {{end}}
    diff --git a/templates/user/settings/applications.tmpl b/templates/user/settings/applications.tmpl index a5912c9e0f..04d4dcdb18 100644 --- a/templates/user/settings/applications.tmpl +++ b/templates/user/settings/applications.tmpl @@ -36,14 +36,10 @@
    -

    {{ctx.Locale.Tr "settings.added_on" (DateUtils.AbsoluteShort .CreatedUnix)}} — {{svg "octicon-info"}} {{if .HasUsed}}{{ctx.Locale.Tr "settings.last_used"}} {{DateUtils.AbsoluteShort .UpdatedUnix}}{{else}}{{ctx.Locale.Tr "settings.no_activity"}}{{end}}

    +

    {{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix)}} — {{svg "octicon-info"}} {{if .HasUsed}}{{ctx.Locale.Tr "settings.last_used"}} {{DateTime "short" .UpdatedUnix}}{{else}}{{ctx.Locale.Tr "settings.no_activity"}}{{end}}

    -
    +
    + +

    {{.SignedUser.Email}}

    +
    +
    + + +
    +
    + + +
    +
    + + +
    -
    diff --git a/templates/user/settings/security/twofa_enroll.tmpl b/templates/user/settings/security/twofa_enroll.tmpl index cac88ee1d0..d6bfadf084 100644 --- a/templates/user/settings/security/twofa_enroll.tmpl +++ b/templates/user/settings/security/twofa_enroll.tmpl @@ -14,7 +14,8 @@
    -
    +
    +
    diff --git a/templates/user/settings/security/webauthn.tmpl b/templates/user/settings/security/webauthn.tmpl index b04bcf4291..346f61c2ad 100644 --- a/templates/user/settings/security/webauthn.tmpl +++ b/templates/user/settings/security/webauthn.tmpl @@ -12,7 +12,7 @@
    {{.Name}}
    -

    {{ctx.Locale.Tr "settings.added_on" (DateUtils.AbsoluteShort .CreatedUnix)}}

    +

    {{ctx.Locale.Tr "settings.added_on" (DateTime "short" .CreatedUnix)}}

    diff --git a/templates/user/settings/storage_overview.tmpl b/templates/user/settings/storage_overview.tmpl deleted file mode 100644 index daa0cbd913..0000000000 --- a/templates/user/settings/storage_overview.tmpl +++ /dev/null @@ -1,5 +0,0 @@ -{{template "user/settings/layout_head" (dict "ctxData" . "pageClass" "user settings size-overview")}} -
    - {{template "shared/quota_overview" .}} -
    -{{template "user/settings/layout_footer" .}} diff --git a/tests/e2e/.eslintrc.yaml b/tests/e2e/.eslintrc.yaml new file mode 100644 index 0000000000..1486431524 --- /dev/null +++ b/tests/e2e/.eslintrc.yaml @@ -0,0 +1,24 @@ +plugins: + - eslint-plugin-playwright + +extends: + - ../../.eslintrc.yaml + - plugin:playwright/recommended + +parserOptions: + sourceType: module + ecmaVersion: latest + +env: + browser: true + +rules: + playwright/no-conditional-in-test: [0] + playwright/no-conditional-expect: [0] + playwright/no-networkidle: [0] + playwright/no-skipped-test: [2, {allowConditional: true}] + playwright/prefer-comparison-matcher: [2] + playwright/prefer-equality-matcher: [2] + playwright/prefer-to-contain: [2] + playwright/prefer-to-have-length: [2] + playwright/require-to-throw-message: [2] diff --git a/tests/e2e/README.md b/tests/e2e/README.md index 35fc5e7d1d..65520115e6 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -77,7 +77,7 @@ and playwright to perform tests on it. > (e.g. when only creating new content), > or that they restore the initial state for the next browser run. -#### With the playwright UI: +#### With the playwright UI: Playwright ships with an integrated UI mode which allows you to run individual tests and to debug them by seeing detailed traces of what playwright does. @@ -90,7 +90,7 @@ npx playwright test --ui #### Running individual tests ``` -npx playwright test actions.test.e2e.ts:9 +npx playwright test actions.test.e2e.js:9 ``` First, specify the complete test filename, @@ -110,32 +110,29 @@ If you have a [forgejo runner](https://code.forgejo.org/forgejo/runner/), you can use it to run the test jobs: ``` -forgejo-runner exec -W .forgejo/workflows/testing.yml -j test-e2e +forgejo-runner exec -W .forgejo/workflows/e2e.yml --event=pull_request ``` -Note that the CI workflow has some logic to run tests based on changed files only. -This might conflict with your local setup and not run all the desired tests -because it might only look at file changes in your latest commit. - ### Run e2e tests with another database This approach is not currently used, -neither in the CI/CD nor by core contributors on their local machines. +neither in the CI/CD nor by core contributors on their lcoal machines. It is still documented for the sake of completeness: You can also perform e2e tests using MariaDB/MySQL or PostgreSQL if you want. Setup a MySQL database inside docker ``` -docker run -e "MYSQL_DATABASE=test" -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -p 3306:3306 --rm --name mysql mysql:latest #(Ctrl-c to stop the database) +docker run -e "MYSQL_DATABASE=test" -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -p 3306:3306 --rm --name mysql mysql:latest #(just ctrl-c to stop db and clean the container) +docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --rm --name elasticsearch elasticsearch:7.6.0 #(in a second terminal, just ctrl-c to stop db and clean the container) ``` Start tests based on the database container ``` -TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test?multiStatements=true TEST_MYSQL_USERNAME=root TEST_MYSQL_PASSWORD='' make test-e2e-mysql +TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=root TEST_MYSQL_PASSWORD='' make test-e2e-mysql ``` Setup a pgsql database inside docker ``` -docker run -e POSTGRES_DB=test -e POSTGRES_PASSWORD=password -p 5432:5432 --rm --name pgsql postgres:latest #(Ctrl-c to stop the database) +docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:latest #(just ctrl-c to stop db and clean the container) ``` Start tests based on the database container ``` @@ -144,7 +141,7 @@ TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgr ### Running individual tests -Example command to run `example.test.e2e.ts` test file: +Example command to run `example.test.e2e.js` test file: > **Note** > Unlike integration tests, this filtering is at the file level, not function @@ -155,113 +152,26 @@ For SQLite: make test-e2e-sqlite#example ``` +### Visual testing + +> **Warning** +> This is not currently used by most Forgejo contributors. +> Your help to improve the situation and allow for visual testing is appreciated. + +Although the main goal of e2e is assertion testing, we have added a framework for visual regress testing. If you are working on front-end features, please use the following: + - Check out `main`, `make clean frontend`, and run e2e tests with `VISUAL_TEST=1` to generate outputs. This will initially fail, as no screenshots exist. You can run the e2e tests again to assert it passes. + - Check out your branch, `make clean frontend`, and run e2e tests with `VISUAL_TEST=1`. You should be able to assert you front-end changes don't break any other tests unintentionally. + +VISUAL_TEST=1 will create screenshots in tests/e2e/test-snapshots. The test will fail the first time this is enabled (until we get visual test image persistence figured out), because it will be testing against an empty screenshot folder. + +ACCEPT_VISUAL=1 will overwrite the snapshot images with new images. + ## Tips and tricks If you know noteworthy tests that can act as an inspiration for new tests, please add some details here. -### Understanding and waiting for page loads - -[Waiting for a load state](https://playwright.dev/docs/api/class-frame#frame-wait-for-load-state) -sound like a convenient way to ensure the page was loaded, -but it only works once and consecutive calls to it -(e.g. after clicking a button which should reload a page) -return immediately without waiting for *another* load event. - -If you match something which is on both the old and the new page, -you might succeed before the page was reloaded, -although the code using a `waitForLoadState` might intuitively suggest -the page was changed before. - -Interacting with the page before the reload -(e.g. by opening a dropdown) -might then race and result in flaky tests, -depending on the speed of the hardware running the test. - -A possible way to test that an interaction worked is by checking for a known change first. -For example: - -- you submit a form and you want to check that the content persisted -- checking for the content directly would succeed even without a page reload -- check for a success message first (will wait until it appears), then verify the content - -Alternatively, if you know the backend request that will be made before the reload, -you can explicitly wait for it: - -~~~js -const submitted = page.waitForResponse('/my/backend/post/request'); -await page.locator('button').first().click(); // perform your interaction -await submitted; -~~~ - -If the page redirects to another URL, -you can alternatively use: - -~~~js -await page.waitForURL('**/target.html'); -~~~ - -### Visual testing - -Due to size and frequent updates, we do not host screenshots in the Forgejo repository. -However, it is good practice to ensure that your test is capable of generating relevant and stable screenshots. -Forgejo is regularly tested against visual regressions in a dedicated repository which contains the screenshots: -https://code.forgejo.org/forgejo/visual-browser-testing/ - -For tests that consume only the `page`, -screenshots are automatically created at the end of each test. - -If your test visits different relevant screens or pages during the test, -or creates a custom `page` from context -(e.g. for tests that require a signed-in user) -calling `await save_visual(page);` explicitly in relevant positions is encouraged. - -Please confirm locally that your screenshots are stable by performing several runs of your test. -When screenshots are available and reproducible, -check in your test without the screenshots. - -When your screenshots differ between runs, -for example because dynamic elements (e.g. timestamps, commit hashes etc) -change between runs, -mask these elements in the `save_visual` function in `utils_e2e.ts`. - -#### Working with screenshots - -The following environment variables control visual testing: - -`VISUAL_TEST=1` will create screenshots in tests/e2e/test-snapshots. - The test will fail the first time, - because the screenshots are not included with Forgejo. - Subsequent runs will comopare against your local copy of the screenshots. - -`ACCEPT_VISUAL=1` will overwrite the snapshot images with new images. - -### Only sign in if necessary - -Signing in takes time and is actually executed step-by-step. -If your test does not rely on a user account, skip this step. - -~~~js -test('For anyone', async ({page}) => { - await page.goto('/somepage'); -~~~ - -If you need a user account, you can use something like: - -~~~js -import {test} from './utils_e2e.ts'; - -// reuse user2 token from scope `shared` -test.use({user: 'user2', authScope: 'shared'}) - -test('For signed users only', async ({page}) => { - -}) -~~~ - -users are created in [utils_e2e_test.go](utils_e2e_test.go) - ### Run tests very selectively Browser testing can take some time. @@ -290,86 +200,21 @@ Run `make lint-frontend-fix`. ### Define new repos Take a look at `declare_repos_test.go` to see how to add your repositories. -Feel free to improve the logic used there if you need more advanced functionality, -it is a simplified version of the code used in the integration tests. +Feel free to improve the logic used there if you need more advanced functionality +(it is a simplified version of the code used in the integration tests). ### Accessibility testing If you can, perform automated accessibility testing using [AxeCore](https://github.com/dequelabs/axe-core-npm/blob/develop/packages/playwright/README.md). -Take a look at `shared/forms.ts` and some other places for inspiration. +Take a look at `shared/forms.js` and some other places for inspiration. ### List related files coverage -To speed up the CI pipelines and avoid running expensive tests too often, -only a selection of tests is run by default, based on the changed files. +If you think your playwright tests covers an important aspect of some template, CSS or backend files, +consider adding the paths to `.forgejo/workflows/e2e.yml` in the path filter. -At the top of each playwright test file, -list the files or file patterns that are covered by your test. -Often, these are files that you modified for your feature or bugfix, -or that you looked at (and might still have open in your IDE), -because your fix depends on their behaviour. +It ensures that future modifications to this file will be tested as well. -#### Which files to watch? - -The set of files your test "watches" depends on the kind of test you write. -If you only test for the presence of an element and do no accessibility or placement checks, -you won't detect broken visual appearance and there is little reason to watch CSS files. - -However, if your test also checks that an element is correctly positioned -(e.g. that it does not overflow the page), -or has accessibility properties (includes colour contrast), -also list stylesheets that define the behaviour your test depends on. - -Watching the place that generate the selectors you use -(typically templates, but can also be JavaScript) -is a must, to ensure that someone modifying the markup notices that your selectors fail -(e.g. because an id or class was renamed). - -If you are unsure about the exact set of files, feel free to ask other contributors. - -#### How to specify the patterns? - -You put filenames and patterns as blocks between two `// @watch` comments. -An example that watches changes on (in order) -a single file, -a full recursive subfolder, -two files with a shorthand pattern, -and a set of files with a certain ending: - -~~~ -// @watch start -// templates/webhook/shared-settings.tmpl -// templates/repo/settings/** -// web_src/css/{form,repo}.css -// web_src/css/modules/*.css -// @watch end -~~~ - -The patterns are evaluated on a "first-match" basis. -Under the hood, [gobwas/glob](https://github.com/gobwas/glob) is used. - -## Grouped retry for interactions - -Sometimes, it can be necessary to retry certain interactions together. -Consider the following procedure: - -1. click to open a dropdown -2. interact with content in the dropdown - -When for some reason the dropdown does not open, -for example because of it taking time to initialize after page load, -the click will succeed, -but the depending interaction won't, -although playwright repeatedly tries to find the content. - -You can [group statements using toPass]()https://playwright.dev/docs/test-assertions#expecttopass). -This code retries the dropdown click until the second item is found. - -~~~js -await expect(async () => { - await page.locator('.dropdown').click(); - await page.locator('.dropdown .item').first().click(); -}).toPass(); -~~~ +Currently, we do not run the e2e tests on all changes. diff --git a/tests/e2e/actions.test.e2e.js b/tests/e2e/actions.test.e2e.js new file mode 100644 index 0000000000..b049a93ed9 --- /dev/null +++ b/tests/e2e/actions.test.e2e.js @@ -0,0 +1,79 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +const workflow_trigger_notification_text = 'This workflow has a workflow_dispatch event trigger.'; + +test('workflow dispatch present', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + /** @type {import('@playwright/test').Page} */ + const page = await context.newPage(); + + await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); + + await expect(page.getByText(workflow_trigger_notification_text)).toBeVisible(); + + const run_workflow_btn = page.locator('#workflow_dispatch_dropdown>button'); + await expect(run_workflow_btn).toBeVisible(); + + const menu = page.locator('#workflow_dispatch_dropdown>.menu'); + await expect(menu).toBeHidden(); + await run_workflow_btn.click(); + await expect(menu).toBeVisible(); +}); + +test('workflow dispatch error: missing inputs', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383'); + + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + /** @type {import('@playwright/test').Page} */ + const page = await context.newPage(); + + await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); + await page.waitForLoadState('networkidle'); + + await page.locator('#workflow_dispatch_dropdown>button').click(); + + // Remove the required attribute so we can trigger the error message! + await page.evaluate(() => { + const elem = document.querySelector('input[name="inputs[string2]"]'); + elem?.removeAttribute('required'); + }); + + await page.locator('#workflow-dispatch-submit').click(); + await page.waitForLoadState('networkidle'); + + await expect(page.getByText('Require value for input "String w/o. default".')).toBeVisible(); +}); + +test('workflow dispatch success', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383'); + + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + /** @type {import('@playwright/test').Page} */ + const page = await context.newPage(); + + await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); + await page.waitForLoadState('networkidle'); + + await page.locator('#workflow_dispatch_dropdown>button').click(); + + await page.type('input[name="inputs[string2]"]', 'abc'); + await page.locator('#workflow-dispatch-submit').click(); + await page.waitForLoadState('networkidle'); + + await expect(page.getByText('Workflow run was successfully requested.')).toBeVisible(); + + await expect(page.locator('.run-list>:first-child .run-list-meta', {hasText: 'now'})).toBeVisible(); +}); + +test('workflow dispatch box not available for unauthenticated users', async ({page}) => { + await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); + await page.waitForLoadState('networkidle'); + + await expect(page.locator('body')).not.toContainText(workflow_trigger_notification_text); +}); diff --git a/tests/e2e/actions.test.e2e.ts b/tests/e2e/actions.test.e2e.ts deleted file mode 100644 index 4e93b89ee0..0000000000 --- a/tests/e2e/actions.test.e2e.ts +++ /dev/null @@ -1,75 +0,0 @@ -// @watch start -// templates/repo/actions/** -// web_src/css/actions.css -// web_src/js/components/ActionRunStatus.vue -// web_src/js/components/RepoActionView.vue -// modules/actions/** -// modules/structs/workflow.go -// routers/api/v1/repo/action.go -// routers/web/repo/actions/** -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -const workflow_trigger_notification_text = 'This workflow has a workflow_dispatch event trigger.'; -test.describe('Workflow Authenticated user2', () => { - test.use({user: 'user2'}); - - test('workflow dispatch present', async ({page}) => { - await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); - - await expect(page.getByText(workflow_trigger_notification_text)).toBeVisible(); - - const run_workflow_btn = page.locator('#workflow_dispatch_dropdown>button'); - await expect(run_workflow_btn).toBeVisible(); - - const menu = page.locator('#workflow_dispatch_dropdown>.menu'); - await expect(menu).toBeHidden(); - await run_workflow_btn.click(); - await expect(menu).toBeVisible(); - await save_visual(page); - }); - - test('dispatch error: missing inputs', async ({page}, testInfo) => { - test.skip(testInfo.project.name === 'Mobile Safari', 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383'); - - await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); - - await page.locator('#workflow_dispatch_dropdown>button').click(); - - // Remove the required attribute so we can trigger the error message! - await page.evaluate(() => { - const elem = document.querySelector('input[name="inputs[string2]"]'); - elem?.removeAttribute('required'); - }); - - await page.locator('#workflow-dispatch-submit').click(); - - await expect(page.getByText('Require value for input "String w/o. default".')).toBeVisible(); - await save_visual(page); - }); - - test('dispatch success', async ({page}, testInfo) => { - test.skip(testInfo.project.name === 'Mobile Safari', 'Flaky behaviour on mobile safari; see https://codeberg.org/forgejo/forgejo/pulls/3334#issuecomment-2033383'); - await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); - - await page.locator('#workflow_dispatch_dropdown>button').click(); - - await page.fill('input[name="inputs[string2]"]', 'abc'); - await save_visual(page); - await page.locator('#workflow-dispatch-submit').click(); - - await expect(page.getByText('Workflow run was successfully requested.')).toBeVisible(); - - await expect(page.locator('.run-list>:first-child .run-list-meta', {hasText: 'now'})).toBeVisible(); - await save_visual(page); - }); -}); - -test('workflow dispatch box not available for unauthenticated users', async ({page}) => { - await page.goto('/user2/test_workflows/actions?workflow=test-dispatch.yml&actor=0&status=0'); - - await expect(page.locator('body')).not.toContainText(workflow_trigger_notification_text); - await save_visual(page); -}); diff --git a/tests/e2e/changes.go b/tests/e2e/changes.go deleted file mode 100644 index d1d318fd06..0000000000 --- a/tests/e2e/changes.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package e2e - -import ( - "bufio" - "os" - "strings" - - "forgejo.org/modules/log" - - "github.com/gobwas/glob" -) - -var ( - changesetFiles []string - changesetAvailable bool - globalFullRun bool -) - -func initChangedFiles() { - var changes string - changes, changesetAvailable = os.LookupEnv("CHANGED_FILES") - // the output of the Action seems to actually contain \n and not a newline literal - changesetFiles = strings.Split(changes, `\n`) - log.Info("Only running tests covered by a subset of test files. Received the following list of CHANGED_FILES: %q", changesetFiles) - - globalPatterns := []string{ - // meta and config - "Makefile", - "playwright.config.ts", - ".forgejo/workflows/testing.yml", - "tests/e2e/*.go", - "tests/e2e/shared/*", - // frontend files - "web_src/js/{index,utils}.*", - "web_src/css/{base,index}.css", - // templates and helpers - "templates/base/**", - "modules/templates/**", - } - fullRunPatterns := []glob.Glob{} - for _, expr := range globalPatterns { - fullRunPatterns = append(fullRunPatterns, glob.MustCompile(expr, '.', '/')) - } - globalFullRun = false - for _, changedFile := range changesetFiles { - for _, pattern := range fullRunPatterns { - if pattern.Match(changedFile) { - globalFullRun = true - log.Info("Changed files match global test pattern, running all tests") - return - } - } - } -} - -func canSkipTest(testFile string) bool { - // run all tests when environment variable is not set or changes match global pattern - if !changesetAvailable || globalFullRun { - return false - } - - for _, changedFile := range changesetFiles { - if strings.HasSuffix(testFile, changedFile) { - return false - } - for _, pattern := range getWatchPatterns(testFile) { - if pattern.Match(changedFile) { - return false - } - } - } - return true -} - -func getWatchPatterns(filename string) []glob.Glob { - file, err := os.Open(filename) - if err != nil { - log.Fatal(err.Error()) - } - defer file.Close() - scanner := bufio.NewScanner(file) - - watchSection := false - patterns := []glob.Glob{} - for scanner.Scan() { - line := scanner.Text() - // check for watch block - if strings.HasPrefix(line, "// @watch") { - if watchSection { - break - } - watchSection = true - } - if !watchSection { - continue - } - - line = strings.TrimPrefix(line, "// ") - if line != "" { - globPattern, err := glob.Compile(line, '.', '/') - if err != nil { - log.Fatal("Invalid glob pattern '%s' (skipped): %v", line, err) - } - patterns = append(patterns, globPattern) - } - } - // if no watch block in file - if !watchSection { - patterns = append(patterns, glob.MustCompile("*")) - } - return patterns -} diff --git a/tests/e2e/clipboard-copy.test.e2e.ts b/tests/e2e/clipboard-copy.test.e2e.ts deleted file mode 100644 index 2517d07463..0000000000 --- a/tests/e2e/clipboard-copy.test.e2e.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -// @watch start -// templates/repo/home.tmpl -// templates/repo/diff/box.tmpl -// web_src/js/features/clipboard.js -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test('copy src file path to clipboard', async ({page}, workerInfo) => { - test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'Apple clipboard API addon - starting at just $499!'); - - const response = await page.goto('/user2/repo1/src/branch/master/README.md'); - expect(response?.status()).toBe(200); - - await page.click('[data-clipboard-text]'); - const clipboardText = await page.evaluate(() => navigator.clipboard.readText()); - expect(clipboardText).toContain('README.md'); - await expect(page.getByText('Copied')).toBeVisible(); - await save_visual(page); -}); - -test('copy diff file path to clipboard', async ({page}, workerInfo) => { - test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'Apple clipboard API addon - starting at just $499!'); - - const response = await page.goto('/user2/repo1/src/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d/README.md'); - expect(response?.status()).toBe(200); - - await page.click('[data-clipboard-text]'); - const clipboardText = await page.evaluate(() => navigator.clipboard.readText()); - expect(clipboardText).toContain('README.md'); - await expect(page.getByText('Copied')).toBeVisible(); - await save_visual(page); -}); diff --git a/tests/e2e/commit-graph-branch-selector.test.e2e.js b/tests/e2e/commit-graph-branch-selector.test.e2e.js new file mode 100644 index 0000000000..db849320b9 --- /dev/null +++ b/tests/e2e/commit-graph-branch-selector.test.e2e.js @@ -0,0 +1,25 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('Switch branch', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const response = await page.goto('/user2/repo1/graph'); + await expect(response?.status()).toBe(200); + + await page.click('#flow-select-refs-dropdown'); + const input = page.locator('#flow-select-refs-dropdown'); + await input.pressSequentially('develop', {delay: 50}); + await input.press('Enter'); + + await page.waitForLoadState('networkidle'); + + await expect(page.locator('#loading-indicator')).toBeHidden(); + await expect(page.locator('#rel-container')).toBeVisible(); + await expect(page.locator('#rev-container')).toBeVisible(); +}); diff --git a/tests/e2e/dashboard-ci-status.test.e2e.js b/tests/e2e/dashboard-ci-status.test.e2e.js new file mode 100644 index 0000000000..1ff68b6334 --- /dev/null +++ b/tests/e2e/dashboard-ci-status.test.e2e.js @@ -0,0 +1,21 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('Correct link and tooltip', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const response = await page.goto('/?repo-search-query=test_workflows'); + await expect(response?.status()).toBe(200); + + await page.waitForLoadState('networkidle'); + + const repoStatus = page.locator('.dashboard-repos .repo-owner-name-list > li:nth-child(1) > a:nth-child(2)'); + + await expect(repoStatus).toHaveAttribute('href', '/user2/test_workflows/actions', {timeout: 10000}); + await expect(repoStatus).toHaveAttribute('data-tooltip-content', 'Failure'); +}); diff --git a/tests/e2e/dashboard-ci-status.test.e2e.ts b/tests/e2e/dashboard-ci-status.test.e2e.ts deleted file mode 100644 index d35fe299ff..0000000000 --- a/tests/e2e/dashboard-ci-status.test.e2e.ts +++ /dev/null @@ -1,28 +0,0 @@ -// @watch start -// web_src/js/components/DashboardRepoList.vue -// @watch end - -import {expect} from '@playwright/test'; -import {test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test.describe.configure({retries: 2}); - -test('Correct link and tooltip', async ({page}, testInfo) => { - if (testInfo.retry) { - await page.goto('/user2/test_workflows/actions'); - } - - const searchResponse = page.waitForResponse((resp) => resp.url().includes('/repo/search?') && resp.status() === 200); - const response = await page.goto('/?repo-search-query=test_workflows'); - expect(response?.status()).toBe(200); - - await searchResponse; - - const repoStatus = page.locator('.dashboard-repos .repo-owner-name-list > li:nth-child(1) > a:nth-child(2)'); - await expect(repoStatus).toHaveAttribute('href', '/user2/test_workflows/actions', {timeout: 10000}); - await expect(repoStatus).toHaveAttribute('data-tooltip-content', /^(Error|Failure)$/); - // ToDo: Ensure stable screenshot of dashboard. Known to be flaky: https://code.forgejo.org/forgejo/visual-browser-testing/commit/206d4cfb7a4af6d8d7043026cdd4d63708798b2a - // await save_visual(page); -}); diff --git a/tests/e2e/debugserver_test.go b/tests/e2e/debugserver_test.go index 8742790b14..49461fabe5 100644 --- a/tests/e2e/debugserver_test.go +++ b/tests/e2e/debugserver_test.go @@ -17,7 +17,7 @@ import ( "syscall" "testing" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/setting" ) func TestDebugserver(t *testing.T) { diff --git a/tests/e2e/declare_repos_test.go b/tests/e2e/declare_repos_test.go index f45687651c..7057b26b6f 100644 --- a/tests/e2e/declare_repos_test.go +++ b/tests/e2e/declare_repos_test.go @@ -5,17 +5,17 @@ package e2e import ( "fmt" + "strconv" "strings" "testing" "time" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/indexer/stats" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + unit_model "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/git" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -23,35 +23,14 @@ import ( // first entry represents filename // the following entries define the full file content over time -type FileChanges struct { - Filename string - CommitMsg string - Versions []string -} +type FileChanges [][]string // put your Git repo declarations in here // feel free to amend the helper function below or use the raw variant directly func DeclareGitRepos(t *testing.T) func() { cleanupFunctions := []func(){ - newRepo(t, 2, "diff-test", []FileChanges{{ - Filename: "testfile", - Versions: []string{"hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"}, - }}), - newRepo(t, 2, "language-stats-test", []FileChanges{{ - Filename: "main.rs", - Versions: []string{"fn main() {", "println!(\"Hello World!\");", "}"}, - }}), - newRepo(t, 2, "mentions-highlighted", []FileChanges{ - { - Filename: "history1.md", - Versions: []string{""}, - CommitMsg: "A commit message which mentions @user2 in the title\nand has some additional text which mentions @user1", - }, - { - Filename: "history2.md", - Versions: []string{""}, - CommitMsg: "Another commit which mentions @user1 in the title\nand @user2 in the text", - }, + newRepo(t, 2, "diff-test", FileChanges{ + {"testfile", "hello", "hallo", "hola", "native", "ubuntu-latest", "- runs-on: ubuntu-latest", "- runs-on: debian-latest"}, }), // add your repo declarations here } @@ -63,7 +42,7 @@ func DeclareGitRepos(t *testing.T) func() { } } -func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChanges) func() { +func newRepo(t *testing.T, userID int64, repoName string, fileChanges FileChanges) func() { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: userID}) somerepo, _, cleanupFunc := tests.CreateDeclarativeRepo(t, user, repoName, []unit_model.Type{unit_model.TypeCode, unit_model.TypeIssues}, nil, @@ -71,25 +50,19 @@ func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChan ) for _, file := range fileChanges { - for i, version := range file.Versions { - operation := "update" - if i == 0 { - operation = "create" + changeLen := len(file) + for i := 1; i < changeLen; i++ { + operation := "create" + if i != 1 { + operation = "update" } - - // default to unique commit messages - commitMsg := file.CommitMsg - if commitMsg == "" { - commitMsg = fmt.Sprintf("Patch: %s-%d", file.Filename, i+1) - } - resp, err := files_service.ChangeRepoFiles(git.DefaultContext, somerepo, user, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{{ Operation: operation, - TreePath: file.Filename, - ContentReader: strings.NewReader(version), + TreePath: file[0], + ContentReader: strings.NewReader(file[i]), }}, - Message: commitMsg, + Message: fmt.Sprintf("Patch: %s-%s", file[0], strconv.Itoa(i)), OldBranch: "main", NewBranch: "main", Author: &files_service.IdentityOptions{ @@ -110,8 +83,5 @@ func newRepo(t *testing.T, userID int64, repoName string, fileChanges []FileChan } } - err := stats.UpdateRepoIndexer(somerepo) - require.NoError(t, err) - return cleanupFunc } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 1961a4b68a..44a6897bf4 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -8,6 +8,7 @@ package e2e import ( + "bytes" "context" "fmt" "net/url" @@ -16,15 +17,15 @@ import ( "path/filepath" "testing" - "forgejo.org/models/unittest" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/testlogger" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/testlogger" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" ) var testE2eWebRoutes *web.Route @@ -37,15 +38,18 @@ func TestMain(m *testing.M) { defer cancel() tests.InitTest(true) - setting.Quota.Enabled = true - initChangedFiles() testE2eWebRoutes = routers.NormalRoutes() + 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") + err := unittest.InitFixtures( unittest.FixturesOptions{ - Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), - Base: setting.AppWorkPath, - Dirs: []string{"tests/e2e/fixtures/"}, + Dir: filepath.Join(filepath.Dir(setting.AppPath), "models/fixtures/"), }, ) if err != nil { @@ -73,7 +77,7 @@ func TestMain(m *testing.M) { // TestE2e should be the only test e2e necessary. It will collect all "*.test.e2e.js" files in this directory and build a test for each. func TestE2e(t *testing.T) { // Find the paths of all e2e test files in test directory. - searchGlob := filepath.Join(filepath.Dir(setting.AppPath), "tests", "e2e", "*.test.e2e.ts") + searchGlob := filepath.Join(filepath.Dir(setting.AppPath), "tests", "e2e", "*.test.e2e.js") paths, err := filepath.Glob(searchGlob) if err != nil { t.Fatal(err) @@ -83,7 +87,6 @@ func TestE2e(t *testing.T) { runArgs := []string{"npx", "playwright", "test"} - _, testVisual := os.LookupEnv("VISUAL_TEST") // To update snapshot outputs if _, set := os.LookupEnv("ACCEPT_VISUAL"); set { runArgs = append(runArgs, "--update-snapshots") @@ -97,32 +100,29 @@ func TestE2e(t *testing.T) { _, filename := filepath.Split(path) testname := filename[:len(filename)-len(filepath.Ext(path))] - if canSkipTest(path) { - fmt.Printf("No related changes for test, skipping: %s\n", filename) - continue - } - t.Run(testname, func(t *testing.T) { // Default 2 minute timeout onForgejoRun(t, func(*testing.T, *url.URL) { defer DeclareGitRepos(t)() thisTest := runArgs - // when all tests are run, use unique artifacts directories per test to preserve artifacts from other tests - if testVisual { - thisTest = append(thisTest, "--output=tests/e2e/test-artifacts/"+testname) - } thisTest = append(thisTest, path) cmd := exec.Command(runArgs[0], thisTest...) cmd.Env = os.Environ() cmd.Env = append(cmd.Env, fmt.Sprintf("GITEA_URL=%s", setting.AppURL)) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr err := cmd.Run() - if err != nil && !testVisual { + if err != nil { + // Currently colored output is conflicting. Using Printf until that is resolved. + fmt.Printf("%v", stdout.String()) + fmt.Printf("%v", stderr.String()) log.Fatal("Playwright Failed: %s", err) } + + fmt.Printf("%v", stdout.String()) }) }) } diff --git a/tests/e2e/example.test.e2e.ts b/tests/e2e/example.test.e2e.js similarity index 71% rename from tests/e2e/example.test.e2e.ts rename to tests/e2e/example.test.e2e.js index 97c5b8684b..86abdf685e 100644 --- a/tests/e2e/example.test.e2e.ts +++ b/tests/e2e/example.test.e2e.js @@ -1,32 +1,32 @@ -// @watch start -// templates/user/auth/** -// web_src/js/features/user-** -// modules/{user,auth}/** -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test, login_user, save_visual} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); test('Load Homepage', async ({page}) => { const response = await page.goto('/'); - expect(response?.status()).toBe(200); // Status OK + await expect(response?.status()).toBe(200); // Status OK await expect(page).toHaveTitle(/^Forgejo: Beyond coding. We Forge.\s*$/); await expect(page.locator('.logo')).toHaveAttribute('src', '/assets/img/logo.svg'); }); test('Register Form', async ({page}, workerInfo) => { const response = await page.goto('/user/sign_up'); - expect(response?.status()).toBe(200); // Status OK - await page.fill('input[name=user_name]', `e2e-test-${workerInfo.workerIndex}`); - await page.fill('input[name=email]', `e2e-test-${workerInfo.workerIndex}@test.com`); - await page.fill('input[name=password]', 'test123test123'); - await page.fill('input[name=retype]', 'test123test123'); + await expect(response?.status()).toBe(200); // Status OK + await page.type('input[name=user_name]', `e2e-test-${workerInfo.workerIndex}`); + await page.type('input[name=email]', `e2e-test-${workerInfo.workerIndex}@test.com`); + await page.type('input[name=password]', 'test123test123'); + await page.type('input[name=retype]', 'test123test123'); await page.click('form button.ui.primary.button:visible'); // Make sure we routed to the home page. Else login failed. - expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`); + await expect(page.url()).toBe(`${workerInfo.project.use.baseURL}/`); await expect(page.locator('.secondary-nav span>img.ui.avatar')).toBeVisible(); await expect(page.locator('.ui.positive.message.flash-success')).toHaveText('Account was successfully created. Welcome!'); - await save_visual(page); + + save_visual(page); }); // eslint-disable-next-line playwright/no-skipped-test diff --git a/tests/e2e/explore.test.e2e.ts b/tests/e2e/explore.test.e2e.js similarity index 85% rename from tests/e2e/explore.test.e2e.ts rename to tests/e2e/explore.test.e2e.js index 1bb5af3cc6..9603443b35 100644 --- a/tests/e2e/explore.test.e2e.ts +++ b/tests/e2e/explore.test.e2e.js @@ -1,13 +1,8 @@ +// @ts-check // document is a global in evaluate, so it's safe to ignore here // eslint playwright/no-conditional-in-test: 0 - -// @watch start -// templates/explore/** -// web_src/modules/fomantic/** -// @watch end - import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test} from './utils_e2e.js'; test('Explore view taborder', async ({page}) => { await page.goto('/explore/repos'); @@ -41,6 +36,5 @@ test('Explore view taborder', async ({page}) => { break; } } - expect(res).toBe(exp); - await save_visual(page); + await expect(res).toBe(exp); }); diff --git a/tests/e2e/fixtures/attachment.yml b/tests/e2e/fixtures/attachment.yml deleted file mode 100644 index 26069b95c1..0000000000 --- a/tests/e2e/fixtures/attachment.yml +++ /dev/null @@ -1,12 +0,0 @@ -- - id: 1001 - uuid: 5792c349-8a26-46b8-b4cd-2c290f118285 - repo_id: 1 - issue_id: 1 - release_id: 0 - uploader_id: 3 - comment_id: 1 - name: forgejo-secrets.txt - download_count: 0 - size: 536870911 - created_unix: 1730000000 diff --git a/tests/e2e/fixtures/comment.yml b/tests/e2e/fixtures/comment.yml deleted file mode 100644 index f3f8a2d8e8..0000000000 --- a/tests/e2e/fixtures/comment.yml +++ /dev/null @@ -1,22 +0,0 @@ -- - id: 1001 - type: 0 # comment - poster_id: 2 - issue_id: 1 # in repo_id 1 - content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:" - created_unix: 946684811 - updated_unix: 946684811 - content_version: 1 - -- - id: 1002 - type: 21 # code comment - poster_id: 2 - issue_id: 19 - content: "## Lorem Ipsum\nI would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) $e^{\\pi i} + 1 = 0$\n$$e^{\\pi i} + 1 = 0$$\n#1\n```js\nconsole.log('evil')\nalert('evil')\n```\n:+1: :100:" - review_id: 1001 - line: 1 - tree_path: "test1.txt" - created_unix: 946684812 - invalidated: false - content_version: 1 diff --git a/tests/e2e/fixtures/quota_group.yml b/tests/e2e/fixtures/quota_group.yml deleted file mode 100644 index 0d04ba6767..0000000000 --- a/tests/e2e/fixtures/quota_group.yml +++ /dev/null @@ -1 +0,0 @@ -- name: trusted-user diff --git a/tests/e2e/fixtures/quota_group_mapping.yml b/tests/e2e/fixtures/quota_group_mapping.yml deleted file mode 100644 index 8339569185..0000000000 --- a/tests/e2e/fixtures/quota_group_mapping.yml +++ /dev/null @@ -1,5 +0,0 @@ -- - id: 1001 - kind: 0 - mapped_id: 2 - group_name: trusted-user diff --git a/tests/e2e/fixtures/quota_group_rule_mapping.yml b/tests/e2e/fixtures/quota_group_rule_mapping.yml deleted file mode 100644 index 1144888f21..0000000000 --- a/tests/e2e/fixtures/quota_group_rule_mapping.yml +++ /dev/null @@ -1,14 +0,0 @@ -- - id: 1001 - group_name: trusted-user - rule_name: git-lfs - -- - id: 1002 - group_name: trusted-user - rule_name: "all:assets" - -- - id: 1003 - group_name: trusted-user - rule_name: "Multi subjects" diff --git a/tests/e2e/fixtures/quota_rule.yml b/tests/e2e/fixtures/quota_rule.yml deleted file mode 100644 index f6170cbdaa..0000000000 --- a/tests/e2e/fixtures/quota_rule.yml +++ /dev/null @@ -1,13 +0,0 @@ -- - name: git-lfs - limit: 512 - subjects: [6] - -- - name: "all:assets" - limit: -1 - subjects: [7] - -- name: "Multi subjects" - limit: 5000000000 - subjects: [8,6] diff --git a/tests/e2e/fixtures/repository.yml b/tests/e2e/fixtures/repository.yml deleted file mode 100644 index ac87721d6a..0000000000 --- a/tests/e2e/fixtures/repository.yml +++ /dev/null @@ -1,12 +0,0 @@ -- - id: 1001 - owner_id: 2 - owner_name: user2 - lower_name: large-lfs - name: large-lfs - default_branch: main - is_empty: false - is_archived: false - is_private: true - status: 0 - lfs_size: 8192 diff --git a/tests/e2e/fixtures/review.yml b/tests/e2e/fixtures/review.yml deleted file mode 100644 index 0892c54e55..0000000000 --- a/tests/e2e/fixtures/review.yml +++ /dev/null @@ -1,8 +0,0 @@ -- - id: 1001 - type: 22 - reviewer_id: 1 - issue_id: 2 - content: "Review Comment" - updated_unix: 946684810 - created_unix: 946684810 diff --git a/tests/e2e/git-notes.test.e2e.ts b/tests/e2e/git-notes.test.e2e.ts deleted file mode 100644 index 1e2cbe76fc..0000000000 --- a/tests/e2e/git-notes.test.e2e.ts +++ /dev/null @@ -1,30 +0,0 @@ -// @ts-check -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test('Change git note', async ({page}) => { - let response = await page.goto('/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d'); - expect(response?.status()).toBe(200); - - // An add button should not be present, because the commit already has a commit note - await expect(page.locator('#commit-notes-add-button')).toHaveCount(0); - - await page.locator('#commit-notes-edit-button').click(); - - let textarea = page.locator('textarea[name="notes"]'); - await expect(textarea).toBeVisible(); - await textarea.fill('This is a new note'); - await save_visual(page); - - await page.locator('#notes-save-button').click(); - await save_visual(page); - - response = await page.goto('/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d'); - expect(response?.status()).toBe(200); - - textarea = page.locator('textarea[name="notes"]'); - await expect(textarea).toHaveText('This is a new note'); - await save_visual(page); -}); diff --git a/tests/e2e/issue-comment.test.e2e.js b/tests/e2e/issue-comment.test.e2e.js new file mode 100644 index 0000000000..ee2e3a4c89 --- /dev/null +++ b/tests/e2e/issue-comment.test.e2e.js @@ -0,0 +1,63 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, login} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('Hyperlink paste behaviour', async ({browser}, workerInfo) => { + test.skip(['Mobile Safari', 'Mobile Chrome', 'webkit'].includes(workerInfo.project.name), 'Mobile clients seem to have very weird behaviour with this test, which I cannot confirm with real usage'); + const page = await login({browser}, workerInfo); + await page.goto('/user2/repo1/issues/new'); + await page.locator('textarea').click(); + // same URL + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor'); + await page.locator('textarea').press('Shift+Home'); + await page.locator('textarea').press('ControlOrMeta+c'); + await page.locator('textarea').press('ControlOrMeta+v'); + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); + // other text + await page.locator('textarea').fill('Some other text'); + await page.locator('textarea').press('ControlOrMeta+a'); + await page.locator('textarea').press('ControlOrMeta+v'); + await expect(page.locator('textarea')).toHaveValue('[Some other text](https://codeberg.org/forgejo/forgejo#some-anchor)'); + // subset of URL + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some'); + await page.locator('textarea').press('ControlOrMeta+a'); + await page.locator('textarea').press('ControlOrMeta+v'); + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); + // superset of URL + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor-on-the-page'); + await page.locator('textarea').press('ControlOrMeta+a'); + await page.locator('textarea').press('ControlOrMeta+v'); + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); + // completely separate URL + await page.locator('textarea').fill('http://example.com'); + await page.locator('textarea').press('ControlOrMeta+a'); + await page.locator('textarea').press('ControlOrMeta+v'); + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); +}); + +test('Always focus edit tab first on edit', async ({browser}, workerInfo) => { + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/issues/1'); + await expect(response?.status()).toBe(200); + + // Switch to preview tab and save + await page.click('#issue-1 .comment-container .context-menu'); + await page.click('#issue-1 .comment-container .menu>.edit-content'); + await page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]').click(); + await page.click('#issue-1 .comment-container .save'); + + await page.waitForLoadState('networkidle'); + + // Edit again and assert that edit tab should be active (and not preview tab) + await page.click('#issue-1 .comment-container .context-menu'); + await page.click('#issue-1 .comment-container .menu>.edit-content'); + const editTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-writer]'); + const previewTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]'); + + await expect(editTab).toHaveClass(/active/); + await expect(previewTab).not.toHaveClass(/active/); +}); diff --git a/tests/e2e/issue-comment.test.e2e.ts b/tests/e2e/issue-comment.test.e2e.ts deleted file mode 100644 index d2dbafafd0..0000000000 --- a/tests/e2e/issue-comment.test.e2e.ts +++ /dev/null @@ -1,203 +0,0 @@ -// @watch start -// web_src/js/features/comp/** -// web_src/js/features/repo-** -// templates/repo/issue/view_content/* -// @watch end - -import {expect} from '@playwright/test'; -import {test, save_visual} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test('Menu accessibility', async ({page}) => { - await page.goto('/user2/repo1/issues/1'); - await expect(page.getByLabel('user2 reacted eyes. Remove eyes')).toBeVisible(); - await expect(page.getByLabel('reacted laugh. Remove laugh')).toBeVisible(); - await expect(page.locator('#issue-1').getByLabel('Comment menu')).toBeVisible(); - await expect(page.locator('#issue-1').getByRole('heading').getByLabel('Add reaction')).toBeVisible(); - page.getByLabel('reacted laugh. Remove').click(); - await expect(page.getByLabel('user1 reacted laugh. Add laugh')).toBeVisible(); - page.getByLabel('user1 reacted laugh.').click(); - await expect(page.getByLabel('user1, user2 reacted laugh. Remove laugh')).toBeVisible(); -}); - -test('Hyperlink paste behaviour', async ({page}, workerInfo) => { - test.skip(['Mobile Safari', 'Mobile Chrome', 'webkit'].includes(workerInfo.project.name), 'Mobile clients seem to have very weird behaviour with this test, which I cannot confirm with real usage'); - await page.goto('/user2/repo1/issues/new'); - await page.locator('textarea').click(); - // same URL - await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor'); - await page.locator('textarea').press('Shift+Home'); - await page.locator('textarea').press('ControlOrMeta+c'); - await page.locator('textarea').press('ControlOrMeta+v'); - await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); - // other text - await page.locator('textarea').fill('Some other text'); - await page.locator('textarea').press('ControlOrMeta+a'); - await page.locator('textarea').press('ControlOrMeta+v'); - await expect(page.locator('textarea')).toHaveValue('[Some other text](https://codeberg.org/forgejo/forgejo#some-anchor)'); - // subset of URL - await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some'); - await page.locator('textarea').press('ControlOrMeta+a'); - await page.locator('textarea').press('ControlOrMeta+v'); - await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); - // superset of URL - await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor-on-the-page'); - await page.locator('textarea').press('ControlOrMeta+a'); - await page.locator('textarea').press('ControlOrMeta+v'); - await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); - // completely separate URL - await page.locator('textarea').fill('http://example.com'); - await page.locator('textarea').press('ControlOrMeta+a'); - await page.locator('textarea').press('ControlOrMeta+v'); - await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); - await page.locator('textarea').fill(''); -}); - -test('Always focus edit tab first on edit', async ({page}) => { - const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); - - // Switch to preview tab and save - await page.click('#issue-1 .comment-container .context-menu'); - await page.click('#issue-1 .comment-container .menu>.edit-content'); - await page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]').click(); - await page.click('#issue-1 .comment-container .save'); - - await page.waitForLoadState(); - - // Edit again and assert that edit tab should be active (and not preview tab) - await page.click('#issue-1 .comment-container .context-menu'); - await page.click('#issue-1 .comment-container .menu>.edit-content'); - const editTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-writer]'); - const previewTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]'); - - await expect(editTab).toHaveClass(/active/); - await expect(previewTab).not.toHaveClass(/active/); - await save_visual(page); -}); - -test('Reset content of comment edit field on cancel', async ({page}) => { - const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); - - const editorTextarea = page.locator('[id="_combo_markdown_editor_1"]'); - - // Change the content of the edit field - await page.click('#issue-1 .comment-container .context-menu'); - await page.click('#issue-1 .comment-container .menu>.edit-content'); - await expect(editorTextarea).toHaveValue('content for the first issue'); - await editorTextarea.fill('some random string'); - await expect(editorTextarea).toHaveValue('some random string'); - await page.click('#issue-1 .comment-container .edit .cancel'); - - // Edit again and assert that the edit field should be reset to the initial content - await page.click('#issue-1 .comment-container .context-menu'); - await page.click('#issue-1 .comment-container .menu>.edit-content'); - await expect(editorTextarea).toHaveValue('content for the first issue'); - await save_visual(page); -}); - -test('Quote reply', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name !== 'firefox', 'Uses Firefox specific selection quirks'); - const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); - - const editorTextarea = page.locator('textarea.markdown-text-editor'); - - // Full quote. - await page.click('#issuecomment-1001 .comment-container .context-menu'); - await page.click('#issuecomment-1001 .quote-reply'); - - await expect(editorTextarea).toHaveValue('@user2 wrote in http://localhost:3003/user2/repo1/issues/1#issuecomment-1001:\n\n' + - '> ## [](#lorem-ipsum)Lorem Ipsum\n' + - '> \n' + - '> I would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) \\(e^{\\pi i} + 1 = 0\\)\n' + - '> \n' + - '> \\[e^{\\pi i} + 1 = 0\\]\n' + - '> \n' + - '> #1\n' + - '> \n' + - '> ```js\n' + - "> console.log('evil')\n" + - "> alert('evil')\n" + - '> ```\n' + - '> \n' + - '> :+1: :100:\n\n'); - - await editorTextarea.fill(''); - - // Partial quote. - await page.click('#issuecomment-1001 .comment-container .context-menu'); - - await page.evaluate(() => { - const range = new Range(); - range.setStart(document.querySelector('#issuecomment-1001-content #user-content-lorem-ipsum').childNodes[1], 6); - range.setEnd(document.querySelector('#issuecomment-1001-content p').childNodes[1].childNodes[0], 7); - - const selection = window.getSelection(); - - // Add range to window selection - selection.addRange(range); - }); - - await page.click('#issuecomment-1001 .quote-reply'); - - await expect(editorTextarea).toHaveValue('@user2 wrote in http://localhost:3003/user2/repo1/issues/1#issuecomment-1001:\n\n' + - '> ## Ipsum\n' + - '> \n' + - '> I would like to say that **I am no**\n\n'); - - await editorTextarea.fill(''); - - // Another partial quote. - await page.click('#issuecomment-1001 .comment-container .context-menu'); - - await page.evaluate(() => { - const range = new Range(); - range.setStart(document.querySelector('#issuecomment-1001-content p').childNodes[1].childNodes[0], 7); - range.setEnd(document.querySelector('#issuecomment-1001-content p').childNodes[7].childNodes[0], 3); - - const selection = window.getSelection(); - - // Add range to window selection - selection.addRange(range); - }); - - await page.click('#issuecomment-1001 .quote-reply'); - - await expect(editorTextarea).toHaveValue('@user2 wrote in http://localhost:3003/user2/repo1/issues/1#issuecomment-1001:\n\n' + - '> **t appealed** that it took _so long_ for this `feature` to be [cre](https://example.com)\n\n'); - - await editorTextarea.fill(''); -}); - -test('Pull quote reply', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name !== 'firefox', 'Uses Firefox specific selection quirks'); - const response = await page.goto('/user2/commitsonpr/pulls/1/files'); - expect(response?.status()).toBe(200); - - const editorTextarea = page.locator('form.comment-form textarea.markdown-text-editor'); - - // Full quote with no reply handler being open. - await page.click('.comment-code-cloud .context-menu'); - await page.click('.comment-code-cloud .quote-reply'); - - await expect(editorTextarea).toHaveValue('@user2 wrote in http://localhost:3003/user2/commitsonpr/pulls/1/files#issuecomment-1002:\n\n' + - '> ## [](#lorem-ipsum)Lorem Ipsum\n' + - '> \n' + - '> I would like to say that **I am not appealed** that it took _so long_ for this `feature` to be [created](https://example.com) \\(e^{\\pi i} + 1 = 0\\)\n' + - '> \n' + - '> \\[e^{\\pi i} + 1 = 0\\]\n' + - '> \n' + - '> #1\n' + - '> \n' + - '> ```js\n' + - "> console.log('evil')\n" + - "> alert('evil')\n" + - '> ```\n' + - '> \n' + - '> :+1: :100:\n\n'); - - await editorTextarea.fill(''); -}); diff --git a/tests/e2e/issue-sidebar.test.e2e.ts b/tests/e2e/issue-sidebar.test.e2e.js similarity index 56% rename from tests/e2e/issue-sidebar.test.e2e.ts rename to tests/e2e/issue-sidebar.test.e2e.js index fe2a6cec87..61d3281809 100644 --- a/tests/e2e/issue-sidebar.test.e2e.ts +++ b/tests/e2e/issue-sidebar.test.e2e.js @@ -1,150 +1,114 @@ -// @watch start -// templates/repo/issue/view_content/** -// web_src/css/repo/issue-** -// web_src/js/features/repo-issue** -// @watch end +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, login} from './utils_e2e.js'; -/* eslint playwright/expect-expect: ["error", { "assertFunctionNames": ["check_wip"] }] */ - -import {expect, type Page} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test.describe('Pull: Toggle WIP', () => { - const prTitle = 'pull5'; - - async function toggle_wip_to({page}, should: boolean) { - await page.waitForLoadState('domcontentloaded'); - if (should) { - await page.getByText('Still in progress?').click(); - } else { - await page.getByText('Ready for review?').click(); - } - } - - async function check_wip({page}, is: boolean) { - const elemTitle = 'h1'; - const stateLabel = '.issue-state-label'; - await page.waitForLoadState('domcontentloaded'); - await expect(page.locator(elemTitle)).toContainText(prTitle); - await expect(page.locator(elemTitle)).toContainText('#5'); - if (is) { - await expect(page.locator(elemTitle)).toContainText('WIP'); - await expect(page.locator(stateLabel)).toContainText('Draft'); - } else { - await expect(page.locator(elemTitle)).not.toContainText('WIP'); - await expect(page.locator(stateLabel)).toContainText('Open'); - } - } - - test.beforeEach(async ({page}) => { - const response = await page.goto('/user2/repo1/pulls/5'); - expect(response?.status()).toBe(200); // Status OK - // ensure original title - await page.locator('#issue-title-edit-show').click(); - await page.locator('#issue-title-editor input').fill(prTitle); - await page.getByText('Save').click(); - await check_wip({page}, false); - }); - - test('simple toggle', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); - await page.goto('/user2/repo1/pulls/5'); - // toggle to WIP - await toggle_wip_to({page}, true); - await check_wip({page}, true); - // remove WIP - await toggle_wip_to({page}, false); - await check_wip({page}, false); - }); - - test('manual edit', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); - await page.goto('/user2/repo1/pulls/5'); - // manually edit title to another prefix - await page.locator('#issue-title-edit-show').click(); - await page.locator('#issue-title-editor input').fill(`[WIP] ${prTitle}`); - await page.getByText('Save').click(); - await check_wip({page}, true); - // remove again - await toggle_wip_to({page}, false); - await check_wip({page}, false); - }); - - test('maximum title length', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); - await page.goto('/user2/repo1/pulls/5'); - // check maximum title length is handled gracefully - const maxLenStr = prTitle + 'a'.repeat(240); - await page.locator('#issue-title-edit-show').click(); - await page.locator('#issue-title-editor input').fill(maxLenStr); - await page.getByText('Save').click(); - await expect(page.locator('h1')).toContainText(maxLenStr); - await check_wip({page}, false); - await toggle_wip_to({page}, true); - await check_wip({page}, true); - await expect(page.locator('h1')).toContainText(maxLenStr); - await toggle_wip_to({page}, false); - await check_wip({page}, false); - await expect(page.locator('h1')).toContainText(maxLenStr); - }); +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); }); -test('Issue: Labels', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); +// belongs to test: Pull: Toggle WIP +const prTitle = 'pull5'; - async function submitLabels({page}: { page: Page }) { - const submitted = page.waitForResponse('/user2/repo1/issues/labels'); - await page.locator('textarea').first().click(); // close via unrelated element - await submitted; - await page.waitForLoadState(); +async function click_toggle_wip({page}) { + await page.locator('.toggle-wip>a').click(); + await page.waitForLoadState('networkidle'); +} + +async function check_wip({page}, is) { + const elemTitle = '#issue-title-display'; + const stateLabel = '.issue-state-label'; + await expect(page.locator(elemTitle)).toContainText(prTitle); + await expect(page.locator(elemTitle)).toContainText('#5'); + if (is) { + await expect(page.locator(elemTitle)).toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Draft'); + } else { + await expect(page.locator(elemTitle)).not.toContainText('WIP'); + await expect(page.locator(stateLabel)).toContainText('Open'); } +} +test('Pull: Toggle WIP', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/pulls/5'); + await expect(response?.status()).toBe(200); // Status OK + // initial state + await check_wip({page}, false); + // toggle to WIP + await click_toggle_wip({page}); + await check_wip({page}, true); + // remove WIP + await click_toggle_wip({page}); + await check_wip({page}, false); + + // manually edit title to another prefix + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(`[WIP] ${prTitle}`); + await page.getByText('Save').click(); + await page.waitForLoadState('networkidle'); + await check_wip({page}, true); + // remove again + await click_toggle_wip({page}); + await check_wip({page}, false); + // check maximum title length is handled gracefully + const maxLenStr = prTitle + 'a'.repeat(240); + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(maxLenStr); + await page.getByText('Save').click(); + await page.waitForLoadState('networkidle'); + await click_toggle_wip({page}); + await check_wip({page}, true); + await click_toggle_wip({page}); + await check_wip({page}, false); + await expect(page.locator('h1')).toContainText(maxLenStr); + // restore original title + await page.locator('#issue-title-edit-show').click(); + await page.locator('#issue-title-editor input').fill(prTitle); + await page.getByText('Save').click(); + await check_wip({page}, false); +}); + +test('Issue: Labels', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); // select label list in sidebar only const labelList = page.locator('.issue-content-right .labels-list a'); const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); - - // restore initial state - await page.locator('.select-label').click(); - const responsePromise = page.waitForResponse('/user2/repo1/issues/labels'); - await page.getByText('Clear labels').click(); - await responsePromise; - await expect(labelList.filter({hasText: 'label1'})).toBeHidden(); + await expect(response?.status()).toBe(200); + // preconditions + await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); await expect(labelList.filter({hasText: 'label2'})).toBeHidden(); - - // add both labels + // add label2 await page.locator('.select-label').click(); // label search could be tested this way: // await page.locator('.select-label input').fill('label2'); await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); - await page.locator('.select-label .item').filter({hasText: 'label1'}).click(); - await submitLabels({page}); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); await expect(labelList.filter({hasText: 'label2'})).toBeVisible(); - await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); - - // test removing label2 again - // due to a race condition, the page could still be "reloading", - // closing the dropdown after it was clicked. - // Retry the interaction as a group - // also see https://playwright.dev/docs/test-assertions#expecttopass - await expect(async () => { - await page.locator('.select-label').click(); - await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); - }).toPass(); - await submitLabels({page}); + // test removing label again + await page.locator('.select-label').click(); + await page.locator('.select-label .item').filter({hasText: 'label2'}).click(); + await page.locator('.select-label').click(); + await page.waitForLoadState('networkidle'); await expect(labelList.filter({hasText: 'label2'})).toBeHidden(); await expect(labelList.filter({hasText: 'label1'})).toBeVisible(); }); -test('Issue: Assignees', async ({page}, workerInfo) => { +test('Issue: Assignees', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); // select label list in sidebar only const assigneesList = page.locator('.issue-content-right .assignees.list .selected .item a'); const response = await page.goto('/org3/repo3/issues/1'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); + // preconditions + await expect(assigneesList.filter({hasText: 'user2'})).toBeVisible(); + await expect(assigneesList.filter({hasText: 'user4'})).toBeHidden(); + await expect(page.locator('.ui.assignees.list .item.no-select')).toBeHidden(); + // Clear all assignees await page.locator('.select-assignees-modify.dropdown').click(); await page.locator('.select-assignees-modify.dropdown .no-select.item').click(); @@ -175,13 +139,14 @@ test('Issue: Assignees', async ({page}, workerInfo) => { await expect(page.locator('.ui.assignees.list .item.no-select')).toBeHidden(); }); -test('New Issue: Assignees', async ({page}, workerInfo) => { +test('New Issue: Assignees', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); // select label list in sidebar only const assigneesList = page.locator('.issue-content-right .assignees.list .selected .item'); const response = await page.goto('/org3/repo3/issues/new'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); // preconditions await expect(page.locator('.ui.assignees.list .item.no-select')).toBeVisible(); await expect(assigneesList.filter({hasText: 'user2'})).toBeHidden(); @@ -189,13 +154,12 @@ test('New Issue: Assignees', async ({page}, workerInfo) => { // Assign other user (with searchbox) await page.locator('.select-assignees.dropdown').click(); - await page.fill('.select-assignees .menu .search input', 'user4'); + await page.type('.select-assignees .menu .search input', 'user4'); await expect(page.locator('.select-assignees .menu .item').filter({hasText: 'user2'})).toBeHidden(); await expect(page.locator('.select-assignees .menu .item').filter({hasText: 'user4'})).toBeVisible(); await page.locator('.select-assignees .menu .item').filter({hasText: 'user4'}).click(); await page.locator('.select-assignees.dropdown').click(); await expect(assigneesList.filter({hasText: 'user4'})).toBeVisible(); - await save_visual(page); // remove user4 await page.locator('.select-assignees.dropdown').click(); @@ -213,14 +177,14 @@ test('New Issue: Assignees', async ({page}, workerInfo) => { await page.fill('.select-assignees .menu .search input', ''); await page.locator('.select-assignees.dropdown .no-select.item').click(); await expect(page.locator('.select-assign-me')).toBeVisible(); - await save_visual(page); }); -test('Issue: Milestone', async ({page}, workerInfo) => { +test('Issue: Milestone', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); const selectedMilestone = page.locator('.issue-content-right .select-milestone.list'); const milestoneDropdown = page.locator('.issue-content-right .select-milestone.dropdown'); @@ -239,26 +203,24 @@ test('Issue: Milestone', async ({page}, workerInfo) => { await expect(page.locator('.timeline-item.event').last()).toContainText('user2 removed this from the milestone1 milestone'); }); -test('New Issue: Milestone', async ({page}, workerInfo) => { +test('New Issue: Milestone', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Unable to get tests working on Safari Mobile, see https://codeberg.org/forgejo/forgejo/pulls/3445#issuecomment-1789636'); + const page = await login({browser}, workerInfo); const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); const selectedMilestone = page.locator('.issue-content-right .select-milestone.list'); const milestoneDropdown = page.locator('.issue-content-right .select-milestone.dropdown'); await expect(selectedMilestone).toContainText('No milestone'); - await save_visual(page); // Add milestone. await milestoneDropdown.click(); await page.getByRole('option', {name: 'milestone1'}).click(); await expect(selectedMilestone).toContainText('milestone1'); - await save_visual(page); // Clear milestone. await milestoneDropdown.click(); await page.getByText('Clear milestone', {exact: true}).click(); await expect(selectedMilestone).toContainText('No milestone'); - await save_visual(page); }); diff --git a/tests/e2e/login.test.e2e.ts b/tests/e2e/login.test.e2e.ts deleted file mode 100644 index 1ffa0b2e5d..0000000000 --- a/tests/e2e/login.test.e2e.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -// @watch start -// templates/user/auth/** -// web_src/js/features/user-** -// web_src/js/features/common-global.js -// @watch end - -import {expect} from '@playwright/test'; -import {test, save_visual, test_context} from './utils_e2e.ts'; - -test('Mismatched ROOT_URL', async ({browser}) => { - const context = await test_context(browser); - const page = await context.newPage(); - - // Ugly hack to override the appUrl of `window.config`. - await page.addInitScript(() => { - setInterval(() => { - if (window.config) { - window.config.appUrl = 'https://example.com'; - } - }, 1); - }); - - const response = await page.goto('/user/login'); - expect(response?.status()).toBe(200); - - await save_visual(page); - const globalError = page.locator('.js-global-error'); - await expect(globalError).toContainText('This Forgejo instance is configured to be served on '); - await expect(globalError).toContainText('You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.'); -}); diff --git a/tests/e2e/markdown-editor.test.e2e.js b/tests/e2e/markdown-editor.test.e2e.js new file mode 100644 index 0000000000..4a3b414b10 --- /dev/null +++ b/tests/e2e/markdown-editor.test.e2e.js @@ -0,0 +1,177 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, load_logged_in_context, login_user} from './utils_e2e.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('markdown indentation', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + + const initText = `* first\n* second\n* third\n* last`; + + const page = await context.newPage(); + const response = await page.goto('/user2/repo1/issues/new'); + await expect(response?.status()).toBe(200); + + const textarea = page.locator('textarea[name=content]'); + const tab = ' '; + const indent = page.locator('button[data-md-action="indent"]'); + const unindent = page.locator('button[data-md-action="unindent"]'); + await textarea.fill(initText); + await textarea.click(); // Tab handling is disabled until pointer event or input. + + // Indent, then unindent first line + await textarea.focus(); + await textarea.evaluate((it) => it.setSelectionRange(0, 0)); + await indent.click(); + await expect(textarea).toHaveValue(`${tab}* first\n* second\n* third\n* last`); + await unindent.click(); + await expect(textarea).toHaveValue(initText); + + // Indent second line while somewhere inside of it + await textarea.focus(); + await textarea.press('ArrowDown'); + await textarea.press('ArrowRight'); + await textarea.press('ArrowRight'); + await indent.click(); + await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); + + // Subsequently, select a chunk of 2nd and 3rd line and indent both, preserving the cursor position in relation to text + await textarea.focus(); + await textarea.evaluate((it) => it.setSelectionRange(it.value.indexOf('cond'), it.value.indexOf('hird'))); + await indent.click(); + const lines23 = `* first\n${tab}${tab}* second\n${tab}* third\n* last`; + await expect(textarea).toHaveValue(lines23); + await expect(textarea).toHaveJSProperty('selectionStart', lines23.indexOf('cond')); + await expect(textarea).toHaveJSProperty('selectionEnd', lines23.indexOf('hird')); + + // Then unindent twice, erasing all indents. + await unindent.click(); + await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); + await unindent.click(); + await expect(textarea).toHaveValue(initText); + + // Indent and unindent with cursor at the end of the line + await textarea.focus(); + await textarea.evaluate((it) => it.setSelectionRange(it.value.indexOf('cond'), it.value.indexOf('cond'))); + await textarea.press('End'); + await indent.click(); + await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); + await unindent.click(); + await expect(textarea).toHaveValue(initText); + + // Check that Tab does work after input + await textarea.focus(); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Shift+Enter'); // Avoid triggering the prefix continuation feature + await textarea.pressSequentially('* least'); + await indent.click(); + await expect(textarea).toHaveValue(`* first\n* second\n* third\n* last\n${tab}* least`); + + // Check that partial indents are cleared + await textarea.focus(); + await textarea.fill(initText); + await textarea.evaluate((it) => it.setSelectionRange(it.value.indexOf('* second'), it.value.indexOf('* second'))); + await textarea.pressSequentially(' '); + await unindent.click(); + await expect(textarea).toHaveValue(initText); +}); + +test('markdown list continuation', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + + const initText = `* first\n* second\n* third\n* last`; + + const page = await context.newPage(); + const response = await page.goto('/user2/repo1/issues/new'); + await expect(response?.status()).toBe(200); + + const textarea = page.locator('textarea[name=content]'); + const tab = ' '; + const indent = page.locator('button[data-md-action="indent"]'); + await textarea.fill(initText); + + // Test continuation of '* ' prefix + await textarea.evaluate((it) => it.setSelectionRange(it.value.indexOf('cond'), it.value.indexOf('cond'))); + await textarea.press('End'); + await textarea.press('Enter'); + await textarea.pressSequentially('middle'); + await expect(textarea).toHaveValue(`* first\n* second\n* middle\n* third\n* last`); + + // Test continuation of ' * ' prefix + await indent.click(); + await textarea.press('Enter'); + await textarea.pressSequentially('muddle'); + await expect(textarea).toHaveValue(`* first\n* second\n${tab}* middle\n${tab}* muddle\n* third\n* last`); + + // Test breaking in the middle of a line + await textarea.evaluate((it) => it.setSelectionRange(it.value.lastIndexOf('ddle'), it.value.lastIndexOf('ddle'))); + await textarea.pressSequentially('tate'); + await textarea.press('Enter'); + await textarea.pressSequentially('me'); + await expect(textarea).toHaveValue(`* first\n* second\n${tab}* middle\n${tab}* mutate\n${tab}* meddle\n* third\n* last`); + + // Test not triggering when Shift held + await textarea.fill(initText); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Shift+Enter'); + await textarea.press('Enter'); + await textarea.pressSequentially('...but not least'); + await expect(textarea).toHaveValue(`* first\n* second\n* third\n* last\n\n...but not least`); + + // Test continuation of ordered list + await textarea.fill(`1. one\n2. two`); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Enter'); + await textarea.pressSequentially('three'); + await expect(textarea).toHaveValue(`1. one\n2. two\n3. three`); + + // Test continuation of alternative ordered list syntax + await textarea.fill(`1) one\n2) two`); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Enter'); + await textarea.pressSequentially('three'); + await expect(textarea).toHaveValue(`1) one\n2) two\n3) three`); + + // Test continuation of blockquote + await textarea.fill(`> knowledge is power`); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Enter'); + await textarea.pressSequentially('france is bacon'); + await expect(textarea).toHaveValue(`> knowledge is power\n> france is bacon`); + + // Test continuation of checklists + await textarea.fill(`- [ ] have a problem\n- [x] create a solution`); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Enter'); + await textarea.pressSequentially('write a test'); + await expect(textarea).toHaveValue(`- [ ] have a problem\n- [x] create a solution\n- [ ] write a test`); + + // Test all conceivable syntax (except ordered lists) + const prefixes = [ + '- ', // A space between the bullet and the content is required. + ' - ', // I have seen single space in front of -/* being used and even recommended, I think. + '* ', + '+ ', + ' ', + ' ', + ' - ', + '\t', + '\t\t* ', + '> ', + '> > ', + '- [ ] ', + '- [ ]', // This does seem to render, so allow. + '* [ ] ', + '+ [ ] ', + ]; + for (const prefix of prefixes) { + await textarea.fill(`${prefix}one`); + await textarea.evaluate((it) => it.setSelectionRange(it.value.length, it.value.length)); + await textarea.press('Enter'); + await textarea.pressSequentially('two'); + await expect(textarea).toHaveValue(`${prefix}one\n${prefix}two`); + } +}); diff --git a/tests/e2e/markdown-editor.test.e2e.ts b/tests/e2e/markdown-editor.test.e2e.ts deleted file mode 100644 index 39ced25bc3..0000000000 --- a/tests/e2e/markdown-editor.test.e2e.ts +++ /dev/null @@ -1,279 +0,0 @@ -// @watch start -// web_src/js/features/comp/ComboMarkdownEditor.js -// web_src/css/editor/combomarkdowneditor.css -// templates/shared/combomarkdowneditor.tmpl -// @watch end - -import {expect} from '@playwright/test'; -import {accessibilityCheck} from './shared/accessibility.ts'; -import {save_visual, test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test('Markdown image preview behaviour', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky behaviour on mobile safari;'); - - // Editing the root README.md file for image preview - const editPath = '/user2/repo1/src/branch/master/README.md'; - - const response = await page.goto(editPath, {waitUntil: 'domcontentloaded'}); - expect(response?.status()).toBe(200); - - // Click 'Edit file' tab - await page.locator('[data-tooltip-content="Edit file"]').click(); - - // This yields the monaco editor - const editor = page.getByRole('presentation').nth(0); - await editor.click(); - // Clear all the content - await page.keyboard.press('ControlOrMeta+KeyA'); - // Add the image - await page.keyboard.type('![Logo of Forgejo](./assets/logo.svg "Logo of Forgejo")'); - - // Click 'Preview' tab - await page.locator('a[data-tab="preview"]').click(); - - // Check for the image preview via the expected attribute - const preview = page.locator('div[data-tab="preview"] p[dir="auto"] a'); - await expect(preview).toHaveAttribute('href', 'http://localhost:3003/user2/repo1/media/branch/master/assets/logo.svg'); - await save_visual(page); -}); - -test('markdown indentation', async ({page}) => { - const initText = `* first\n* second\n* third\n* last`; - - const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); - - const textarea = page.locator('textarea[name=content]'); - const tab = ' '; - const indent = page.locator('button[data-md-action="indent"]'); - const unindent = page.locator('button[data-md-action="unindent"]'); - await textarea.fill(initText); - await textarea.click(); // Tab handling is disabled until pointer event or input. - - // Indent, then unindent first line - await textarea.focus(); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(0, 0)); - await indent.click(); - await expect(textarea).toHaveValue(`${tab}* first\n* second\n* third\n* last`); - await unindent.click(); - await expect(textarea).toHaveValue(initText); - - // Indent second line while somewhere inside of it - await textarea.focus(); - await textarea.press('ArrowDown'); - await textarea.press('ArrowRight'); - await textarea.press('ArrowRight'); - await indent.click(); - await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); - - // Subsequently, select a chunk of 2nd and 3rd line and indent both, preserving the cursor position in relation to text - await textarea.focus(); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.indexOf('cond'), it.value.indexOf('hird'))); - await indent.click(); - const lines23 = `* first\n${tab}${tab}* second\n${tab}* third\n* last`; - await expect(textarea).toHaveValue(lines23); - await expect(textarea).toHaveJSProperty('selectionStart', lines23.indexOf('cond')); - await expect(textarea).toHaveJSProperty('selectionEnd', lines23.indexOf('hird')); - - // Then unindent twice, erasing all indents. - await unindent.click(); - await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); - await unindent.click(); - await expect(textarea).toHaveValue(initText); - - // Indent and unindent with cursor at the end of the line - await textarea.focus(); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.indexOf('cond'), it.value.indexOf('cond'))); - await textarea.press('End'); - await indent.click(); - await expect(textarea).toHaveValue(`* first\n${tab}* second\n* third\n* last`); - await unindent.click(); - await expect(textarea).toHaveValue(initText); - - // Check that Tab does work after input - await textarea.focus(); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Shift+Enter'); // Avoid triggering the prefix continuation feature - await textarea.pressSequentially('* least'); - await indent.click(); - await expect(textarea).toHaveValue(`* first\n* second\n* third\n* last\n${tab}* least`); - - // Check that partial indents are cleared - await textarea.focus(); - await textarea.fill(initText); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.indexOf('* second'), it.value.indexOf('* second'))); - await textarea.pressSequentially(' '); - await unindent.click(); - await expect(textarea).toHaveValue(initText); -}); - -test('markdown list continuation', async ({page}) => { - const initText = `* first\n* second`; - - const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); - - const textarea = page.locator('textarea[name=content]'); - const tab = ' '; - const indent = page.locator('button[data-md-action="indent"]'); - await textarea.fill(initText); - - // Test continuation of ' * ' prefix - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.indexOf('rst'), it.value.indexOf('rst'))); - await indent.click(); - await textarea.press('End'); - await textarea.press('Enter'); - await textarea.pressSequentially('muddle'); - await expect(textarea).toHaveValue(`${tab}* first\n${tab}* muddle\n* second`); - - // Test breaking in the middle of a line - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.lastIndexOf('ddle'), it.value.lastIndexOf('ddle'))); - await textarea.pressSequentially('tate'); - await textarea.press('Enter'); - await textarea.pressSequentially('me'); - await expect(textarea).toHaveValue(`${tab}* first\n${tab}* mutate\n${tab}* meddle\n* second`); - - // Test not triggering when Shift held - await textarea.fill(initText); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Shift+Enter'); - await textarea.press('Enter'); - await textarea.pressSequentially('...but not least'); - await expect(textarea).toHaveValue(`* first\n* second\n\n...but not least`); - - // Test continuation of ordered list - await textarea.fill(`1. one`); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Enter'); - await textarea.pressSequentially(' '); - await textarea.press('Enter'); - await textarea.pressSequentially('three'); - await textarea.press('Enter'); - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`1. one\n2. \n3. three\n\n`); - - // Test continuation of alternative ordered list syntax - await textarea.fill(`1) one`); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Enter'); - await textarea.pressSequentially(' '); - await textarea.press('Enter'); - await textarea.pressSequentially('three'); - await textarea.press('Enter'); - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`1) one\n2) \n3) three\n\n`); - - // Test continuation of checklists - await textarea.fill(`- [ ]have a problem\n- [x]create a solution`); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Enter'); - await textarea.pressSequentially('write a test'); - await expect(textarea).toHaveValue(`- [ ]have a problem\n- [x]create a solution\n- [ ]write a test`); - - // Test all conceivable syntax (except ordered lists) - const prefixes = [ - '- ', // A space between the bullet and the content is required. - ' - ', // I have seen single space in front of -/* being used and even recommended, I think. - '* ', - '+ ', - ' ', - ' ', - ' - ', - '\t', - '\t\t* ', - '> ', - '> > ', - '- [ ] ', - '* [ ] ', - '+ [ ] ', - ]; - for (const prefix of prefixes) { - await textarea.fill(`${prefix}one`); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.length, it.value.length)); - await textarea.press('Enter'); - await textarea.pressSequentially(' '); - await textarea.press('Enter'); - await textarea.pressSequentially('two'); - await textarea.press('Enter'); - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`${prefix}one\n${prefix} \n${prefix}two\n\n`); - } -}); - -test('markdown insert table', async ({page}) => { - const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); - - const newTableButton = page.locator('button[data-md-action="new-table"]'); - await newTableButton.click(); - - const newTableModal = page.locator('div[data-markdown-table-modal-id="0"]'); - await expect(newTableModal).toBeVisible(); - await save_visual(page); - - await newTableModal.locator('input[name="table-rows"]').fill('3'); - await newTableModal.locator('input[name="table-columns"]').fill('2'); - - await newTableModal.locator('button[data-selector-name="ok-button"]').click(); - - await expect(newTableModal).toBeHidden(); - - const textarea = page.locator('textarea[name=content]'); - await expect(textarea).toHaveValue('| Header | Header |\n|---------|---------|\n| Content | Content |\n| Content | Content |\n| Content | Content |\n'); - await save_visual(page); -}); - -test('markdown insert link', async ({page}) => { - const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); - - const newLinkButton = page.locator('button[data-md-action="new-link"]'); - await newLinkButton.click(); - - const newLinkModal = page.locator('div[data-markdown-link-modal-id="0"]'); - await expect(newLinkModal).toBeVisible(); - await accessibilityCheck({page}, ['[data-modal-name="new-markdown-link"]'], [], []); - await save_visual(page); - - const url = 'https://example.com'; - const description = 'Where does this lead?'; - - await newLinkModal.locator('input[name="link-url"]').fill(url); - await newLinkModal.locator('input[name="link-description"]').fill(description); - - await newLinkModal.locator('button[data-selector-name="ok-button"]').click(); - - await expect(newLinkModal).toBeHidden(); - - const textarea = page.locator('textarea[name=content]'); - await expect(textarea).toHaveValue(`[${description}](${url})`); - await save_visual(page); -}); - -test('text expander has higher prio then prefix continuation', async ({page}) => { - const response = await page.goto('/user2/repo1/issues/new'); - expect(response?.status()).toBe(200); - - const textarea = page.locator('textarea[name=content]'); - const initText = `* first`; - await textarea.fill(initText); - await textarea.evaluate((it:HTMLTextAreaElement) => it.setSelectionRange(it.value.indexOf('rst'), it.value.indexOf('rst'))); - await textarea.press('End'); - - // Test emoji completion - await textarea.press('Enter'); - await textarea.pressSequentially(':smile_c'); - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`* first\n* 😸`); - - // Test username completion - await textarea.press('Enter'); - await textarea.pressSequentially('@user'); - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`* first\n* 😸\n* @user2 `); - - await textarea.press('Enter'); - await expect(textarea).toHaveValue(`* first\n* 😸\n* @user2 \n* `); -}); diff --git a/tests/e2e/markup.test.e2e.ts b/tests/e2e/markup.test.e2e.js similarity index 72% rename from tests/e2e/markup.test.e2e.ts rename to tests/e2e/markup.test.e2e.js index 398a0a6300..920537d08f 100644 --- a/tests/e2e/markup.test.e2e.ts +++ b/tests/e2e/markup.test.e2e.js @@ -1,17 +1,14 @@ -// @watch start -// web_src/css/markup/** -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test} from './utils_e2e.js'; test('markup with #xyz-mode-only', async ({page}) => { const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); + await page.waitForLoadState('networkidle'); const comment = page.locator('.comment-body>.markup', {hasText: 'test markup light/dark-mode-only'}); await expect(comment).toBeVisible(); await expect(comment.locator('[src$="#gh-light-mode-only"]')).toBeVisible(); await expect(comment.locator('[src$="#gh-dark-mode-only"]')).toBeHidden(); - await save_visual(page); }); diff --git a/tests/e2e/org-settings.test.e2e.ts b/tests/e2e/org-settings.test.e2e.js similarity index 60% rename from tests/e2e/org-settings.test.e2e.ts rename to tests/e2e/org-settings.test.e2e.js index df554e0674..5ff0975a26 100644 --- a/tests/e2e/org-settings.test.e2e.ts +++ b/tests/e2e/org-settings.test.e2e.js @@ -1,27 +1,23 @@ -// @watch start -// templates/org/team/new.tmpl -// web_src/css/form.css -// web_src/js/features/org-team.js -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; -import {validate_form} from './shared/forms.ts'; +import {test, login_user, login} from './utils_e2e.js'; +import {validate_form} from './shared/forms.js'; -test.use({user: 'user2'}); +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); -test('org team settings', async ({page}, workerInfo) => { +test('org team settings', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual'); + const page = await login({browser}, workerInfo); const response = await page.goto('/org/org3/teams/team1/edit'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); await page.locator('input[name="permission"][value="admin"]').click(); await expect(page.locator('.hide-unless-checked')).toBeHidden(); - await save_visual(page); await page.locator('input[name="permission"][value="read"]').click(); await expect(page.locator('.hide-unless-checked')).toBeVisible(); - await save_visual(page); // we are validating the form here to include the part that could be hidden await validate_form({page}); diff --git a/tests/e2e/pagination.test.e2e.ts b/tests/e2e/pagination.test.e2e.ts deleted file mode 100644 index 3126b669a6..0000000000 --- a/tests/e2e/pagination.test.e2e.ts +++ /dev/null @@ -1,15 +0,0 @@ -// @watch start -// template/base/paginate.tmpl -// services/context/pagination.go -// @watch end - -import {expect} from '@playwright/test'; -import {test} from './utils_e2e.ts'; -import {accessibilityCheck} from './shared/accessibility.ts'; - -test('Pagination a11y', async ({page}) => { - await page.goto('/explore/repos'); - - await expect(page.locator('.pagination')).toBeVisible(); - await accessibilityCheck({page}, ['.pagination'], [], []); -}); diff --git a/tests/e2e/pr-review.test.e2e.ts b/tests/e2e/pr-review.test.e2e.ts deleted file mode 100644 index b619cdbcd1..0000000000 --- a/tests/e2e/pr-review.test.e2e.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -// @watch start -// templates/repo/diff/new_review.tmpl -// web_src/js/features/repo-issue.js -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test('PR: Finish review', async ({page}) => { - const response = await page.goto('/user2/repo1/pulls/5/files'); - expect(response?.status()).toBe(200); - - await expect(page.locator('.tippy-box .review-box-panel')).toBeHidden(); - await save_visual(page); - - // Review panel should appear after clicking Finish review - await page.locator('#review-box .js-btn-review').click(); - await expect(page.locator('.tippy-box .review-box-panel')).toBeVisible(); - await save_visual(page); -}); diff --git a/tests/e2e/pr-title.test.e2e.ts b/tests/e2e/pr-title.test.e2e.ts deleted file mode 100644 index 390cc81298..0000000000 --- a/tests/e2e/pr-title.test.e2e.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -// @watch start -// templates/repo/issue/view_title.tmpl -// web_src/js/features/repo-issue.js -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test.use({user: 'user2'}); - -test('PR: title edit', async ({page}) => { - const response = await page.goto('/user2/repo1/pulls/5'); - expect(response?.status()).toBe(200); - - await expect(page.locator('#editable-label')).toBeVisible(); - await save_visual(page); - - // Labels AGit and Editable are hidden when title is in edit mode - await page.locator('#issue-title-edit-show').click(); - await expect(page.locator('#editable-label')).toBeHidden(); - await save_visual(page); -}); diff --git a/tests/e2e/profile_actions.test.e2e.ts b/tests/e2e/profile_actions.test.e2e.js similarity index 78% rename from tests/e2e/profile_actions.test.e2e.ts rename to tests/e2e/profile_actions.test.e2e.js index a66dc43aab..dcec0cd83c 100644 --- a/tests/e2e/profile_actions.test.e2e.ts +++ b/tests/e2e/profile_actions.test.e2e.js @@ -1,16 +1,14 @@ -// @watch start -// routers/web/user/** -// templates/shared/user/** -// web_src/js/features/common-global.js -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -test.use({user: 'user2'}); +test('Follow actions', async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); -test('Follow actions', async ({page}) => { await page.goto('/user1'); + await page.waitForLoadState('networkidle'); // Check if following and then unfollowing works. // This checks that the event listeners of @@ -27,7 +25,6 @@ test('Follow actions', async ({page}) => { await page.locator('.block').click(); await expect(page.locator('#block-user')).toBeVisible(); - await save_visual(page); await page.locator('#block-user .ok').click(); await expect(page.locator('.block')).toContainText('Unblock'); await expect(page.locator('#block-user')).toBeHidden(); @@ -37,7 +34,6 @@ test('Follow actions', async ({page}) => { const flashMessage = page.locator('#flash-message'); await expect(flashMessage).toBeVisible(); await expect(flashMessage).toContainText('You cannot follow this user because you have blocked this user or this user has blocked you.'); - await save_visual(page); // Unblock interaction. await page.locator('.block').click(); diff --git a/tests/e2e/reaction-selectors.test.e2e.ts b/tests/e2e/reaction-selectors.test.e2e.js similarity index 75% rename from tests/e2e/reaction-selectors.test.e2e.ts rename to tests/e2e/reaction-selectors.test.e2e.js index 54b7d91869..2a9c62bb4d 100644 --- a/tests/e2e/reaction-selectors.test.e2e.ts +++ b/tests/e2e/reaction-selectors.test.e2e.js @@ -1,14 +1,12 @@ -// @watch start -// web_src/js/features/comp/ReactionSelector.js -// routers/web/repo/issue.go -// @watch end +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -import {expect, type Locator} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); -test.use({user: 'user2'}); - -const assertReactionCounts = (comment: Locator, counts: unknown) => +const assertReactionCounts = (comment, counts) => expect(async () => { await expect(comment.locator('.reactions')).toBeVisible(); @@ -24,19 +22,21 @@ const assertReactionCounts = (comment: Locator, counts: unknown) => ]), ), ); - // eslint-disable-next-line playwright/no-standalone-expect return expect(reactions).toStrictEqual(counts); }).toPass(); -async function toggleReaction(menu: Locator, reaction: string) { +async function toggleReaction(menu, reaction) { await menu.evaluateAll((menus) => menus[0].focus()); await menu.locator('.add-reaction').click(); await menu.locator(`[role=menuitem][data-reaction-content="${reaction}"]`).click(); } -test('Reaction Selectors', async ({page}) => { +test('Reaction Selectors', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const response = await page.goto('/user2/repo1/issues/1'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); const comment = page.locator('.comment#issuecomment-2').first(); @@ -62,5 +62,4 @@ test('Reaction Selectors', async ({page}) => { await toggleReaction(topPicker, 'laugh'); await assertReactionCounts(comment, {'laugh': 2}); - await save_visual(page); }); diff --git a/tests/e2e/release.test.e2e.ts b/tests/e2e/release.test.e2e.js similarity index 71% rename from tests/e2e/release.test.e2e.ts rename to tests/e2e/release.test.e2e.js index 044e7b93ab..daa2a821d2 100644 --- a/tests/e2e/release.test.e2e.ts +++ b/tests/e2e/release.test.e2e.js @@ -1,26 +1,23 @@ -// @watch start -// models/repo/attachment.go -// modules/structs/attachment.go -// routers/web/repo/** -// services/attachment/** -// services/release/** -// templates/repo/release/** -// web_src/js/features/repo-release.js -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; -import {validate_form} from './shared/forms.ts'; +import {test, login_user, save_visual, load_logged_in_context} from './utils_e2e.js'; +import {validate_form} from './shared/forms.js'; -test.use({user: 'user2'}); +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); test.describe.configure({ timeout: 30000, }); -test('External Release Attachments', async ({page, isMobile}) => { +test('External Release Attachments', async ({browser, isMobile}, workerInfo) => { test.skip(isMobile); + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + /** @type {import('@playwright/test').Page} */ + const page = await context.newPage(); + // Click "New Release" await page.goto('/user2/repo2/releases'); await page.click('.button.small.primary'); @@ -28,34 +25,26 @@ test('External Release Attachments', async ({page, isMobile}) => { // Fill out form and create new release await expect(page).toHaveURL('/user2/repo2/releases/new'); await validate_form({page}, 'fieldset'); - const textarea = page.locator('input[name=tag_name]'); - await textarea.pressSequentially('2.0'); - await expect(page.locator('input[name=title]')).toHaveValue('2.0'); + await page.fill('input[name=tag_name]', '2.0'); + await page.fill('input[name=title]', '2.0'); await page.click('#add-external-link'); await page.click('#add-external-link'); await page.fill('input[name=attachment-new-name-2]', 'Test'); await page.fill('input[name=attachment-new-exturl-2]', 'https://forgejo.org/'); await page.click('.remove-rel-attach'); - await save_visual(page); + save_visual(page); await page.click('.button.small.primary'); // Validate release page and click edit await expect(page).toHaveURL('/user2/repo2/releases'); await expect(page.locator('.download[open] li')).toHaveCount(3); - await expect(page.locator('.download[open] li:nth-of-type(1)')).toContainText('Source code (ZIP)'); - await expect(page.locator('.download[open] li:nth-of-type(1) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.zip'); - await expect(page.locator('.download[open] li:nth-of-type(1) a')).toHaveAttribute('type', 'application/zip'); - await expect(page.locator('.download[open] li:nth-of-type(2)')).toContainText('Source code (TAR.GZ)'); - await expect(page.locator('.download[open] li:nth-of-type(2) span[data-tooltip-content]')).toHaveAttribute('data-tooltip-content', 'This attachment is automatically generated.'); await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('href', '/user2/repo2/archive/2.0.tar.gz'); - await expect(page.locator('.download[open] li:nth-of-type(2) a')).toHaveAttribute('type', 'application/gzip'); - await expect(page.locator('.download[open] li:nth-of-type(3)')).toContainText('Test'); await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://forgejo.org/'); - await save_visual(page); + save_visual(page); await page.locator('.octicon-pencil').first().click(); // Validate edit page and edit the release @@ -70,7 +59,7 @@ test('External Release Attachments', async ({page, isMobile}) => { await expect(page.locator('.attachment_edit:visible')).toHaveCount(4); await page.locator('.attachment_edit:visible').nth(2).fill('Test3'); await page.locator('.attachment_edit:visible').nth(3).fill('https://gitea.com/'); - await save_visual(page); + save_visual(page); await page.click('.button.small.primary'); // Validate release page and click edit @@ -80,7 +69,7 @@ test('External Release Attachments', async ({page, isMobile}) => { await expect(page.locator('.download[open] li:nth-of-type(3) a')).toHaveAttribute('href', 'https://gitea.io/'); await expect(page.locator('.download[open] li:nth-of-type(4)')).toContainText('Test3'); await expect(page.locator('.download[open] li:nth-of-type(4) a')).toHaveAttribute('href', 'https://gitea.com/'); - await save_visual(page); + save_visual(page); await page.locator('.octicon-pencil').first().click(); // Delete release diff --git a/tests/e2e/repo-activity-contributors.test.e2e.ts b/tests/e2e/repo-activity-contributors.test.e2e.ts deleted file mode 100644 index ece62cfaba..0000000000 --- a/tests/e2e/repo-activity-contributors.test.e2e.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -// @watch start -// web_src/js/features/contributors.js -// web_src/js/components/RepoContributors.vue -// templates/repo/* -// @watch end - -import {expect} from '@playwright/test'; -import {test} from './utils_e2e.ts'; - -test('Contributor graph', async ({page}) => { - await page.goto('/user2/commits_search_test/activity/contributors'); - await page.getByRole('link', {name: '2 Commits'}).click(); - await expect(page.getByRole('cell', {name: 'Bob'})).toHaveCount(2); -}); diff --git a/tests/e2e/repo-code.test.e2e.ts b/tests/e2e/repo-code.test.e2e.js similarity index 62% rename from tests/e2e/repo-code.test.e2e.ts rename to tests/e2e/repo-code.test.e2e.js index 11b710c956..62c4f557c1 100644 --- a/tests/e2e/repo-code.test.e2e.ts +++ b/tests/e2e/repo-code.test.e2e.js @@ -1,14 +1,12 @@ -// @watch start -// web_src/js/features/repo-code.js -// web_src/css/repo.css -// services/gitdiff/** -// @watch end +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -import {expect, type Page} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; -import {accessibilityCheck} from './shared/accessibility.ts'; +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); -async function assertSelectedLines(page: Page, nums: string[]) { +async function assertSelectedLines(page, nums) { const pageAssertions = async () => { expect( await Promise.all((await page.locator('tr.active [data-line-number]').all()).map((line) => line.getAttribute('data-line-number'))), @@ -30,11 +28,14 @@ async function assertSelectedLines(page: Page, nums: string[]) { return pageAssertions(); } -test('Line Range Selection', async ({page}) => { +test('Line Range Selection', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + const filePath = '/user2/repo1/src/branch/master/README.md?display=source'; const response = await page.goto(filePath); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); await assertSelectedLines(page, []); await page.locator('span#L1').click(); @@ -49,7 +50,6 @@ test('Line Range Selection', async ({page}) => { // out-of-bounds end line await page.goto(`${filePath}#L1-L100`); await assertSelectedLines(page, ['1', '2', '3']); - await save_visual(page); }); test('Readable diff', async ({page}, workerInfo) => { @@ -65,7 +65,7 @@ test('Readable diff', async ({page}, workerInfo) => { ]; for (const thisDiff of expectedDiffs) { const response = await page.goto('/user2/diff-test/commits/branch/main'); - expect(response?.status()).toBe(200); // Status OK + await expect(response?.status()).toBe(200); // Status OK await page.getByText(`Patch: ${thisDiff.id}`).click(); if (thisDiff.removed) { await expect(page.getByText(thisDiff.removed, {exact: true})).toHaveClass(/removed-code/); @@ -76,26 +76,11 @@ test('Readable diff', async ({page}, workerInfo) => { await expect(page.getByText(thisDiff.added, {exact: true})).toHaveCSS('background-color', 'rgb(134, 239, 172)'); } } - await save_visual(page); }); -test.describe('As authenticated user', () => { - test.use({user: 'user2'}); - - test('Username highlighted in commits', async ({page}) => { - await page.goto('/user2/mentions-highlighted/commits/branch/main'); - // check first commit - await page.getByRole('link', {name: 'A commit message which'}).click(); - await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/); - await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); - await accessibilityCheck({page}, ['.commit-header'], [], []); - await save_visual(page); - // check second commit - await page.goto('/user2/mentions-highlighted/commits/branch/main'); - await page.locator('tbody').getByRole('link', {name: 'Another commit which mentions'}).click(); - await expect(page.getByRole('link', {name: '@user2'})).toHaveCSS('background-color', /(.*)/); - await expect(page.getByRole('link', {name: '@user1'})).toHaveCSS('background-color', 'rgba(0, 0, 0, 0)'); - await accessibilityCheck({page}, ['.commit-header'], [], []); - await save_visual(page); - }); +test('Commit graph overflow', async ({page}) => { + await page.goto('/user2/diff-test/graph'); + await expect(page.getByRole('button', {name: 'Mono'})).toBeInViewport({ratio: 1}); + await expect(page.getByRole('button', {name: 'Color'})).toBeInViewport({ratio: 1}); + await expect(page.locator('.selection.search.dropdown')).toBeInViewport({ratio: 1}); }); diff --git a/tests/e2e/repo-commitgraph.test.e2e.ts b/tests/e2e/repo-commitgraph.test.e2e.ts deleted file mode 100644 index e8b85c5997..0000000000 --- a/tests/e2e/repo-commitgraph.test.e2e.ts +++ /dev/null @@ -1,49 +0,0 @@ -// @watch start -// templates/repo/graph.tmpl -// web_src/css/features/gitgraph.css -// web_src/js/features/repo-graph.js -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test('Commit graph overflow', async ({page}) => { - const response = await page.goto('/user2/repo1/graph'); - expect(response?.status()).toBe(200); - - await page.click('#flow-select-refs-dropdown'); - const input = page.locator('#flow-select-refs-dropdown'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - await input.press('Enter'); - - await expect(page.locator('#flow-select-refs-dropdown')).toBeInViewport({ratio: 1}); - await expect(page.getByRole('button', {name: 'Mono'})).toBeInViewport({ratio: 1}); - await expect(page.getByRole('button', {name: 'Color'})).toBeInViewport({ratio: 1}); - await expect(page.locator('.selection.search.dropdown')).toBeInViewport({ratio: 1}); - await save_visual(page); -}); - -test('Switch branch', async ({page}) => { - const response = await page.goto('/user2/repo1/graph'); - expect(response?.status()).toBe(200); - - await page.click('#flow-select-refs-dropdown'); - const input = page.locator('#flow-select-refs-dropdown'); - await input.pressSequentially('develop', {delay: 50}); - await input.press('Enter'); - - await page.waitForLoadState(); - - await expect(page.locator('#loading-indicator')).toBeHidden(); - await expect(page.locator('#rel-container')).toBeVisible(); - await expect(page.locator('#rev-container')).toBeVisible(); - await save_visual(page); -}); diff --git a/tests/e2e/repo-home.test.e2e.ts b/tests/e2e/repo-home.test.e2e.ts deleted file mode 100644 index 6f3d6c373b..0000000000 --- a/tests/e2e/repo-home.test.e2e.ts +++ /dev/null @@ -1,35 +0,0 @@ -// @watch start -// web_src/js/components/RepoBranchTagSelector.vue -// web_src/js/features/common-global.js -// web_src/css/repo.css -// @watch end - -import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; - -test('Language stats bar', async ({page}) => { - const response = await page.goto('/user2/language-stats-test'); - expect(response?.status()).toBe(200); - - await expect(page.locator('#language-stats-legend')).toBeHidden(); - - await page.click('#language-stats-bar'); - await expect(page.locator('#language-stats-legend')).toBeVisible(); - await save_visual(page); - - await page.click('#language-stats-bar'); - await expect(page.locator('#language-stats-legend')).toBeHidden(); - await save_visual(page); -}); - -test('Branch selector commit icon', async ({page}) => { - const response = await page.goto('/user2/repo1'); - expect(response?.status()).toBe(200); - - await expect(page.locator('.branch-dropdown-button svg.octicon-git-branch')).toBeVisible(); - await expect(page.locator('.branch-dropdown-button')).toHaveText('master'); - - await page.goto('/user2/repo1/src/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d'); - await expect(page.locator('.branch-dropdown-button svg.octicon-git-commit')).toBeVisible(); - await expect(page.locator('.branch-dropdown-button')).toHaveText('65f1bf27bc'); -}); diff --git a/tests/e2e/repo-migrate.test.e2e.ts b/tests/e2e/repo-migrate.test.e2e.js similarity index 53% rename from tests/e2e/repo-migrate.test.e2e.ts rename to tests/e2e/repo-migrate.test.e2e.js index 5e67f89ed1..63328e0900 100644 --- a/tests/e2e/repo-migrate.test.e2e.ts +++ b/tests/e2e/repo-migrate.test.e2e.js @@ -1,41 +1,32 @@ -// @watch start -// web_src/js/features/repo-migrate.js -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {test, save_visual, test_context} from './utils_e2e.ts'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -test.use({user: 'user2'}); +test.beforeAll(({browser}, workerInfo) => login_user(browser, workerInfo, 'user2')); -test('Migration Progress Page', async ({page, browser}, workerInfo) => { +test('Migration Progress Page', async ({page: unauthedPage, browser}, workerInfo) => { test.skip(workerInfo.project.name === 'Mobile Safari', 'Flaky actionability checks on Mobile Safari'); - expect((await page.goto('/user2/invalidrepo'))?.status(), 'repo should not exist yet').toBe(404); + const page = await (await load_logged_in_context(browser, workerInfo, 'user2')).newPage(); + + await expect((await page.goto('/user2/invalidrepo'))?.status(), 'repo should not exist yet').toBe(404); await page.goto('/repo/migrate?service_type=1'); const form = page.locator('form'); await form.getByRole('textbox', {name: 'Repository Name'}).fill('invalidrepo'); await form.getByRole('textbox', {name: 'Migrate / Clone from URL'}).fill('https://codeberg.org/forgejo/invalidrepo'); - await save_visual(page); await form.locator('button.primary').click({timeout: 5000}); await expect(page).toHaveURL('user2/invalidrepo'); - await save_visual(page); - const ctx = await test_context(browser); - const unauthenticatedPage = await ctx.newPage(); - expect((await unauthenticatedPage.goto('/user2/invalidrepo'))?.status(), 'public migration page should be accessible').toBe(200); - await expect(unauthenticatedPage.locator('#repo_migrating_progress')).toBeVisible(); + await expect((await unauthedPage.goto('/user2/invalidrepo'))?.status(), 'public migration page should be accessible').toBe(200); + await expect(unauthedPage.locator('#repo_migrating_progress')).toBeVisible(); await page.reload(); await expect(page.locator('#repo_migrating_failed')).toBeVisible(); - await save_visual(page); await page.getByRole('button', {name: 'Delete this repository'}).click(); const deleteModal = page.locator('#delete-repo-modal'); await deleteModal.getByRole('textbox', {name: 'Confirmation string'}).fill('user2/invalidrepo'); - await save_visual(page); await deleteModal.getByRole('button', {name: 'Delete repository'}).click(); await expect(page).toHaveURL('/'); - // checked last to preserve the order of screenshots from first run - await save_visual(unauthenticatedPage); }); diff --git a/tests/e2e/repo-new.test.e2e.ts b/tests/e2e/repo-new.test.e2e.ts deleted file mode 100644 index ad202825a0..0000000000 --- a/tests/e2e/repo-new.test.e2e.ts +++ /dev/null @@ -1,127 +0,0 @@ -// @watch start -// templates/repo/create**.tmpl -// web_src/css/{form,repo}.css -// @watch end - -import {expect} from '@playwright/test'; -import {test, dynamic_id, save_visual} from './utils_e2e.ts'; -import {validate_form} from './shared/forms.ts'; - -test.use({user: 'user2'}); - -test('New repo: invalid', async ({page}) => { - const response = await page.goto('/repo/create'); - expect(response?.status()).toBe(200); - // check that relevant form content is hidden or available - await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible(); - await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden(); - await expect(page.getByText('Labels Select a label set')).toBeHidden(); - await validate_form({page}, 'fieldset'); - await save_visual(page); - - await page.getByLabel('Repository name').fill('*invalid'); - await page.getByRole('button', {name: 'Create repository'}).click(); - await expect(page.getByText('Repository name should contain only alphanumeric')).toBeVisible(); - await save_visual(page); -}); - -test('New repo: initialize', async ({page}, workerInfo) => { - const response = await page.goto('/repo/create'); - expect(response?.status()).toBe(200); - // check that relevant form content is hidden or available - await expect(page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox')).toBeVisible(); - await expect(page.getByText('.gitignore Select .gitignore')).toBeHidden(); - // fill initialization section - await page.getByText('Start the Git history with').click(); - await page.getByText('Select .gitignore templates').click(); - await page.getByLabel('.gitignore Select .gitignore').fill('Go'); - await page.getByRole('option', {name: 'Go', exact: true}).click(); - await page.keyboard.press('Escape'); - await page.getByLabel('License Select a license file').click(); - await page.getByRole('option', {name: 'MIT', exact: true}).click(); - await page.keyboard.press('Escape'); - // add advanced settings - await page.getByText('Click to expand').click(); - await page.getByPlaceholder('master').fill('main'); - await page.getByLabel('Make repository a template').check(); - - await validate_form({page}, 'fieldset'); - await save_visual(page); - const reponame = dynamic_id(); - await page.getByLabel('Repository name').fill(reponame); - await page.getByRole('button', {name: 'Create repository'}).click(); - await expect(page.getByRole('link', {name: '.gitignore'})).toBeVisible(); - await expect(page.getByRole('link', {name: 'LICENSE', exact: true})).toBeVisible(); - if (!workerInfo.project.name.includes('Mobile')) { - await expect(page.getByText('Template', {exact: true})).toBeVisible(); - } - await save_visual(page); -}); - -test('New repo: initialize later', async ({page}) => { - const response = await page.goto('/repo/create'); - expect(response?.status()).toBe(200); - - const reponame = dynamic_id(); - await page.getByLabel('Repository name').fill(reponame); - await page.getByPlaceholder('Enter short description').fill(`Description for repo ${reponame}`); - await page.getByText('Click to expand').click(); - await page.getByPlaceholder('master').fill('devbranch'); - await validate_form({page}, 'fieldset'); - await page.getByRole('button', {name: 'Create repository'}).click(); - expect(page.url()).toBe(`http://localhost:3003/user2/${reponame}`); - await expect(page.getByRole('link', {name: 'New file'})).toBeVisible(); - await expect(page.getByRole('heading', {name: 'Creating a new repository on'})).toBeVisible(); - await save_visual(page); - - // add a README - await page.getByRole('link', {name: 'New file'}).click(); - // wait for loading spinner to disappear - // Otherwise, filling the filename might not populate the tree_path form field or preview tab - // The editor has race conditions, likely related to https://codeberg.org/forgejo/forgejo/issues/3371 - await expect(page.locator('.is-loading')).toBeHidden(); - await page.locator('.view-lines').click(); - await page.keyboard.type('# Heading\n\nHello Forgejo!'); - await page.getByPlaceholder('Name your file…').fill('README.md'); - await expect(page.getByText('Preview')).toBeVisible(); - await page.getByPlaceholder('Add ""').fill('My first commit message'); - await page.getByRole('button', {name: 'Commit changes'}).click(); - expect(page.url()).toBe(`http://localhost:3003/user2/${reponame}/src/branch/devbranch/README.md`); - await expect(page.getByRole('link', {name: 'My first commit message'})).toBeVisible(); - await expect(page.getByText('Hello Forgejo!')).toBeVisible(); - await save_visual(page); -}); - -test('New repo: from template', async ({page}, workerInfo) => { - test.skip(['Mobile Safari', 'webkit'].includes(workerInfo.project.name), 'WebKit browsers seem to have CORS issues with localhost here.'); - const response = await page.goto('/repo/create'); - expect(response?.status()).toBe(200); - - const reponame = dynamic_id(); - await page.getByRole('group', {name: 'Use a template You can select'}).getByRole('combobox').click(); - await page.getByRole('option', {name: 'user27/template1'}).click(); - await page.getByText('Git content (Default branch)').click(); - await save_visual(page); - await page.getByLabel('Repository name').fill(reponame); - await page.getByRole('button', {name: 'Create repository'}).click(); - await expect(page.getByRole('link', {name: `${reponame}.log`})).toBeVisible(); - await save_visual(page); -}); - -test('New repo: label set', async ({page}) => { - await page.goto('/repo/create'); - - const reponame = dynamic_id(); - await page.getByText('Click to expand').click(); - await page.getByLabel('Labels Select a label set').click(); - await page.getByRole('option', {name: 'Advanced (Kind/Bug, Kind/'}).click(); - // close dropdown via unrelated click - await page.getByText('You can select an existing').click(); - await save_visual(page); - await page.getByLabel('Repository name').fill(reponame); - await page.getByRole('button', {name: 'Create repository'}).click(); - await page.goto(`/user2/${reponame}/issues`); - await page.getByRole('link', {name: 'Labels'}).click(); - await expect(page.getByText('Kind/Bug Something is not')).toBeVisible(); - await save_visual(page); -}); diff --git a/tests/e2e/repo-settings.test.e2e.js b/tests/e2e/repo-settings.test.e2e.js new file mode 100644 index 0000000000..b7b0884b26 --- /dev/null +++ b/tests/e2e/repo-settings.test.e2e.js @@ -0,0 +1,48 @@ +// @ts-check +import {expect} from '@playwright/test'; +import {test, login_user, login} from './utils_e2e.js'; +import {validate_form} from './shared/forms.js'; + +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test('repo webhook settings', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual'); + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/settings/hooks/forgejo/new'); + await expect(response?.status()).toBe(200); + + await page.locator('input[name="events"][value="choose_events"]').click(); + await expect(page.locator('.hide-unless-checked')).toBeVisible(); + + // check accessibility including the custom events (now visible) part + await validate_form({page}, 'fieldset'); + + await page.locator('input[name="events"][value="push_only"]').click(); + await expect(page.locator('.hide-unless-checked')).toBeHidden(); + await page.locator('input[name="events"][value="send_everything"]').click(); + await expect(page.locator('.hide-unless-checked')).toBeHidden(); +}); + +test('repo branch protection settings', async ({browser}, workerInfo) => { + test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual'); + const page = await login({browser}, workerInfo); + const response = await page.goto('/user2/repo1/settings/branches/edit'); + await expect(response?.status()).toBe(200); + + await validate_form({page}, 'fieldset'); + + // verify header is new + await expect(page.locator('h4')).toContainText('new'); + await page.locator('input[name="rule_name"]').fill('testrule'); + await page.getByText('Save rule').click(); + // verify header is in edit mode + await page.waitForLoadState('networkidle'); + await page.getByText('Edit').click(); + await expect(page.locator('h4')).toContainText('Protection rules for branch'); + // delete the rule for the next test + await page.goBack(); + await page.getByText('Delete rule').click(); + await page.getByText('Yes').click(); +}); diff --git a/tests/e2e/repo-settings.test.e2e.ts b/tests/e2e/repo-settings.test.e2e.ts deleted file mode 100644 index 3d260866fb..0000000000 --- a/tests/e2e/repo-settings.test.e2e.ts +++ /dev/null @@ -1,64 +0,0 @@ -// @watch start -// templates/webhook/shared-settings.tmpl -// templates/repo/settings/** -// web_src/css/{form,repo}.css -// web_src/css/modules/grid.css -// web_src/js/features/comp/WebHookEditor.js -// @watch end - -import {expect} from '@playwright/test'; -import {test, save_visual} from './utils_e2e.ts'; -import {validate_form} from './shared/forms.ts'; - -test.use({user: 'user2'}); - -test('repo webhook settings', async ({page}, workerInfo) => { - test.skip(workerInfo.project.name === 'Mobile Safari', 'Cannot get it to work - as usual'); - const response = await page.goto('/user2/repo1/settings/hooks/forgejo/new'); - expect(response?.status()).toBe(200); - - await page.locator('input[name="events"][value="choose_events"]').click(); - await expect(page.locator('.hide-unless-checked')).toBeVisible(); - - // check accessibility including the custom events (now visible) part - await validate_form({page}, 'fieldset'); - await save_visual(page); - - await page.locator('input[name="events"][value="push_only"]').click(); - await expect(page.locator('.hide-unless-checked')).toBeHidden(); - await page.locator('input[name="events"][value="send_everything"]').click(); - await expect(page.locator('.hide-unless-checked')).toBeHidden(); - await save_visual(page); -}); - -test.describe('repo branch protection settings', () => { - test('form', async ({page}, {project}) => { - test.skip(project.name === 'Mobile Safari', 'Cannot get it to work - as usual'); - const response = await page.goto('/user2/repo1/settings/branches/edit'); - expect(response?.status()).toBe(200); - - await validate_form({page}, 'fieldset'); - - // verify header is new - await expect(page.locator('h4')).toContainText('new'); - await page.locator('input[name="rule_name"]').fill('testrule'); - await save_visual(page); - await page.getByText('Save rule').click(); - // verify header is in edit mode - await page.waitForLoadState('domcontentloaded'); - await save_visual(page); - await page.getByText('Edit').click(); - await expect(page.locator('h4')).toContainText('Protection rules for branch'); - await save_visual(page); - }); - - test.afterEach(async ({page}) => { - // delete the rule for the next test - await page.goto('/user2/repo1/settings/branches/'); - await page.waitForLoadState('domcontentloaded'); - test.skip(await page.getByText('Delete rule').isHidden(), 'Nothing to delete at this time'); - await page.getByText('Delete rule').click(); - await page.getByText('Yes').click(); - await page.waitForLoadState('load'); - }); -}); diff --git a/tests/e2e/repo-wiki.test.e2e.ts b/tests/e2e/repo-wiki.test.e2e.js similarity index 90% rename from tests/e2e/repo-wiki.test.e2e.ts rename to tests/e2e/repo-wiki.test.e2e.js index 4ce66da8bc..dc8a67065b 100644 --- a/tests/e2e/repo-wiki.test.e2e.ts +++ b/tests/e2e/repo-wiki.test.e2e.js @@ -1,10 +1,6 @@ -// @watch start -// templates/repo/wiki/** -// web_src/css/repo** -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test} from './utils_e2e.js'; for (const searchTerm of ['space', 'consectetur']) { for (const width of [null, 2560, 4000]) { @@ -16,6 +12,7 @@ for (const searchTerm of ['space', 'consectetur']) { height: 1440, // We're testing that we fit horizontally - vertical scrolling is fine. }); await page.goto('/user2/repo1/wiki'); + await page.waitForLoadState('networkidle'); await page.getByPlaceholder('Search wiki').fill(searchTerm); await page.getByPlaceholder('Search wiki').click(); // workaround: HTMX listens on keyup events, playwright's fill only triggers the input event @@ -23,7 +20,6 @@ for (const searchTerm of ['space', 'consectetur']) { await page.getByPlaceholder('Search wiki').dispatchEvent('keyup'); // timeout is necessary because HTMX search could be slow await expect(page.locator('#wiki-search a[href]')).toBeInViewport({ratio: 1}); - await save_visual(page); }); } } @@ -37,5 +33,4 @@ test(`Search results show titles (and not file names)`, async ({page}, workerInf // so we manually "type" the last letter await page.getByPlaceholder('Search wiki').dispatchEvent('keyup'); await expect(page.locator('#wiki-search a[href] b')).toHaveText('Page With Spaced Name'); - await save_visual(page); }); diff --git a/tests/e2e/right-settings-button.test.e2e.ts b/tests/e2e/right-settings-button.test.e2e.js similarity index 76% rename from tests/e2e/right-settings-button.test.e2e.ts rename to tests/e2e/right-settings-button.test.e2e.js index 3bea329ba0..4f2b09b4c1 100644 --- a/tests/e2e/right-settings-button.test.e2e.ts +++ b/tests/e2e/right-settings-button.test.e2e.js @@ -1,16 +1,18 @@ -// @watch start -// templates/org/** -// templates/repo/** -// web_src/js/webcomponents/overflow-menu.js -// @watch end - +// @ts-check import {expect} from '@playwright/test'; -import {save_visual, test} from './utils_e2e.ts'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -test.describe('desktop viewport as user 2', () => { - test.use({user: 'user2', viewport: {width: 1920, height: 300}}); +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user2'); +}); + +test.describe('desktop viewport', () => { + test.use({viewport: {width: 1920, height: 300}}); + + test('Settings button on right of repo header', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); - test('Settings button on right of repo header', async ({page}) => { await page.goto('/user2/repo1'); const settingsBtn = page.locator('.overflow-menu-items>#settings-btn'); @@ -20,21 +22,11 @@ test.describe('desktop viewport as user 2', () => { await expect(page.locator('.overflow-menu-button')).toHaveCount(0); }); - test('Settings button on right of org header', async ({page}) => { - await page.goto('/org3'); + test('Settings button on right of repo header also when add more button is shown', async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user12'); + const context = await load_logged_in_context(browser, workerInfo, 'user12'); + const page = await context.newPage(); - const settingsBtn = page.locator('.overflow-menu-items>#settings-btn'); - await expect(settingsBtn).toBeVisible(); - await expect(settingsBtn).toHaveClass(/right/); - - await expect(page.locator('.overflow-menu-button')).toHaveCount(0); - }); -}); - -test.describe('desktop viewport as user12', () => { - test.use({user: 'user12', viewport: {width: 1920, height: 300}}); - - test('Settings button on right of repo header also when add more button is shown', async ({page}) => { await page.goto('/user12/repo10'); const settingsBtn = page.locator('.overflow-menu-items>#settings-btn'); @@ -43,10 +35,19 @@ test.describe('desktop viewport as user12', () => { await expect(page.locator('.overflow-menu-button')).toHaveCount(0); }); -}); -test.describe('desktop viewport, unauthenticated', () => { - test.use({viewport: {width: 1920, height: 300}}); + test('Settings button on right of org header', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + + await page.goto('/org3'); + + const settingsBtn = page.locator('.overflow-menu-items>#settings-btn'); + await expect(settingsBtn).toBeVisible(); + await expect(settingsBtn).toHaveClass(/right/); + + await expect(page.locator('.overflow-menu-button')).toHaveCount(0); + }); test('User overview overflow menu should not be influenced', async ({page}) => { await page.goto('/user2'); @@ -54,14 +55,16 @@ test.describe('desktop viewport, unauthenticated', () => { await expect(page.locator('.overflow-menu-items>#settings-btn')).toHaveCount(0); await expect(page.locator('.overflow-menu-button')).toHaveCount(0); - await save_visual(page); }); }); test.describe('small viewport', () => { - test.use({user: 'user2', viewport: {width: 800, height: 300}}); + test.use({viewport: {width: 800, height: 300}}); + + test('Settings button in overflow menu of repo header', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); - test('Settings button in overflow menu of repo header', async ({page}) => { await page.goto('/user2/repo1'); await expect(page.locator('.overflow-menu-items>#settings-btn')).toHaveCount(0); @@ -79,10 +82,12 @@ test.describe('small viewport', () => { const items = shownItems.concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); - await save_visual(page); }); - test('Settings button in overflow menu of org header', async ({page}) => { + test('Settings button in overflow menu of org header', async ({browser}, workerInfo) => { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const page = await context.newPage(); + await page.goto('/org3'); await expect(page.locator('.overflow-menu-items>#settings-btn')).toHaveCount(0); @@ -101,10 +106,6 @@ test.describe('small viewport', () => { const items = shownItems.concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); }); -}); - -test.describe('small viewport, unauthenticated', () => { - test.use({viewport: {width: 800, height: 300}}); test('User overview overflow menu should not be influenced', async ({page}) => { await page.goto('/user2'); @@ -123,6 +124,5 @@ test.describe('small viewport, unauthenticated', () => { const items = shownItems.concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); - await save_visual(page); }); }); diff --git a/tests/e2e/shared/accessibility.ts b/tests/e2e/shared/accessibility.ts deleted file mode 100644 index 1b59d89485..0000000000 --- a/tests/e2e/shared/accessibility.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {expect, type Page} from '@playwright/test'; -import {AxeBuilder} from '@axe-core/playwright'; - -export async function accessibilityCheck({page}: {page: Page}, includes: string[], excludes: string[], disabledRules: string[]) { - // contrast of inline links is still a global issue in Forgejo - disabledRules.push('link-in-text-block'); - - let accessibilityScanner = new AxeBuilder({page}) - .disableRules(disabledRules); - // passing the whole array seems to be not supported, - // iterating has the nice side-effectof skipping this if the array is empty - for (const incl of includes) { - // passing the whole array seems to be not supported - accessibilityScanner = accessibilityScanner.include(incl); - } - for (const excl of excludes) { - accessibilityScanner = accessibilityScanner.exclude(excl); - } - - // scan the page both in dark and light theme - let accessibilityScanResults = await accessibilityScanner.analyze(); - expect(accessibilityScanResults.violations).toEqual([]); - await page.emulateMedia({colorScheme: 'dark'}); - // in https://codeberg.org/forgejo/forgejo/pulls/5899 there have been - // some weird failures related to contrast scanning, - // reporting for colours that haven't been used and no trace in the - // screenshots. - // Since this was only happening with some browsers and not always, - // my bet is on a transition effect on dark/light mode switch. - // Waiting a little seems to work around this. - await page.waitForTimeout(100); // eslint-disable-line playwright/no-wait-for-timeout - accessibilityScanResults = await accessibilityScanner.analyze(); - expect(accessibilityScanResults.violations).toEqual([]); - await page.emulateMedia({colorScheme: 'light'}); -} diff --git a/tests/e2e/shared/forms.ts b/tests/e2e/shared/forms.js similarity index 52% rename from tests/e2e/shared/forms.ts rename to tests/e2e/shared/forms.js index adb5b6e3cb..0ffd6eef2d 100644 --- a/tests/e2e/shared/forms.ts +++ b/tests/e2e/shared/forms.js @@ -1,42 +1,44 @@ -import {expect, type Page} from '@playwright/test'; -import {accessibilityCheck} from './accessibility.ts'; +import {expect} from '@playwright/test'; +import {AxeBuilder} from '@axe-core/playwright'; -export async function validate_form({page}: {page: Page}, scope: 'form' | 'fieldset' = 'form') { - const excludedElements = [ +export async function validate_form({page}, scope) { + scope ??= 'form'; + const accessibilityScanResults = await new AxeBuilder({page}) + // disable checking for link style - should be fixed, but not now + .disableRules('link-in-text-block') + .include(scope) // exclude automated tooltips from accessibility scan, remove when fixed - 'span[data-tooltip-content', + .exclude('span[data-tooltip-content') // exclude weird non-semantic HTML disabled content - '.disabled', - // legacy dropdowns don't use semantic HTML yet, - // avoid using these where possible - '.ui.dropdown', - ]; - await accessibilityCheck({page}, [scope], excludedElements, []); + .exclude('.disabled') + .analyze(); + expect(accessibilityScanResults.violations).toEqual([]); - // assert CSS properties that needed to be overridden for forms (ensure they remain active) + // assert CSS properties that needed to be overriden for forms (ensure they remain active) const boxes = page.getByRole('checkbox').or(page.getByRole('radio')); for (const b of await boxes.all()) { await expect(b).toHaveCSS('margin-left', '0px'); await expect(b).toHaveCSS('margin-top', '0px'); + await expect(b).toHaveCSS('vertical-align', 'baseline'); } // assert no (trailing) colon is used in labels // might be necessary to adjust in case colons are strictly necessary in help text for (const l of await page.locator('label').all()) { const str = await l.textContent(); - expect(str.split('\n')[0]).not.toContain(':'); + await expect(str.split('\n')[0]).not.toContain(':'); } - // check that multiple help texts are correctly aligned to each other + // check that multiple help text are correctly aligned to each other // used for example to separate read/write permissions in team permission matrix for (const l of await page.locator('label:has(.help + .help)').all()) { const helpLabels = await l.locator('.help').all(); const boxes = await Promise.all(helpLabels.map((help) => help.boundingBox())); for (let i = 1; i < boxes.length; i++) { // help texts vertically aligned on top of each other - expect(boxes[i].x).toBe(boxes[0].x); + await expect(boxes[i].x).toBe(boxes[0].x); // help texts don't horizontally intersect each other - expect(boxes[i].y + boxes[i].height).toBeGreaterThanOrEqual(boxes[i - 1].y + boxes[i - 1].height); + await expect(boxes[i].y + boxes[i].height).toBeGreaterThanOrEqual(boxes[i - 1].y + boxes[i - 1].height); } } } diff --git a/tests/e2e/user-settings.test.e2e.ts b/tests/e2e/user-settings.test.e2e.ts deleted file mode 100644 index 726c7b4f4a..0000000000 --- a/tests/e2e/user-settings.test.e2e.ts +++ /dev/null @@ -1,80 +0,0 @@ -// @watch start -// templates/user/settings/**.tmpl -// web_src/css/{form,user}.css -// @watch end - -import {expect} from '@playwright/test'; -import {test, save_visual, login_user, login} from './utils_e2e.ts'; -import {validate_form} from './shared/forms.ts'; - -test.beforeAll(async ({browser}, workerInfo) => { - await login_user(browser, workerInfo, 'user2'); -}); - -test('User: Profile settings', async ({browser}, workerInfo) => { - const page = await login({browser}, workerInfo); - await page.goto('/user/settings'); - - await page.getByLabel('Full name').fill('SecondUser'); - - const pronounsInput = page.locator('input[list="pronouns"]'); - await expect(pronounsInput).toHaveAttribute('placeholder', 'Unspecified'); - await pronounsInput.click(); - const pronounsList = page.locator('datalist#pronouns'); - const pronounsOptions = pronounsList.locator('option'); - const pronounsValues = await pronounsOptions.evaluateAll((opts) => opts.map((opt) => opt.value)); - expect(pronounsValues).toEqual(['he/him', 'she/her', 'they/them', 'it/its', 'any pronouns']); - await pronounsInput.fill('she/her'); - - await page.getByPlaceholder('Tell others a little bit').fill('I am a playwright test running for several seconds.'); - await page.getByPlaceholder('Tell others a little bit').press('Tab'); - await page.getByLabel('Website').fill('https://forgejo.org'); - await page.getByPlaceholder('Share your approximate').fill('on a computer chip'); - await page.getByLabel('User visibility').click(); - await page.getByLabel('Visible only to signed-in').click(); - await page.getByLabel('Hide email address Your email').uncheck(); - await page.getByLabel('Hide activity from profile').check(); - - await validate_form({page}, 'fieldset'); - await save_visual(page); - await page.getByRole('button', {name: 'Update profile'}).click(); - await expect(page.getByText('Your profile has been updated.')).toBeVisible(); - await page.getByRole('link', {name: 'public activity'}).click(); - await expect(page.getByText('Your activity is only visible')).toBeVisible(); - await save_visual(page); - - await page.goto('/user2'); - await expect(page.getByText('SecondUser')).toBeVisible(); - await expect(page.getByText('on a computer chip')).toBeVisible(); - await expect(page.locator('li').filter({hasText: 'user2@example.com'})).toBeVisible(); - await expect(page.locator('li').filter({hasText: 'https://forgejo.org'})).toBeVisible(); - await expect(page.getByText('I am a playwright test')).toBeVisible(); - await save_visual(page); - - await page.goto('/user/settings'); - await page.locator('input[list="pronouns"]').fill('rob/ot'); - await page.getByLabel('User visibility').click(); - await page.getByLabel('Visible to everyone').click(); - await page.getByLabel('Hide email address Your email').check(); - await page.getByLabel('Hide activity from profile').uncheck(); - await expect(page.getByText('Your profile has been updated.')).toBeHidden(); - await validate_form({page}, 'fieldset'); - await save_visual(page); - await page.getByRole('button', {name: 'Update profile'}).click(); - await expect(page.getByText('Your profile has been updated.')).toBeVisible(); - - await page.goto('/user2'); - await expect(page.getByText('SecondUser')).toBeVisible(); - await expect(page.locator('li').filter({hasText: 'user2@example.com'})).toBeHidden(); - await page.goto('/user2?tab=activity'); - await expect(page.getByText('Your activity is visible to everyone')).toBeVisible(); -}); - -test('User: Storage overview', async ({browser}, workerInfo) => { - const page = await login({browser}, workerInfo); - await page.goto('/user/settings/storage_overview'); - await page.waitForLoadState(); - await page.getByLabel('Git LFS – 8 KiB').nth(1).hover({position: {x: 250, y: 2}}); - await expect(page.getByText('Git LFS')).toBeVisible(); - await save_visual(page); -}); diff --git a/tests/e2e/utils_e2e.js b/tests/e2e/utils_e2e.js new file mode 100644 index 0000000000..98d762fbcc --- /dev/null +++ b/tests/e2e/utils_e2e.js @@ -0,0 +1,82 @@ +import {expect, test as baseTest} from '@playwright/test'; + +export const test = baseTest.extend({ + context: async ({browser}, use) => { + return use(await test_context(browser)); + }, +}); + +async function test_context(browser, options) { + const context = await browser.newContext(options); + + context.on('page', (page) => { + page.on('pageerror', (err) => expect(err).toBeUndefined()); + }); + + return context; +} + +const ARTIFACTS_PATH = `tests/e2e/test-artifacts`; +const LOGIN_PASSWORD = 'password'; + +// log in user and store session info. This should generally be +// run in test.beforeAll(), then the session can be loaded in tests. +export async function login_user(browser, workerInfo, user) { + test.setTimeout(60000); + // Set up a new context + const context = await test_context(browser); + const page = await context.newPage(); + + // Route to login page + // Note: this could probably be done more quickly with a POST + const response = await page.goto('/user/login'); + await expect(response?.status()).toBe(200); // Status OK + + // Fill out form + await page.type('input[name=user_name]', user); + await page.type('input[name=password]', LOGIN_PASSWORD); + await page.click('form button.ui.primary.button:visible'); + + await page.waitForLoadState('networkidle'); + + await expect(page.url(), {message: `Failed to login user ${user}`}).toBe(`${workerInfo.project.use.baseURL}/`); + + // Save state + await context.storageState({path: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json`}); + + return context; +} + +export async function load_logged_in_context(browser, workerInfo, user) { + let context; + try { + context = await test_context(browser, {storageState: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json`}); + } catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`Could not find state for '${user}'. Did you call login_user(browser, workerInfo, '${user}') in test.beforeAll()?`); + } + } + return context; +} + +export async function login({browser}, workerInfo) { + const context = await load_logged_in_context(browser, workerInfo, 'user2'); + return await context.newPage(); +} + +export async function save_visual(page) { + // Optionally include visual testing + if (process.env.VISUAL_TEST) { + await page.waitForLoadState('networkidle'); + // Mock page/version string + await page.locator('footer div.ui.left').evaluate((node) => node.innerHTML = 'MOCK'); + await expect(page).toHaveScreenshot({ + fullPage: true, + timeout: 20000, + mask: [ + page.locator('.secondary-nav span>img.ui.avatar'), + page.locator('.ui.dropdown.jump.item span>img.ui.avatar'), + ], + }); + } +} diff --git a/tests/e2e/utils_e2e.ts b/tests/e2e/utils_e2e.ts deleted file mode 100644 index ff921a2cf3..0000000000 --- a/tests/e2e/utils_e2e.ts +++ /dev/null @@ -1,154 +0,0 @@ -import {expect, test as baseTest, type Browser, type BrowserContextOptions, type APIRequestContext, type TestInfo, type Page} from '@playwright/test'; - -import * as path from 'node:path'; - -const AUTH_PATH = 'tests/e2e/.auth'; - -type AuthScope = 'logout' | 'shared' | 'webauthn'; - -export type TestOptions = { - forEachTest: void - user: string | null; - authScope: AuthScope; -}; - -export const test = baseTest.extend({ - context: async ({browser, user, authScope, contextOptions}, use, {project}) => { - if (user && authScope) { - const browserName = project.name.toLowerCase().replace(' ', '-'); - contextOptions.storageState = path.join(AUTH_PATH, `state-${browserName}-${user}-${authScope}.json`); - } else { - // if no user is given, ensure to have clean state - contextOptions.storageState = {cookies: [], origins: []}; - } - - return use(await test_context(browser, contextOptions)); - }, - user: null, - authScope: 'shared', -}); - -export async function test_context(browser: Browser, options?: BrowserContextOptions) { - const context = await browser.newContext(options); - - context.on('page', (page) => { - page.on('pageerror', (err) => expect(err).toBeUndefined()); - }); - - return context; -} - -const ARTIFACTS_PATH = `tests/e2e/test-artifacts`; -const LOGIN_PASSWORD = 'password'; - -// log in user and store session info. This should generally be -// run in test.beforeAll(), then the session can be loaded in tests. -export async function login_user(browser: Browser, workerInfo: TestInfo, user: string) { - test.setTimeout(60000); - // Set up a new context - const context = await test_context(browser); - const page = await context.newPage(); - - // Route to login page - // Note: this could probably be done more quickly with a POST - const response = await page.goto('/user/login'); - expect(response?.status()).toBe(200); // Status OK - - // Fill out form - await page.fill('input[name=user_name]', user); - await page.fill('input[name=password]', LOGIN_PASSWORD); - await page.click('form button.ui.primary.button:visible'); - - await page.waitForLoadState(); - - expect(page.url(), {message: `Failed to login user ${user}`}).toBe(`${workerInfo.project.use.baseURL}/`); - - // Save state - await context.storageState({path: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json`}); - - return context; -} - -export async function load_logged_in_context(browser: Browser, workerInfo: TestInfo, user: string) { - try { - return await test_context(browser, {storageState: `${ARTIFACTS_PATH}/state-${user}-${workerInfo.workerIndex}.json`}); - } catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`Could not find state for '${user}'. Did you call login_user(browser, workerInfo, '${user}') in test.beforeAll()?`); - } - } -} - -export async function login({browser}: {browser: Browser}, workerInfo: TestInfo) { - const context = await load_logged_in_context(browser, workerInfo, 'user2'); - return await context?.newPage(); -} - -export async function save_visual(page: Page) { - // Optionally include visual testing - if (process.env.VISUAL_TEST) { - await page.waitForLoadState('domcontentloaded'); - // Mock/replace dynamic content which can have different size (and thus cannot simply be masked below) - await page.locator('footer .left-links').evaluate((node) => node.innerHTML = 'MOCK'); - // replace timestamps in repos to mask them later down - await page.locator('.flex-item-body > relative-time').filter({hasText: /now|minute/}).evaluateAll((nodes) => { - for (const node of nodes) node.outerHTML = 'relative time in repo'; - }); - // dynamically generated UUIDs - await page.getByText('dyn-id-').evaluateAll((nodes) => { - for (const node of nodes) node.innerHTML = node.innerHTML.replaceAll(/dyn-id-[a-f0-9-]+/g, 'dynamic-id'); - }); - // repeat above, work around https://github.com/microsoft/playwright/issues/34152 - await page.getByText('dyn-id-').evaluateAll((nodes) => { - for (const node of nodes) node.innerHTML = node.innerHTML.replaceAll(/dyn-id-[a-f0-9-]+/g, 'dynamic-id'); - }); - await page.locator('relative-time').evaluateAll((nodes) => { - for (const node of nodes) node.outerHTML = 'time element'; - }); - // used for instance for security keys - await page.locator('absolute-date').evaluateAll((nodes) => { - for (const node of nodes) node.outerHTML = 'time element'; - }); - await expect(page).toHaveScreenshot({ - fullPage: true, - timeout: 20000, - mask: [ - page.locator('.ui.avatar'), - page.locator('.sha'), - page.locator('#repo_migrating'), - // update order of recently created repos is not fully deterministic - page.locator('.flex-item-main').filter({hasText: 'relative time in repo'}), - page.locator('#activity-feed'), - page.locator('#user-heatmap'), - // dynamic IDs in fixed-size inputs - page.locator('input[value*="dyn-id-"]'), - ], - }); - } -} - -// Create a temporary user and login to that user and store session info. -// This should ideally run on a per test basis. -export async function create_temp_user(browser: Browser, workerInfo: TestInfo, request: APIRequestContext) { - const username = globalThis.crypto.randomUUID(); - const newUser = await request.post(`/api/v1/admin/users`, { - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Basic ${btoa(`user1:${LOGIN_PASSWORD}`)}`, - }, - data: { - username, - email: `${username}@host.invalid`, - password: LOGIN_PASSWORD, - must_change_password: false, - }, - }); - expect(newUser.ok()).toBeTruthy(); - - return {context: await login_user(browser, workerInfo, username), username}; -} - -// returns a random string with a pattern that can be filtered for screenshots automatically -export function dynamic_id() { - return `dyn-id-${globalThis.crypto.randomUUID()}`; -} diff --git a/tests/e2e/utils_e2e_test.go b/tests/e2e/utils_e2e_test.go index d57c7bc2d3..cfd3ff9e3b 100644 --- a/tests/e2e/utils_e2e_test.go +++ b/tests/e2e/utils_e2e_test.go @@ -5,38 +5,22 @@ package e2e import ( "context" - "crypto/rand" - "encoding/hex" - "fmt" "net" "net/http" "net/url" - "os" - "path/filepath" - "regexp" - "strings" "testing" "time" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - modules_session "forgejo.org/modules/session" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" - "code.forgejo.org/go-chi/session" "github.com/stretchr/testify/require" ) -var rootPathRe = regexp.MustCompile("\\[repository\\]\nROOT\\s=\\s.*") - func onForgejoRunTB(t testing.TB, callback func(testing.TB, *url.URL), prepare ...bool) { if len(prepare) == 0 || prepare[0] { defer tests.PrepareTestEnv(t, 1)() } - createSessions(t) - s := http.Server{ Handler: testE2eWebRoutes, } @@ -53,14 +37,8 @@ func onForgejoRunTB(t testing.TB, callback func(testing.TB, *url.URL), prepare . require.NoError(t, err) u.Host = listener.Addr().String() - // Override repository root in config. - conf, err := os.ReadFile(setting.CustomConf) - require.NoError(t, err) - require.NoError(t, os.WriteFile(setting.CustomConf, rootPathRe.ReplaceAll(conf, []byte("[repository]\nROOT = "+setting.RepoRootPath)), 0o644)) - defer func() { - require.NoError(t, os.WriteFile(setting.CustomConf, conf, 0o644)) - ctx, cancel := context.WithTimeout(t.Context(), 2*time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) s.Shutdown(ctx) cancel() }() @@ -76,118 +54,3 @@ func onForgejoRun(t *testing.T, callback func(*testing.T, *url.URL), prepare ... callback(t.(*testing.T), u) }, prepare...) } - -func createSessions(t testing.TB) { - t.Helper() - // copied from playwright.config.ts - browsers := []string{ - "chromium", - "firefox", - "webkit", - "Mobile Chrome", - "Mobile Safari", - } - scopes := []string{ - "shared", - } - users := []string{ - "user1", - "user2", - "user12", - "user40", - } - - authState := filepath.Join(filepath.Dir(setting.AppPath), "tests", "e2e", ".auth") - err := os.RemoveAll(authState) - require.NoError(t, err) - - err = os.MkdirAll(authState, os.ModePerm) - require.NoError(t, err) - - createSessionCookie := stateHelper(t) - - for _, user := range users { - u := unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: strings.ToLower(user)}) - for _, browser := range browsers { - for _, scope := range scopes { - stateFile := strings.ReplaceAll(strings.ToLower(fmt.Sprintf("state-%s-%s-%s.json", browser, user, scope)), " ", "-") - createSessionCookie(filepath.Join(authState, stateFile), u) - } - } - } -} - -func stateHelper(t testing.TB) func(stateFile string, user *user_model.User) { - type Cookie struct { - Name string `json:"name"` - Value string `json:"value"` - Domain string `json:"domain"` - Path string `json:"path"` - Expires int `json:"expires"` - HTTPOnly bool `json:"httpOnly"` - Secure bool `json:"secure"` - SameSite string `json:"sameSite"` - } - - type BrowserState struct { - Cookies []Cookie `json:"cookies"` - Origins []string `json:"origins"` - } - - options := session.Options{ - Provider: setting.SessionConfig.Provider, - ProviderConfig: setting.SessionConfig.ProviderConfig, - CookieName: setting.SessionConfig.CookieName, - CookiePath: setting.SessionConfig.CookiePath, - Gclifetime: setting.SessionConfig.Gclifetime, - Maxlifetime: setting.SessionConfig.Maxlifetime, - Secure: setting.SessionConfig.Secure, - SameSite: setting.SessionConfig.SameSite, - Domain: setting.SessionConfig.Domain, - } - - opt := session.PrepareOptions([]session.Options{options}) - - vsp := modules_session.VirtualSessionProvider{} - err := vsp.Init(opt.Maxlifetime, opt.ProviderConfig) - require.NoError(t, err) - - return func(stateFile string, user *user_model.User) { - buf := make([]byte, opt.IDLength/2) - _, err = rand.Read(buf) - require.NoError(t, err) - - sessionID := hex.EncodeToString(buf) - - s, err := vsp.Read(sessionID) - require.NoError(t, err) - - err = s.Set("uid", user.ID) - require.NoError(t, err) - - err = s.Release() - require.NoError(t, err) - - state := BrowserState{ - Cookies: []Cookie{ - { - Name: opt.CookieName, - Value: sessionID, - Domain: setting.Domain, - Path: "/", - Expires: -1, - HTTPOnly: true, - Secure: false, - SameSite: "Lax", - }, - }, - Origins: []string{}, - } - - jsonData, err := json.Marshal(state) - require.NoError(t, err) - - err = os.WriteFile(stateFile, jsonData, 0o644) - require.NoError(t, err) - } -} diff --git a/tests/e2e/webauthn.test.e2e.ts b/tests/e2e/webauthn.test.e2e.js similarity index 62% rename from tests/e2e/webauthn.test.e2e.ts rename to tests/e2e/webauthn.test.e2e.js index 144f52e374..e11c17c331 100644 --- a/tests/e2e/webauthn.test.e2e.ts +++ b/tests/e2e/webauthn.test.e2e.js @@ -1,23 +1,22 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT - -// @watch start -// templates/user/auth/** -// templates/user/settings/** -// web_src/js/features/user-** -// @watch end +// @ts-check import {expect} from '@playwright/test'; -import {test, save_visual, create_temp_user, login_user} from './utils_e2e.ts'; +import {test, login_user, load_logged_in_context} from './utils_e2e.js'; -test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => { +test.beforeAll(async ({browser}, workerInfo) => { + await login_user(browser, workerInfo, 'user40'); +}); + +test('WebAuthn register & login flow', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name !== 'chromium', 'Uses Chrome protocol'); - const {context, username} = await create_temp_user(browser, workerInfo, request); + const context = await load_logged_in_context(browser, workerInfo, 'user40'); const page = await context.newPage(); // Register a security key. let response = await page.goto('/user/settings/security'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); // https://github.com/microsoft/playwright/issues/7276#issuecomment-1516768428 const cdpSession = await page.context().newCDPSession(page); @@ -30,25 +29,23 @@ test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => transport: 'usb', automaticPresenceSimulation: true, isUserVerified: true, + backupEligibility: true, }, }); await page.locator('input#nickname').fill('Testing Security Key'); - await save_visual(page); await page.getByText('Add security key').click(); // Logout. - await expect(async () => { - await page.locator('div[aria-label="Profile and settings…"]').click(); - await page.getByText('Sign Out').click(); - }).toPass(); + await page.locator('div[aria-label="Profile and settings…"]').click(); + await page.getByText('Sign Out').click(); await page.waitForURL(`${workerInfo.project.use.baseURL}/`); // Login. response = await page.goto('/user/login'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); - await page.getByLabel('Username or email address').fill(username); + await page.getByLabel('Username or email address').fill('user40'); await page.getByLabel('Password').fill('password'); await page.getByRole('button', {name: 'Sign in'}).click(); await page.waitForURL(`${workerInfo.project.use.baseURL}/user/webauthn`); @@ -56,12 +53,8 @@ test('WebAuthn register & login flow', async ({browser, request}, workerInfo) => // Cleanup. response = await page.goto('/user/settings/security'); - expect(response?.status()).toBe(200); + await expect(response?.status()).toBe(200); await page.getByRole('button', {name: 'Remove'}).click(); - await save_visual(page); await page.getByRole('button', {name: 'Yes'}).click(); - await page.waitForLoadState(); - - // verify the user can login without a key - await login_user(browser, workerInfo, username); + await page.waitForURL(`${workerInfo.project.use.baseURL}/user/settings/security`); }); diff --git a/tests/fuzz/fuzz_test.go b/tests/fuzz/fuzz_test.go index 754c7ef064..25a6ed8213 100644 --- a/tests/fuzz/fuzz_test.go +++ b/tests/fuzz/fuzz_test.go @@ -9,9 +9,9 @@ import ( "io" "testing" - "forgejo.org/modules/markup" - "forgejo.org/modules/markup/markdown" - "forgejo.org/modules/setting" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/setting" ) var renderContext = markup.RenderContext{ @@ -27,7 +27,6 @@ var renderContext = markup.RenderContext{ func FuzzMarkdownRenderRaw(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - setting.IsInTesting = true setting.AppURL = "http://localhost:3000/" markdown.RenderRaw(&renderContext, bytes.NewReader(data), io.Discard) }) @@ -35,7 +34,6 @@ func FuzzMarkdownRenderRaw(f *testing.F) { func FuzzMarkupPostProcess(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - setting.IsInTesting = true setting.AppURL = "http://localhost:3000/" markup.PostProcess(&renderContext, bytes.NewReader(data), io.Discard) }) diff --git a/tests/gitea-repositories-meta/user2/commits_search_test.git/config b/tests/gitea-repositories-meta/user2/commits_search_test.git/config index 534a026f8f..bfbada5989 100644 --- a/tests/gitea-repositories-meta/user2/commits_search_test.git/config +++ b/tests/gitea-repositories-meta/user2/commits_search_test.git/config @@ -3,6 +3,6 @@ filemode = true bare = true [remote "origin"] - url = /home/mura/go/src/forgejo.org/tests/gitea-repositories-meta/user2/commits_search_test/ + url = /home/mura/go/src/code.gitea.io/gitea/tests/gitea-repositories-meta/user2/commits_search_test/ fetch = +refs/*:refs/* mirror = true diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 deleted file mode 100644 index 1aecac1f1b..0000000000 Binary files a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/a6/dc41d9e96df65286a79f5625ec51635e47f752 and /dev/null differ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf deleted file mode 100644 index 3927778ddf..0000000000 Binary files a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/df/6b6d9a97608bc8b56d4f30cde5af00f0681ccf and /dev/null differ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 b/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 deleted file mode 100644 index a69fc57996..0000000000 Binary files a/tests/gitea-repositories-meta/user2/repo1.wiki.git/objects/f5/4f5a6b7c4f83b606600e43186165854f189530 and /dev/null differ diff --git a/tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master b/tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master index bd0c0d7efe..c804802cbf 100644 --- a/tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master +++ b/tests/gitea-repositories-meta/user2/repo1.wiki.git/refs/heads/master @@ -1 +1 @@ -f54f5a6b7c4f83b606600e43186165854f189530 +d49ac742d44063dcf69d4e0afe725813b777dd89 diff --git a/tests/integration/README.md b/tests/integration/README.md index d83685388e..f0fbf94df9 100644 --- a/tests/integration/README.md +++ b/tests/integration/README.md @@ -61,21 +61,22 @@ make test-sqlite ### Run MySQL integration tests Setup a MySQL database inside docker ``` -docker run -e MYSQL_DATABASE=test -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 --rm --name mysql mysql:latest #(Ctrl-c to stop the database) +docker run -e "MYSQL_DATABASE=test" -e "MYSQL_ALLOW_EMPTY_PASSWORD=yes" -p 3306:3306 --rm --name mysql mysql:latest #(just ctrl-c to stop db and clean the container) +docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --rm --name elasticsearch elasticsearch:7.6.0 #(in a second terminal, just ctrl-c to stop db and clean the container) ``` Start tests based on the database container ``` -TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test?multiStatements=true TEST_MYSQL_USERNAME=root TEST_MYSQL_PASSWORD='' make test-mysql +TEST_MYSQL_HOST=localhost:3306 TEST_MYSQL_DBNAME=test TEST_MYSQL_USERNAME=root TEST_MYSQL_PASSWORD='' make test-mysql ``` ### Run pgsql integration tests Setup a pgsql database inside docker ``` -docker run -e "POSTGRES_DB=test" -e POSTGRES_PASSWORD=postgres -p 5432:5432 --rm --name pgsql postgres:latest #(Ctrl-c to stop the database) +docker run -e "POSTGRES_DB=test" -p 5432:5432 --rm --name pgsql postgres:latest #(just ctrl-c to stop db and clean the container) ``` Start tests based on the database container ``` -TEST_STORAGE_TYPE=local TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql +TEST_PGSQL_HOST=localhost:5432 TEST_PGSQL_DBNAME=test TEST_PGSQL_USERNAME=postgres TEST_PGSQL_PASSWORD=postgres make test-pgsql ``` ### Running individual tests diff --git a/tests/integration/actions_commit_status_test.go b/tests/integration/actions_commit_status_test.go index a14b427c98..ace0fbd323 100644 --- a/tests/integration/actions_commit_status_test.go +++ b/tests/integration/actions_commit_status_test.go @@ -7,16 +7,15 @@ import ( "net/url" "testing" - actions_model "forgejo.org/models/actions" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/services/actions" - "forgejo.org/services/automerge" + actions_model "code.gitea.io/gitea/models/actions" + "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/services/actions" + "code.gitea.io/gitea/services/automerge" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,7 +23,7 @@ import ( func TestActionsAutomerge(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.Actions.Enabled, true)() + assert.True(t, setting.Actions.Enabled, "Actions should be enabled") ctx := db.DefaultContext @@ -35,7 +34,7 @@ func TestActionsAutomerge(t *testing.T) { assert.False(t, pr.HasMerged, "PR should not be merged") assert.Equal(t, issues_model.PullRequestStatusMergeable, pr.Status, "PR should be mergeable") - scheduled, err := automerge.ScheduleAutoMerge(ctx, user, pr, repo_model.MergeStyleMerge, "Dummy", false) + scheduled, err := automerge.ScheduleAutoMerge(ctx, user, pr, repo_model.MergeStyleMerge, "Dummy") require.NoError(t, err, "PR should be scheduled for automerge") assert.True(t, scheduled, "PR should be scheduled for automerge") diff --git a/tests/integration/actions_job_test.go b/tests/integration/actions_job_test.go deleted file mode 100644 index 412215086e..0000000000 --- a/tests/integration/actions_job_test.go +++ /dev/null @@ -1,511 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "encoding/base64" - "fmt" - "net/http" - "net/url" - "reflect" - "testing" - "time" - - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - - runnerv1 "code.gitea.io/actions-proto-go/runner/v1" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestJobWithNeeds(t *testing.T) { - if !setting.Database.Type.IsSQLite3() { - t.Skip() - } - testCases := []struct { - treePath string - fileContent string - outcomes map[string]*mockTaskOutcome - expectedStatuses map[string]string - }{ - { - treePath: ".gitea/workflows/job-with-needs.yml", - fileContent: `name: job-with-needs -on: - push: - paths: - - '.gitea/workflows/job-with-needs.yml' -jobs: - job1: - runs-on: ubuntu-latest - steps: - - run: echo job1 - job2: - runs-on: ubuntu-latest - needs: [job1] - steps: - - run: echo job2 -`, - outcomes: map[string]*mockTaskOutcome{ - "job1": { - result: runnerv1.Result_RESULT_SUCCESS, - }, - "job2": { - result: runnerv1.Result_RESULT_SUCCESS, - }, - }, - expectedStatuses: map[string]string{ - "job1": actions_model.StatusSuccess.String(), - "job2": actions_model.StatusSuccess.String(), - }, - }, - { - treePath: ".gitea/workflows/job-with-needs-fail.yml", - fileContent: `name: job-with-needs-fail -on: - push: - paths: - - '.gitea/workflows/job-with-needs-fail.yml' -jobs: - job1: - runs-on: ubuntu-latest - steps: - - run: echo job1 - job2: - runs-on: ubuntu-latest - needs: [job1] - steps: - - run: echo job2 -`, - outcomes: map[string]*mockTaskOutcome{ - "job1": { - result: runnerv1.Result_RESULT_FAILURE, - }, - }, - expectedStatuses: map[string]string{ - "job1": actions_model.StatusFailure.String(), - "job2": actions_model.StatusSkipped.String(), - }, - }, - { - treePath: ".gitea/workflows/job-with-needs-fail-if.yml", - fileContent: `name: job-with-needs-fail-if -on: - push: - paths: - - '.gitea/workflows/job-with-needs-fail-if.yml' -jobs: - job1: - runs-on: ubuntu-latest - steps: - - run: echo job1 - job2: - runs-on: ubuntu-latest - if: ${{ always() }} - needs: [job1] - steps: - - run: echo job2 -`, - outcomes: map[string]*mockTaskOutcome{ - "job1": { - result: runnerv1.Result_RESULT_FAILURE, - }, - "job2": { - result: runnerv1.Result_RESULT_SUCCESS, - }, - }, - expectedStatuses: map[string]string{ - "job1": actions_model.StatusFailure.String(), - "job2": actions_model.StatusSuccess.String(), - }, - }, - } - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - - apiRepo := createActionsTestRepo(t, token, "actions-jobs-with-needs", false) - runner := newMockRunner() - runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"}) - - for _, tc := range testCases { - t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) { - // create the workflow file - opts := getWorkflowCreateFileOptions(user2, apiRepo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent) - fileResp := createWorkflowFile(t, token, user2.Name, apiRepo.Name, tc.treePath, opts) - - // fetch and execute task - for i := 0; i < len(tc.outcomes); i++ { - task := runner.fetchTask(t) - jobName := getTaskJobNameByTaskID(t, token, user2.Name, apiRepo.Name, task.Id) - outcome := tc.outcomes[jobName] - assert.NotNil(t, outcome) - runner.execTask(t, task, outcome) - } - - // check result - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/tasks", user2.Name, apiRepo.Name)). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - var actionTaskRespAfter api.ActionTaskResponse - DecodeJSON(t, resp, &actionTaskRespAfter) - for _, apiTask := range actionTaskRespAfter.Entries { - if apiTask.HeadSHA != fileResp.Commit.SHA { - continue - } - status := apiTask.Status - assert.Equal(t, status, tc.expectedStatuses[apiTask.Name]) - } - }) - } - - httpContext := NewAPITestContext(t, user2.Name, apiRepo.Name, auth_model.AccessTokenScopeWriteRepository) - doAPIDeleteRepository(httpContext)(t) - }) -} - -func TestJobNeedsMatrix(t *testing.T) { - if !setting.Database.Type.IsSQLite3() { - t.Skip() - } - testCases := []struct { - treePath string - fileContent string - outcomes map[string]*mockTaskOutcome - expectedTaskNeeds map[string]*runnerv1.TaskNeed // jobID => TaskNeed - }{ - { - treePath: ".gitea/workflows/jobs-outputs-with-matrix.yml", - fileContent: `name: jobs-outputs-with-matrix -on: - push: - paths: - - '.gitea/workflows/jobs-outputs-with-matrix.yml' -jobs: - job1: - runs-on: ubuntu-latest - outputs: - output_1: ${{ steps.gen_output.outputs.output_1 }} - output_2: ${{ steps.gen_output.outputs.output_2 }} - output_3: ${{ steps.gen_output.outputs.output_3 }} - strategy: - matrix: - version: [1, 2, 3] - steps: - - name: Generate output - id: gen_output - run: | - version="${{ matrix.version }}" - echo "output_${version}=${version}" >> "$GITHUB_OUTPUT" - job2: - runs-on: ubuntu-latest - needs: [job1] - steps: - - run: echo '${{ toJSON(needs.job1.outputs) }}' -`, - outcomes: map[string]*mockTaskOutcome{ - "job1 (1)": { - result: runnerv1.Result_RESULT_SUCCESS, - outputs: map[string]string{ - "output_1": "1", - "output_2": "", - "output_3": "", - }, - }, - "job1 (2)": { - result: runnerv1.Result_RESULT_SUCCESS, - outputs: map[string]string{ - "output_1": "", - "output_2": "2", - "output_3": "", - }, - }, - "job1 (3)": { - result: runnerv1.Result_RESULT_SUCCESS, - outputs: map[string]string{ - "output_1": "", - "output_2": "", - "output_3": "3", - }, - }, - }, - expectedTaskNeeds: map[string]*runnerv1.TaskNeed{ - "job1": { - Result: runnerv1.Result_RESULT_SUCCESS, - Outputs: map[string]string{ - "output_1": "1", - "output_2": "2", - "output_3": "3", - }, - }, - }, - }, - { - treePath: ".gitea/workflows/jobs-outputs-with-matrix-failure.yml", - fileContent: `name: jobs-outputs-with-matrix-failure -on: - push: - paths: - - '.gitea/workflows/jobs-outputs-with-matrix-failure.yml' -jobs: - job1: - runs-on: ubuntu-latest - outputs: - output_1: ${{ steps.gen_output.outputs.output_1 }} - output_2: ${{ steps.gen_output.outputs.output_2 }} - output_3: ${{ steps.gen_output.outputs.output_3 }} - strategy: - matrix: - version: [1, 2, 3] - steps: - - name: Generate output - id: gen_output - run: | - version="${{ matrix.version }}" - echo "output_${version}=${version}" >> "$GITHUB_OUTPUT" - job2: - runs-on: ubuntu-latest - if: ${{ always() }} - needs: [job1] - steps: - - run: echo '${{ toJSON(needs.job1.outputs) }}' -`, - outcomes: map[string]*mockTaskOutcome{ - "job1 (1)": { - result: runnerv1.Result_RESULT_SUCCESS, - outputs: map[string]string{ - "output_1": "1", - "output_2": "", - "output_3": "", - }, - }, - "job1 (2)": { - result: runnerv1.Result_RESULT_FAILURE, - outputs: map[string]string{ - "output_1": "", - "output_2": "", - "output_3": "", - }, - }, - "job1 (3)": { - result: runnerv1.Result_RESULT_SUCCESS, - outputs: map[string]string{ - "output_1": "", - "output_2": "", - "output_3": "3", - }, - }, - }, - expectedTaskNeeds: map[string]*runnerv1.TaskNeed{ - "job1": { - Result: runnerv1.Result_RESULT_FAILURE, - Outputs: map[string]string{ - "output_1": "1", - "output_2": "", - "output_3": "3", - }, - }, - }, - }, - } - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - - apiRepo := createActionsTestRepo(t, token, "actions-jobs-outputs-with-matrix", false) - runner := newMockRunner() - runner.registerAsRepoRunner(t, user2.Name, apiRepo.Name, "mock-runner", []string{"ubuntu-latest"}) - - for _, tc := range testCases { - t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) { - opts := getWorkflowCreateFileOptions(user2, apiRepo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent) - createWorkflowFile(t, token, user2.Name, apiRepo.Name, tc.treePath, opts) - - for i := 0; i < len(tc.outcomes); i++ { - task := runner.fetchTask(t) - jobName := getTaskJobNameByTaskID(t, token, user2.Name, apiRepo.Name, task.Id) - outcome := tc.outcomes[jobName] - assert.NotNil(t, outcome) - runner.execTask(t, task, outcome) - } - - task := runner.fetchTask(t) - actualTaskNeeds := task.Needs - assert.Len(t, actualTaskNeeds, len(tc.expectedTaskNeeds)) - for jobID, tn := range tc.expectedTaskNeeds { - actualNeed := actualTaskNeeds[jobID] - assert.Equal(t, tn.Result, actualNeed.Result) - assert.Len(t, actualNeed.Outputs, len(tn.Outputs)) - for outputKey, outputValue := range tn.Outputs { - assert.Equal(t, outputValue, actualNeed.Outputs[outputKey]) - } - } - }) - } - - httpContext := NewAPITestContext(t, user2.Name, apiRepo.Name, auth_model.AccessTokenScopeWriteRepository) - doAPIDeleteRepository(httpContext)(t) - }) -} - -func TestActionsGiteaContext(t *testing.T) { - if !setting.Database.Type.IsSQLite3() { - t.Skip() - } - - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - user2Session := loginUser(t, user2.Name) - user2Token := getTokenForLoggedInUser(t, user2Session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - - apiBaseRepo := createActionsTestRepo(t, user2Token, "actions-gitea-context", false) - baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: apiBaseRepo.ID}) - user2APICtx := NewAPITestContext(t, baseRepo.OwnerName, baseRepo.Name, auth_model.AccessTokenScopeWriteRepository) - - runner := newMockRunner() - runner.registerAsRepoRunner(t, baseRepo.OwnerName, baseRepo.Name, "mock-runner", []string{"ubuntu-latest"}) - - // init the workflow - wfTreePath := ".gitea/workflows/pull.yml" - wfFileContent := `name: Pull Request -on: pull_request -jobs: - wf1-job: - runs-on: ubuntu-latest - steps: - - run: echo 'test the pull' -` - opts := getWorkflowCreateFileOptions(user2, baseRepo.DefaultBranch, fmt.Sprintf("create %s", wfTreePath), wfFileContent) - createWorkflowFile(t, user2Token, baseRepo.OwnerName, baseRepo.Name, wfTreePath, opts) - // user2 creates a pull request - doAPICreateFile(user2APICtx, "user2-patch.txt", &api.CreateFileOptions{ - FileOptions: api.FileOptions{ - NewBranchName: "user2/patch-1", - Message: "create user2-patch.txt", - Author: api.Identity{ - Name: user2.Name, - Email: user2.Email, - }, - Committer: api.Identity{ - Name: user2.Name, - Email: user2.Email, - }, - Dates: api.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }, - ContentBase64: base64.StdEncoding.EncodeToString([]byte("user2-fix")), - })(t) - apiPull, err := doAPICreatePullRequest(user2APICtx, baseRepo.OwnerName, baseRepo.Name, baseRepo.DefaultBranch, "user2/patch-1")(t) - require.NoError(t, err) - task := runner.fetchTask(t) - gtCtx := task.Context.GetFields() - actionTask := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: task.Id}) - actionRunJob := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: actionTask.JobID}) - actionRun := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{ID: actionRunJob.RunID}) - require.NoError(t, actionRun.LoadAttributes(t.Context())) - - assert.Equal(t, user2.Name, gtCtx["actor"].GetStringValue()) - assert.Equal(t, setting.AppURL+"api/v1", gtCtx["api_url"].GetStringValue()) - assert.Equal(t, apiPull.Base.Ref, gtCtx["base_ref"].GetStringValue()) - runEvent := map[string]any{} - require.NoError(t, json.Unmarshal([]byte(actionRun.EventPayload), &runEvent)) - assert.True(t, reflect.DeepEqual(gtCtx["event"].GetStructValue().AsMap(), runEvent)) - assert.Equal(t, actionRun.TriggerEvent, gtCtx["event_name"].GetStringValue()) - assert.Equal(t, apiPull.Head.Ref, gtCtx["head_ref"].GetStringValue()) - assert.Equal(t, actionRunJob.JobID, gtCtx["job"].GetStringValue()) - assert.Equal(t, actionRun.Ref, gtCtx["ref"].GetStringValue()) - assert.Equal(t, (git.RefName(actionRun.Ref)).ShortName(), gtCtx["ref_name"].GetStringValue()) - assert.False(t, gtCtx["ref_protected"].GetBoolValue()) - assert.Equal(t, (git.RefName(actionRun.Ref)).RefType(), gtCtx["ref_type"].GetStringValue()) - assert.Equal(t, actionRun.Repo.OwnerName+"/"+actionRun.Repo.Name, gtCtx["repository"].GetStringValue()) - assert.Equal(t, actionRun.Repo.OwnerName, gtCtx["repository_owner"].GetStringValue()) - assert.Equal(t, actionRun.Repo.HTMLURL(), gtCtx["repositoryUrl"].GetStringValue()) - assert.Equal(t, fmt.Sprint(actionRunJob.RunID), gtCtx["run_id"].GetStringValue()) - assert.Equal(t, fmt.Sprint(actionRun.Index), gtCtx["run_number"].GetStringValue()) - assert.Equal(t, fmt.Sprint(actionRunJob.Attempt), gtCtx["run_attempt"].GetStringValue()) - assert.Equal(t, "Actions", gtCtx["secret_source"].GetStringValue()) - assert.Equal(t, setting.AppURL, gtCtx["server_url"].GetStringValue()) - assert.Equal(t, actionRun.CommitSHA, gtCtx["sha"].GetStringValue()) - assert.Equal(t, actionRun.WorkflowID, gtCtx["workflow"].GetStringValue()) - assert.Equal(t, setting.Actions.DefaultActionsURL.URL(), gtCtx["gitea_default_actions_url"].GetStringValue()) - token := gtCtx["token"].GetStringValue() - assert.Equal(t, actionTask.TokenLastEight, token[len(token)-8:]) - - doAPIDeleteRepository(user2APICtx)(t) - }) -} - -func createActionsTestRepo(t *testing.T, authToken, repoName string, isPrivate bool) *api.Repository { - req := NewRequestWithJSON(t, "POST", "/api/v1/user/repos", &api.CreateRepoOption{ - Name: repoName, - Private: isPrivate, - Readme: "Default", - AutoInit: true, - DefaultBranch: "main", - }).AddTokenAuth(authToken) - resp := MakeRequest(t, req, http.StatusCreated) - var apiRepo api.Repository - DecodeJSON(t, resp, &apiRepo) - return &apiRepo -} - -func getWorkflowCreateFileOptions(u *user_model.User, branch, msg, content string) *api.CreateFileOptions { - return &api.CreateFileOptions{ - FileOptions: api.FileOptions{ - BranchName: branch, - Message: msg, - Author: api.Identity{ - Name: u.Name, - Email: u.Email, - }, - Committer: api.Identity{ - Name: u.Name, - Email: u.Email, - }, - Dates: api.CommitDateOptions{ - Author: time.Now(), - Committer: time.Now(), - }, - }, - ContentBase64: base64.StdEncoding.EncodeToString([]byte(content)), - } -} - -func createWorkflowFile(t *testing.T, authToken, ownerName, repoName, treePath string, opts *api.CreateFileOptions) *api.FileResponse { - req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", ownerName, repoName, treePath), opts). - AddTokenAuth(authToken) - resp := MakeRequest(t, req, http.StatusCreated) - var fileResponse api.FileResponse - DecodeJSON(t, resp, &fileResponse) - return &fileResponse -} - -// getTaskJobNameByTaskID get the job name of the task by task ID -// there is currently not an API for querying a task by ID so we have to list all the tasks -func getTaskJobNameByTaskID(t *testing.T, authToken, ownerName, repoName string, taskID int64) string { - // FIXME: we may need to query several pages - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/tasks", ownerName, repoName)). - AddTokenAuth(authToken) - resp := MakeRequest(t, req, http.StatusOK) - var taskRespBefore api.ActionTaskResponse - DecodeJSON(t, resp, &taskRespBefore) - for _, apiTask := range taskRespBefore.Entries { - if apiTask.ID == taskID { - return apiTask.Name - } - } - return "" -} diff --git a/tests/integration/actions_log_test.go b/tests/integration/actions_log_test.go deleted file mode 100644 index 2c2e2e88b3..0000000000 --- a/tests/integration/actions_log_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "strings" - "testing" - "time" - - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/test" - - runnerv1 "code.gitea.io/actions-proto-go/runner/v1" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/timestamppb" -) - -func TestDownloadTaskLogs(t *testing.T) { - if !setting.Database.Type.IsSQLite3() { - t.Skip() - } - now := time.Now() - testCases := []struct { - treePath string - fileContent string - outcome *mockTaskOutcome - zstdEnabled bool - }{ - { - treePath: ".gitea/workflows/download-task-logs-zstd.yml", - fileContent: `name: download-task-logs-zstd -on: - push: - paths: - - '.gitea/workflows/download-task-logs-zstd.yml' -jobs: - job1: - runs-on: ubuntu-latest - steps: - - run: echo job1 with zstd enabled -`, - outcome: &mockTaskOutcome{ - result: runnerv1.Result_RESULT_SUCCESS, - logRows: []*runnerv1.LogRow{ - { - Time: timestamppb.New(now.Add(1 * time.Second)), - Content: " \U0001F433 docker create image", - }, - { - Time: timestamppb.New(now.Add(2 * time.Second)), - Content: "job1 zstd enabled", - }, - { - Time: timestamppb.New(now.Add(3 * time.Second)), - Content: "\U0001F3C1 Job succeeded", - }, - }, - }, - zstdEnabled: true, - }, - { - treePath: ".gitea/workflows/download-task-logs-no-zstd.yml", - fileContent: `name: download-task-logs-no-zstd -on: - push: - paths: - - '.gitea/workflows/download-task-logs-no-zstd.yml' -jobs: - job1: - runs-on: ubuntu-latest - steps: - - run: echo job1 with zstd disabled -`, - outcome: &mockTaskOutcome{ - result: runnerv1.Result_RESULT_SUCCESS, - logRows: []*runnerv1.LogRow{ - { - Time: timestamppb.New(now.Add(4 * time.Second)), - Content: " \U0001F433 docker create image", - }, - { - Time: timestamppb.New(now.Add(5 * time.Second)), - Content: "job1 zstd disabled", - }, - { - Time: timestamppb.New(now.Add(6 * time.Second)), - Content: "\U0001F3C1 Job succeeded", - }, - }, - }, - zstdEnabled: false, - }, - } - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - - apiRepo := createActionsTestRepo(t, token, "actions-download-task-logs", false) - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: apiRepo.ID}) - runner := newMockRunner() - runner.registerAsRepoRunner(t, user2.Name, repo.Name, "mock-runner", []string{"ubuntu-latest"}) - - for _, tc := range testCases { - t.Run(fmt.Sprintf("test %s", tc.treePath), func(t *testing.T) { - var resetFunc func() - if tc.zstdEnabled { - resetFunc = test.MockVariableValue(&setting.Actions.LogCompression, "zstd") - assert.True(t, setting.Actions.LogCompression.IsZstd()) - } else { - resetFunc = test.MockVariableValue(&setting.Actions.LogCompression, "none") - assert.False(t, setting.Actions.LogCompression.IsZstd()) - } - - // create the workflow file - opts := getWorkflowCreateFileOptions(user2, repo.DefaultBranch, fmt.Sprintf("create %s", tc.treePath), tc.fileContent) - createWorkflowFile(t, token, user2.Name, repo.Name, tc.treePath, opts) - - // fetch and execute task - task := runner.fetchTask(t) - runner.execTask(t, task, tc.outcome) - - // check whether the log file exists - logFileName := fmt.Sprintf("%s/%02x/%d.log", repo.FullName(), task.Id%256, task.Id) - if setting.Actions.LogCompression.IsZstd() { - logFileName += ".zst" - } - _, err := storage.Actions.Stat(logFileName) - require.NoError(t, err) - - // download task logs and check content - runIndex := task.Context.GetFields()["run_number"].GetStringValue() - req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s/actions/runs/%s/jobs/0/logs", user2.Name, repo.Name, runIndex)). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - logTextLines := strings.Split(strings.TrimSpace(resp.Body.String()), "\n") - assert.Len(t, logTextLines, len(tc.outcome.logRows)) - for idx, lr := range tc.outcome.logRows { - assert.Equal( - t, - fmt.Sprintf("%s %s", lr.Time.AsTime().Format("2006-01-02T15:04:05.0000000Z07:00"), lr.Content), - logTextLines[idx], - ) - } - - resetFunc() - }) - } - - httpContext := NewAPITestContext(t, user2.Name, repo.Name, auth_model.AccessTokenScopeWriteRepository) - doAPIDeleteRepository(httpContext)(t) - }) -} diff --git a/tests/integration/actions_route_test.go b/tests/integration/actions_route_test.go index 2641fb6a04..10618c89c7 100644 --- a/tests/integration/actions_route_test.go +++ b/tests/integration/actions_route_test.go @@ -5,18 +5,19 @@ package integration import ( + "context" "fmt" "net/http" "net/url" "strings" "testing" - actions_model "forgejo.org/models/actions" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + actions_model "code.gitea.io/gitea/models/actions" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -70,12 +71,12 @@ func TestActionsWebRouteLatestWorkflowRun(t *testing.T) { // Verify that each points to the correct workflow. workflowOne := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: repo.ID, Index: 1}) - err := workflowOne.LoadAttributes(t.Context()) + err := workflowOne.LoadAttributes(context.Background()) require.NoError(t, err) assert.Equal(t, workflowOneURI, workflowOne.HTMLURL()) workflowTwo := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: repo.ID, Index: 2}) - err = workflowTwo.LoadAttributes(t.Context()) + err = workflowTwo.LoadAttributes(context.Background()) require.NoError(t, err) assert.Equal(t, workflowTwoURI, workflowTwo.HTMLURL()) }) @@ -140,7 +141,7 @@ func TestActionsWebRouteLatestRun(t *testing.T) { // Verify that it redirects to the run we just created workflow := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: repo.ID}) - err := workflow.LoadAttributes(t.Context()) + err := workflow.LoadAttributes(context.Background()) require.NoError(t, err) assert.Equal(t, workflow.HTMLURL(), resp.Header().Get("Location")) @@ -169,7 +170,7 @@ func TestActionsArtifactDeletion(t *testing.T) { // Load the run we just created run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: repo.ID}) - err := run.LoadAttributes(t.Context()) + err := run.LoadAttributes(context.Background()) require.NoError(t, err) // Visit it's web view diff --git a/tests/integration/actions_runner_test.go b/tests/integration/actions_runner_test.go deleted file mode 100644 index 93f38db9ee..0000000000 --- a/tests/integration/actions_runner_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "context" - "fmt" - "net/http" - "testing" - "time" - - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/setting" - - pingv1 "code.gitea.io/actions-proto-go/ping/v1" - "code.gitea.io/actions-proto-go/ping/v1/pingv1connect" - runnerv1 "code.gitea.io/actions-proto-go/runner/v1" - "code.gitea.io/actions-proto-go/runner/v1/runnerv1connect" - "connectrpc.com/connect" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/types/known/timestamppb" -) - -type mockRunner struct { - client *mockRunnerClient -} - -type mockRunnerClient struct { - pingServiceClient pingv1connect.PingServiceClient - runnerServiceClient runnerv1connect.RunnerServiceClient -} - -func newMockRunner() *mockRunner { - client := newMockRunnerClient("", "") - return &mockRunner{client: client} -} - -func newMockRunnerClient(uuid, token string) *mockRunnerClient { - baseURL := fmt.Sprintf("%sapi/actions", setting.AppURL) - - opt := connect.WithInterceptors(connect.UnaryInterceptorFunc(func(next connect.UnaryFunc) connect.UnaryFunc { - return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { - if uuid != "" { - req.Header().Set("x-runner-uuid", uuid) - } - if token != "" { - req.Header().Set("x-runner-token", token) - } - return next(ctx, req) - } - })) - - client := &mockRunnerClient{ - pingServiceClient: pingv1connect.NewPingServiceClient(http.DefaultClient, baseURL, opt), - runnerServiceClient: runnerv1connect.NewRunnerServiceClient(http.DefaultClient, baseURL, opt), - } - - return client -} - -func (r *mockRunner) doPing(t *testing.T) { - resp, err := r.client.pingServiceClient.Ping(t.Context(), connect.NewRequest(&pingv1.PingRequest{ - Data: "mock-runner", - })) - require.NoError(t, err) - require.Equal(t, "Hello, mock-runner!", resp.Msg.Data) -} - -func (r *mockRunner) doRegister(t *testing.T, name, token string, labels []string) { - r.doPing(t) - resp, err := r.client.runnerServiceClient.Register(t.Context(), connect.NewRequest(&runnerv1.RegisterRequest{ - Name: name, - Token: token, - Version: "mock-runner-version", - Labels: labels, - })) - require.NoError(t, err) - r.client = newMockRunnerClient(resp.Msg.Runner.Uuid, resp.Msg.Runner.Token) -} - -func (r *mockRunner) registerAsRepoRunner(t *testing.T, ownerName, repoName, runnerName string, labels []string) { - if !setting.Database.Type.IsSQLite3() { - // registering a mock runner when using a database other than SQLite leaves leftovers - t.FailNow() - } - session := loginUser(t, ownerName) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/actions/runners/registration-token", ownerName, repoName)).AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - var registrationToken struct { - Token string `json:"token"` - } - DecodeJSON(t, resp, ®istrationToken) - r.doRegister(t, runnerName, registrationToken.Token, labels) -} - -func (r *mockRunner) fetchTask(t *testing.T, timeout ...time.Duration) *runnerv1.Task { - fetchTimeout := 10 * time.Second - if len(timeout) > 0 { - fetchTimeout = timeout[0] - } - ddl := time.Now().Add(fetchTimeout) - var task *runnerv1.Task - for time.Now().Before(ddl) { - resp, err := r.client.runnerServiceClient.FetchTask(t.Context(), connect.NewRequest(&runnerv1.FetchTaskRequest{ - TasksVersion: 0, - })) - require.NoError(t, err) - if resp.Msg.Task != nil { - task = resp.Msg.Task - break - } - time.Sleep(time.Second) - } - assert.NotNil(t, task, "failed to fetch a task") - return task -} - -type mockTaskOutcome struct { - result runnerv1.Result - outputs map[string]string - logRows []*runnerv1.LogRow - execTime time.Duration -} - -func (r *mockRunner) execTask(t *testing.T, task *runnerv1.Task, outcome *mockTaskOutcome) { - for idx, lr := range outcome.logRows { - resp, err := r.client.runnerServiceClient.UpdateLog(t.Context(), connect.NewRequest(&runnerv1.UpdateLogRequest{ - TaskId: task.Id, - Index: int64(idx), - Rows: []*runnerv1.LogRow{lr}, - NoMore: idx == len(outcome.logRows)-1, - })) - require.NoError(t, err) - assert.EqualValues(t, idx+1, resp.Msg.AckIndex) - } - sentOutputKeys := make([]string, 0, len(outcome.outputs)) - for outputKey, outputValue := range outcome.outputs { - resp, err := r.client.runnerServiceClient.UpdateTask(t.Context(), connect.NewRequest(&runnerv1.UpdateTaskRequest{ - State: &runnerv1.TaskState{ - Id: task.Id, - Result: runnerv1.Result_RESULT_UNSPECIFIED, - }, - Outputs: map[string]string{outputKey: outputValue}, - })) - require.NoError(t, err) - sentOutputKeys = append(sentOutputKeys, outputKey) - assert.ElementsMatch(t, sentOutputKeys, resp.Msg.SentOutputs) - } - time.Sleep(outcome.execTime) - resp, err := r.client.runnerServiceClient.UpdateTask(t.Context(), connect.NewRequest(&runnerv1.UpdateTaskRequest{ - State: &runnerv1.TaskState{ - Id: task.Id, - Result: outcome.result, - StoppedAt: timestamppb.Now(), - }, - })) - require.NoError(t, err) - assert.Equal(t, outcome.result, resp.Msg.State.Result) -} diff --git a/tests/integration/actions_trigger_test.go b/tests/integration/actions_trigger_test.go index 2d5dd3b957..dfd1f75b3c 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -11,29 +11,29 @@ import ( "testing" "time" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - actions_module "forgejo.org/modules/actions" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - webhook_module "forgejo.org/modules/webhook" - actions_service "forgejo.org/services/actions" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" - release_service "forgejo.org/services/release" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "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" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + actions_module "code.gitea.io/gitea/modules/actions" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + webhook_module "code.gitea.io/gitea/modules/webhook" + actions_service "code.gitea.io/gitea/services/actions" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" + release_service "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -302,11 +302,12 @@ jobs: }, } { t.Run(testCase.onType, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() defer func() { // cleanup leftovers, start from scratch - unittest.AssertSuccessfulDelete(t, &actions_model.ActionRun{RepoID: baseRepo.ID}) - unittest.AssertSuccessfulDelete(t, &actions_model.ActionRunJob{RepoID: baseRepo.ID}) + _, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRun{RepoID: baseRepo.ID}) + require.NoError(t, err) + _, err = db.DeleteByBean(db.DefaultContext, actions_model.ActionRunJob{RepoID: baseRepo.ID}) + require.NoError(t, err) }() // trigger the onType event @@ -752,18 +753,9 @@ func TestWorkflowDispatchEvent(t *testing.T) { return "" } - var r *actions_model.ActionRun - var j []string - r, j, err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) + err = workflow.Dispatch(db.DefaultContext, inputGetter, repo, user2) require.NoError(t, err) assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: repo.ID})) - - assert.Equal(t, "test", r.Title) - assert.Equal(t, "dispatch.yml", r.WorkflowID) - assert.Equal(t, sha, r.CommitSHA) - assert.Equal(t, actions_module.GithubEventWorkflowDispatch, r.TriggerEvent) - assert.Len(t, j, 1) - assert.Equal(t, "test", j[0]) }) } diff --git a/tests/integration/actions_variables_test.go b/tests/integration/actions_variables_test.go deleted file mode 100644 index b27d30a480..0000000000 --- a/tests/integration/actions_variables_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "fmt" - "net/http" - "testing" - - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestActionVariablesModification(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestActionVariablesModification")() - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - userVariable := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionVariable{ID: 1001, OwnerID: user.ID}) - userURL := "/user/settings/actions/variables" - org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3, Type: user_model.UserTypeOrganization}) - orgVariable := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionVariable{ID: 1002, OwnerID: org.ID}) - orgURL := "/org/" + org.Name + "/settings/actions/variables" - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) - repoVariable := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionVariable{ID: 1003, RepoID: repo.ID}) - repoURL := "/" + repo.FullName() + "/settings/actions/variables" - admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{IsAdmin: true}) - globalVariable := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionVariable{ID: 1004}, "owner_id = 0 AND repo_id = 0") - adminURL := "/admin/actions/variables" - - adminSess := loginUser(t, admin.Name) - adminCSRF := GetCSRF(t, adminSess, "/") - sess := loginUser(t, user.Name) - csrf := GetCSRF(t, sess, "/") - - type errorJSON struct { - Error string `json:"errorMessage"` - } - - test := func(t *testing.T, fail bool, baseURL string, id int64) { - defer tests.PrintCurrentTest(t, 1)() - t.Helper() - - sess := sess - csrf := csrf - if baseURL == adminURL { - sess = adminSess - csrf = adminCSRF - } - - req := NewRequestWithValues(t, "POST", baseURL+fmt.Sprintf("/%d/edit", id), map[string]string{ - "_csrf": csrf, - "name": "glados_quote", - "data": "I'm fine. Two plus two is...ten, in base four, I'm fine!", - }) - if fail { - resp := sess.MakeRequest(t, req, http.StatusBadRequest) - var error errorJSON - DecodeJSON(t, resp, &error) - assert.EqualValues(t, "Failed to find the variable.", error.Error) - } else { - sess.MakeRequest(t, req, http.StatusOK) - flashCookie := sess.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DThe%2Bvariable%2Bhas%2Bbeen%2Bedited.", flashCookie.Value) - } - - req = NewRequestWithValues(t, "POST", baseURL+fmt.Sprintf("/%d/delete", id), map[string]string{ - "_csrf": csrf, - }) - if fail { - resp := sess.MakeRequest(t, req, http.StatusBadRequest) - var error errorJSON - DecodeJSON(t, resp, &error) - assert.EqualValues(t, "Failed to find the variable.", error.Error) - } else { - sess.MakeRequest(t, req, http.StatusOK) - flashCookie := sess.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DThe%2Bvariable%2Bhas%2Bbeen%2Bremoved.", flashCookie.Value) - } - } - - t.Run("User variable", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, userVariable.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, userVariable.ID) - }) - t.Run("Admin", func(t *testing.T) { - test(t, true, adminURL, userVariable.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, false, userURL, userVariable.ID) - }) - }) - - t.Run("Organisation variable", func(t *testing.T) { - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, orgVariable.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, orgVariable.ID) - }) - t.Run("Admin", func(t *testing.T) { - test(t, true, adminURL, userVariable.ID) - }) - t.Run("Organisation", func(t *testing.T) { - test(t, false, orgURL, orgVariable.ID) - }) - }) - - t.Run("Repository variable", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, repoVariable.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, repoVariable.ID) - }) - t.Run("Admin", func(t *testing.T) { - test(t, true, adminURL, userVariable.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, false, repoURL, repoVariable.ID) - }) - }) - - t.Run("Global variable", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, globalVariable.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, globalVariable.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, globalVariable.ID) - }) - t.Run("Admin", func(t *testing.T) { - test(t, false, adminURL, globalVariable.ID) - }) - }) -} diff --git a/tests/integration/admin_config_test.go b/tests/integration/admin_config_test.go index 92faf7ef01..860a92d6a3 100644 --- a/tests/integration/admin_config_test.go +++ b/tests/integration/admin_config_test.go @@ -7,8 +7,8 @@ import ( "net/http" "testing" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/admin_user_test.go b/tests/integration/admin_user_test.go index b7a9deb522..8cdaac3c72 100644 --- a/tests/integration/admin_user_test.go +++ b/tests/integration/admin_user_test.go @@ -8,16 +8,11 @@ import ( "net/http" "strconv" "testing" - "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/timeutil" - "forgejo.org/tests" + 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/tests" "github.com/stretchr/testify/assert" ) @@ -25,36 +20,13 @@ import ( func TestAdminViewUsers(t *testing.T) { defer tests.PrepareTestEnv(t)() - t.Run("Admin user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + session := loginUser(t, "user1") + req := NewRequest(t, "GET", "/admin/users") + session.MakeRequest(t, req, http.StatusOK) - session := loginUser(t, "user1") - req := NewRequest(t, "GET", "/admin/users") - session.MakeRequest(t, req, http.StatusOK) - - req = NewRequest(t, "GET", "/admin/users?status_filter[is_2fa_enabled]=1") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - // 6th column is the 2FA column. - // One user that has TOTP and another user that has WebAuthn. - assert.EqualValues(t, 2, htmlDoc.Find(".admin-setting-content table tbody tr td:nth-child(6) .octicon-check").Length()) - }) - - t.Run("Normal user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - session := loginUser(t, "user2") - req := NewRequest(t, "GET", "/admin/users") - session.MakeRequest(t, req, http.StatusForbidden) - }) - - t.Run("Anonymous user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/admin/users") - MakeRequest(t, req, http.StatusSeeOther) - }) + session = loginUser(t, "user2") + req = NewRequest(t, "GET", "/admin/users") + session.MakeRequest(t, req, http.StatusForbidden) } func TestAdminViewUser(t *testing.T) { @@ -98,7 +70,7 @@ func makeRequest(t *testing.T, formData user_model.User, headerCode int) { } func TestAdminDeleteUser(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestAdminDeleteUser")() + defer tests.AddFixtures("tests/integration/fixtures/TestAdminDeleteUser/")() defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") @@ -117,104 +89,3 @@ func TestAdminDeleteUser(t *testing.T) { assertUserDeleted(t, userID, true) unittest.CheckConsistencyFor(t, &user_model.User{}) } - -func TestSourceId(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - testUser23 := &user_model.User{ - Name: "ausersourceid23", - LoginName: "ausersourceid23", - Email: "ausersourceid23@example.com", - Passwd: "ausersourceid23password", - Type: user_model.UserTypeIndividual, - LoginType: auth_model.Plain, - LoginSource: 23, - } - defer createUser(t.Context(), t, testUser23)() - - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadAdmin) - - // Our new user start with 'a' so it should be the first one - req := NewRequest(t, "GET", "/api/v1/admin/users?limit=1").AddTokenAuth(token) - resp := session.MakeRequest(t, req, http.StatusOK) - var users []api.User - DecodeJSON(t, resp, &users) - assert.Len(t, users, 1) - assert.Equal(t, "ausersourceid23", users[0].UserName) - - // Now our new user should not be in the list, because we filter by source_id 0 - req = NewRequest(t, "GET", "/api/v1/admin/users?limit=1&source_id=0").AddTokenAuth(token) - resp = session.MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &users) - assert.Len(t, users, 1) - assert.Equal(t, "the_34-user.with.all.allowedChars", users[0].UserName) - - // Now our new user should be in the list, because we filter by source_id 23 - req = NewRequest(t, "GET", "/api/v1/admin/users?limit=1&source_id=23").AddTokenAuth(token) - resp = session.MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &users) - assert.Len(t, users, 1) - assert.Equal(t, "ausersourceid23", users[0].UserName) -} - -func TestAdminViewUsersSorted(t *testing.T) { - defer tests.PrepareTestEnv(t)() - createTimestamp := time.Now().Unix() - 1000 - updateTimestamp := time.Now().Unix() - 500 - sess := db.GetEngine(t.Context()) - - // Create 10 users with login source 44 - for i := int64(1); i <= 10; i++ { - name := "sorttest" + strconv.Itoa(int(i)) - user := &user_model.User{ - Name: name, - LowerName: name, - LoginName: name, - Email: name + "@example.com", - Passwd: name + ".password", - Type: user_model.UserTypeIndividual, - LoginType: auth_model.OAuth2, - LoginSource: 44, - CreatedUnix: timeutil.TimeStamp(createTimestamp - i), - UpdatedUnix: timeutil.TimeStamp(updateTimestamp - i), - } - if _, err := sess.NoAutoTime().Insert(user); err != nil { - t.Fatalf("Failed to create user: %v", err) - } - } - - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadAdmin) - - testCases := []struct { - loginSource int64 - sortType string - expectedUsers []string - }{ - {0, "alphabetically", []string{"the_34-user.with.all.allowedChars", "user1", "user10", "user11"}}, - {0, "reversealphabetically", []string{"user9", "user8", "user5", "user40"}}, - {0, "newest", []string{"user40", "user39", "user38", "user37"}}, - {0, "oldest", []string{"user1", "user2", "user4", "user5"}}, - {44, "recentupdate", []string{"sorttest1", "sorttest2", "sorttest3", "sorttest4"}}, - {44, "leastupdate", []string{"sorttest10", "sorttest9", "sorttest8", "sorttest7"}}, - } - - for _, testCase := range testCases { - req := NewRequest( - t, - "GET", - fmt.Sprintf("/api/v1/admin/users?sort=%s&limit=4&source_id=%d", - testCase.sortType, - testCase.loginSource), - ).AddTokenAuth(token) - resp := session.MakeRequest(t, req, http.StatusOK) - - var users []api.User - DecodeJSON(t, resp, &users) - assert.Len(t, users, 4) - for i, user := range users { - assert.Equalf(t, testCase.expectedUsers[i], user.UserName, "Sort type: %s, index %d", testCase.sortType, i) - } - } -} diff --git a/tests/integration/api_actions_artifact_test.go b/tests/integration/api_actions_artifact_test.go index dc2b86d28b..2798024c16 100644 --- a/tests/integration/api_actions_artifact_test.go +++ b/tests/integration/api_actions_artifact_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -23,15 +23,8 @@ type getUploadArtifactRequest struct { RetentionDays int64 } -func prepareTestEnvActionsArtifacts(t *testing.T) func() { - t.Helper() - f := tests.PrepareTestEnv(t, 1) - tests.PrepareArtifactsStorage(t) - return f -} - func TestActionsArtifactUploadSingleFile(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() // acquire artifact upload url req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts", getUploadArtifactRequest{ @@ -45,27 +38,27 @@ func TestActionsArtifactUploadSingleFile(t *testing.T) { // get upload url idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") - url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc-2.txt" + url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc.txt" // upload artifact chunk - body := strings.Repeat("C", 1024) + body := strings.Repeat("A", 1024) req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). SetHeader("Content-Range", "bytes 0-1023/1024"). SetHeader("x-tfs-filelength", "1024"). - SetHeader("x-actions-results-md5", "XVlf820rMInUi64wmMi6EA==") // base64(md5(body)) + SetHeader("x-actions-results-md5", "1HsSe8LeLWh93ILaw1TEFQ==") // base64(md5(body)) MakeRequest(t, req, http.StatusOK) t.Logf("Create artifact confirm") // confirm artifact upload - req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact-single"). + req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact"). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") MakeRequest(t, req, http.StatusOK) } func TestActionsArtifactUploadInvalidHash(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() // artifact id 54321 not exist url := "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts/8e5b948a454515dbabfc7eb718ddddddd/upload?itemPath=artifact/abc.txt" @@ -80,7 +73,7 @@ func TestActionsArtifactUploadInvalidHash(t *testing.T) { } func TestActionsArtifactConfirmUploadWithoutName(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() req := NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts"). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") @@ -89,7 +82,7 @@ func TestActionsArtifactConfirmUploadWithoutName(t *testing.T) { } func TestActionsArtifactUploadWithoutToken(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/1/artifacts", nil) MakeRequest(t, req, http.StatusUnauthorized) @@ -115,36 +108,26 @@ type ( ) func TestActionsArtifactDownload(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() req := NewRequest(t, "GET", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts"). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp := MakeRequest(t, req, http.StatusOK) var listResp listArtifactsResponse DecodeJSON(t, resp, &listResp) - assert.Equal(t, int64(2), listResp.Count) + assert.Equal(t, int64(1), listResp.Count) + assert.Equal(t, "artifact", listResp.Value[0].Name) + assert.Contains(t, listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") - // Return list might be in any order. Get one file. - var artifactIdx int - for i, artifact := range listResp.Value { - if artifact.Name == "artifact-download" { - artifactIdx = i - break - } - } - assert.NotNil(t, artifactIdx) - assert.Equal(t, "artifact-download", listResp.Value[artifactIdx].Name) - assert.Contains(t, listResp.Value[artifactIdx].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") - - idx := strings.Index(listResp.Value[artifactIdx].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") - url := listResp.Value[artifactIdx].FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" + idx := strings.Index(listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") + url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact" req = NewRequest(t, "GET", url). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp = MakeRequest(t, req, http.StatusOK) var downloadResp downloadArtifactResponse DecodeJSON(t, resp, &downloadResp) assert.Len(t, downloadResp.Value, 1) - assert.Equal(t, "artifact-download/abc.txt", downloadResp.Value[0].Path) + assert.Equal(t, "artifact/abc.txt", downloadResp.Value[0].Path) assert.Equal(t, "file", downloadResp.Value[0].ItemType) assert.Contains(t, downloadResp.Value[0].ContentLocation, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") @@ -153,13 +136,12 @@ func TestActionsArtifactDownload(t *testing.T) { req = NewRequest(t, "GET", url). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp = MakeRequest(t, req, http.StatusOK) - body := strings.Repeat("A", 1024) - assert.Equal(t, body, resp.Body.String()) + assert.Equal(t, resp.Body.String(), body) } func TestActionsArtifactUploadMultipleFile(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() const testArtifactName = "multi-files" @@ -181,14 +163,14 @@ func TestActionsArtifactUploadMultipleFile(t *testing.T) { files := []uploadingFile{ { - Path: "abc-3.txt", - Content: strings.Repeat("D", 1024), - MD5: "9nqj7E8HZmfQtPifCJ5Zww==", + Path: "abc.txt", + Content: strings.Repeat("A", 1024), + MD5: "1HsSe8LeLWh93ILaw1TEFQ==", }, { - Path: "xyz/def-2.txt", - Content: strings.Repeat("E", 1024), - MD5: "/s1kKvxeHlUX85vaTaVxuA==", + Path: "xyz/def.txt", + Content: strings.Repeat("B", 1024), + MD5: "6fgADK/7zjadf+6cB9Q1CQ==", }, } @@ -215,9 +197,9 @@ func TestActionsArtifactUploadMultipleFile(t *testing.T) { } func TestActionsArtifactDownloadMultiFiles(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() - const testArtifactName = "multi-file-download" + const testArtifactName = "multi-files" req := NewRequest(t, "GET", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts"). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") @@ -244,7 +226,7 @@ func TestActionsArtifactDownloadMultiFiles(t *testing.T) { DecodeJSON(t, resp, &downloadResp) assert.Len(t, downloadResp.Value, 2) - downloads := [][]string{{"multi-file-download/abc.txt", "B"}, {"multi-file-download/xyz/def.txt", "C"}} + downloads := [][]string{{"multi-files/abc.txt", "A"}, {"multi-files/xyz/def.txt", "B"}} for _, v := range downloadResp.Value { var bodyChar string var path string @@ -265,12 +247,13 @@ func TestActionsArtifactDownloadMultiFiles(t *testing.T) { req = NewRequest(t, "GET", url). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp = MakeRequest(t, req, http.StatusOK) - assert.Equal(t, strings.Repeat(bodyChar, 1024), resp.Body.String()) + body := strings.Repeat(bodyChar, 1024) + assert.Equal(t, resp.Body.String(), body) } } func TestActionsArtifactUploadWithRetentionDays(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() // acquire artifact upload url req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts", getUploadArtifactRequest{ @@ -306,7 +289,7 @@ func TestActionsArtifactUploadWithRetentionDays(t *testing.T) { } func TestActionsArtifactOverwrite(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() { // download old artifact uploaded by tests above, it should 1024 A @@ -317,7 +300,7 @@ func TestActionsArtifactOverwrite(t *testing.T) { DecodeJSON(t, resp, &listResp) idx := strings.Index(listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") - url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" + url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact" req = NewRequest(t, "GET", url). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp = MakeRequest(t, req, http.StatusOK) @@ -337,14 +320,14 @@ func TestActionsArtifactOverwrite(t *testing.T) { // upload same artifact, it uses 4096 B req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts", getUploadArtifactRequest{ Type: "actions_storage", - Name: "artifact-download", + Name: "artifact", }).AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp := MakeRequest(t, req, http.StatusOK) var uploadResp uploadArtifactResponse DecodeJSON(t, resp, &uploadResp) idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") - url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact-download/abc.txt" + url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc.txt" body := strings.Repeat("B", 4096) req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). @@ -354,7 +337,7 @@ func TestActionsArtifactOverwrite(t *testing.T) { MakeRequest(t, req, http.StatusOK) // confirm artifact upload - req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact-download"). + req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact"). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") MakeRequest(t, req, http.StatusOK) } @@ -369,15 +352,15 @@ func TestActionsArtifactOverwrite(t *testing.T) { var uploadedItem listArtifactsResponseItem for _, item := range listResp.Value { - if item.Name == "artifact-download" { + if item.Name == "artifact" { uploadedItem = item break } } - assert.Equal(t, "artifact-download", uploadedItem.Name) + assert.Equal(t, "artifact", uploadedItem.Name) idx := strings.Index(uploadedItem.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") - url := uploadedItem.FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" + url := uploadedItem.FileContainerResourceURL[idx+1:] + "?itemPath=artifact" req = NewRequest(t, "GET", url). AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") resp = MakeRequest(t, req, http.StatusOK) diff --git a/tests/integration/api_actions_artifact_v4_test.go b/tests/integration/api_actions_artifact_v4_test.go index 9fa7590620..f55250f6c1 100644 --- a/tests/integration/api_actions_artifact_v4_test.go +++ b/tests/integration/api_actions_artifact_v4_test.go @@ -14,10 +14,10 @@ import ( "testing" "time" - "forgejo.org/modules/storage" - "forgejo.org/routers/api/actions" - actions_service "forgejo.org/services/actions" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/routers/api/actions" + actions_service "code.gitea.io/gitea/services/actions" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -80,13 +80,13 @@ func uploadArtifact(t *testing.T, body string) string { } func TestActionsArtifactV4UploadSingleFile(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() body := strings.Repeat("A", 1024) uploadArtifact(t, body) } func TestActionsArtifactV4UploadSingleFileWrongChecksum(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) @@ -130,7 +130,7 @@ func TestActionsArtifactV4UploadSingleFileWrongChecksum(t *testing.T) { } func TestActionsArtifactV4UploadSingleFileWithRetentionDays(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) @@ -178,7 +178,7 @@ func TestActionsArtifactV4UploadSingleFileWithRetentionDays(t *testing.T) { } func TestActionsArtifactV4UploadSingleFileWithPotentialHarmfulBlockID(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) @@ -241,7 +241,7 @@ func TestActionsArtifactV4UploadSingleFileWithPotentialHarmfulBlockID(t *testing } func TestActionsArtifactV4UploadSingleFileWithChunksOutOfOrder(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) @@ -306,14 +306,14 @@ func TestActionsArtifactV4UploadSingleFileWithChunksOutOfOrder(t *testing.T) { } func TestActionsArtifactV4DownloadSingle(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) // acquire artifact upload url req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/ListArtifacts", toProtoJSON(&actions.ListArtifactsRequest{ - NameFilter: wrapperspb.String("artifact-v4-download"), + NameFilter: wrapperspb.String("artifact"), WorkflowRunBackendId: "792", WorkflowJobRunBackendId: "193", })).AddTokenAuth(token) @@ -324,7 +324,7 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { // confirm artifact upload req = NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/GetSignedArtifactURL", toProtoJSON(&actions.GetSignedArtifactURLRequest{ - Name: "artifact-v4-download", + Name: "artifact", WorkflowRunBackendId: "792", WorkflowJobRunBackendId: "193", })). @@ -336,20 +336,20 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { req = NewRequest(t, "GET", finalizeResp.SignedUrl) resp = MakeRequest(t, req, http.StatusOK) - body := strings.Repeat("D", 1024) + body := strings.Repeat("A", 1024) assert.Equal(t, "bytes", resp.Header().Get("accept-ranges")) assert.Equal(t, body, resp.Body.String()) // Download artifact via user-facing URL - req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact-v4-download") + req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact") resp = MakeRequest(t, req, http.StatusOK) assert.Equal(t, "bytes", resp.Header().Get("accept-ranges")) assert.Equal(t, body, resp.Body.String()) // Partial artifact download - req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact-v4-download").SetHeader("range", "bytes=0-99") + req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact").SetHeader("range", "bytes=0-99") resp = MakeRequest(t, req, http.StatusPartialContent) - body = strings.Repeat("D", 100) + body = strings.Repeat("A", 100) assert.Equal(t, "bytes 0-99/1024", resp.Header().Get("content-range")) assert.Equal(t, body, resp.Body.String()) } @@ -357,13 +357,13 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { func TestActionsArtifactV4DownloadRange(t *testing.T) { defer tests.PrepareTestEnv(t)() - bstr := strings.Repeat("D", 100) + bstr := strings.Repeat("B", 100) body := strings.Repeat("A", 100) + bstr token := uploadArtifact(t, body) // Download (Actions API) req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/GetSignedArtifactURL", toProtoJSON(&actions.GetSignedArtifactURLRequest{ - Name: "artifact-v4-download", + Name: "artifact", WorkflowRunBackendId: "792", WorkflowJobRunBackendId: "193", })). @@ -375,25 +375,25 @@ func TestActionsArtifactV4DownloadRange(t *testing.T) { req = NewRequest(t, "GET", finalizeResp.SignedUrl).SetHeader("range", "bytes=100-199") resp = MakeRequest(t, req, http.StatusPartialContent) - assert.Equal(t, "bytes 100-199/1024", resp.Header().Get("content-range")) + assert.Equal(t, "bytes 100-199/200", resp.Header().Get("content-range")) assert.Equal(t, bstr, resp.Body.String()) // Download (user-facing API) - req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact-v4-download").SetHeader("range", "bytes=100-199") + req = NewRequest(t, "GET", "/user5/repo4/actions/runs/188/artifacts/artifact").SetHeader("range", "bytes=100-199") resp = MakeRequest(t, req, http.StatusPartialContent) - assert.Equal(t, "bytes 100-199/1024", resp.Header().Get("content-range")) + assert.Equal(t, "bytes 100-199/200", resp.Header().Get("content-range")) assert.Equal(t, bstr, resp.Body.String()) } func TestActionsArtifactV4Delete(t *testing.T) { - defer prepareTestEnvActionsArtifacts(t)() + defer tests.PrepareTestEnv(t)() token, err := actions_service.CreateAuthorizationToken(48, 792, 193) require.NoError(t, err) // delete artifact by name req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/DeleteArtifact", toProtoJSON(&actions.DeleteArtifactRequest{ - Name: "artifact-v4-download", + Name: "artifact", WorkflowRunBackendId: "792", WorkflowJobRunBackendId: "193", })).AddTokenAuth(token) diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go index 778a34d785..7506c786da 100644 --- a/tests/integration/api_activitypub_actor_test.go +++ b/tests/integration/api_activitypub_actor_test.go @@ -5,12 +5,12 @@ package integration import ( "net/http" + "net/url" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" ap "github.com/go-ap/activitypub" "github.com/stretchr/testify/assert" @@ -20,29 +20,31 @@ import ( func TestActivityPubActor(t *testing.T) { defer test.MockVariableValue(&setting.Federation.Enabled, true)() defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() - req := NewRequest(t, "GET", "/api/v1/activitypub/actor") - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "@context") + onGiteaRun(t, func(*testing.T, *url.URL) { + req := NewRequest(t, "GET", "/api/v1/activitypub/actor") + resp := MakeRequest(t, req, http.StatusOK) + body := resp.Body.Bytes() + assert.Contains(t, string(body), "@context") - var actor ap.Actor - err := actor.UnmarshalJSON(resp.Body.Bytes()) - require.NoError(t, err) + var actor ap.Actor + err := actor.UnmarshalJSON(body) + require.NoError(t, err) - assert.Equal(t, ap.ApplicationType, actor.Type) - assert.Equal(t, setting.Domain, actor.PreferredUsername.String()) - keyID := actor.GetID().String() - assert.Regexp(t, "activitypub/actor$", keyID) - assert.Regexp(t, "activitypub/actor/outbox$", actor.Outbox.GetID().String()) - assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) + assert.Equal(t, ap.ApplicationType, actor.Type) + assert.Equal(t, setting.Domain, actor.PreferredUsername.String()) + keyID := actor.GetID().String() + assert.Regexp(t, "activitypub/actor$", keyID) + assert.Regexp(t, "activitypub/actor/outbox$", actor.Outbox.GetID().String()) + assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) - pubKey := actor.PublicKey - assert.NotNil(t, pubKey) - publicKeyID := keyID + "#main-key" - assert.Equal(t, pubKey.ID.String(), publicKeyID) + pubKey := actor.PublicKey + assert.NotNil(t, pubKey) + publicKeyID := keyID + "#main-key" + assert.Equal(t, pubKey.ID.String(), publicKeyID) - pubKeyPem := pubKey.PublicKeyPem - assert.NotNil(t, pubKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) + pubKeyPem := pubKey.PublicKeyPem + assert.NotNil(t, pubKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) + }) } diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index d8492942e5..55935e4ab6 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -4,19 +4,18 @@ package integration import ( + "context" "fmt" "net/http" + "net/http/httptest" "net/url" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/activitypub" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers" ap "github.com/go-ap/activitypub" "github.com/stretchr/testify/assert" @@ -24,61 +23,86 @@ import ( ) func TestActivityPubPerson(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - userID := 2 - username := "user2" - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/user-id/%v", userID)) - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "@context") + onGiteaRun(t, func(*testing.T, *url.URL) { + userID := 2 + username := "user2" + req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/user-id/%v", userID)) + resp := MakeRequest(t, req, http.StatusOK) + body := resp.Body.Bytes() + assert.Contains(t, string(body), "@context") - var person ap.Person - err := person.UnmarshalJSON(resp.Body.Bytes()) - require.NoError(t, err) + var person ap.Person + err := person.UnmarshalJSON(body) + require.NoError(t, err) - assert.Equal(t, ap.PersonType, person.Type) - assert.Equal(t, username, person.PreferredUsername.String()) - keyID := person.GetID().String() - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v$", userID), keyID) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/outbox$", userID), person.Outbox.GetID().String()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/inbox$", userID), person.Inbox.GetID().String()) + assert.Equal(t, ap.PersonType, person.Type) + assert.Equal(t, username, person.PreferredUsername.String()) + keyID := person.GetID().String() + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v$", userID), keyID) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/outbox$", userID), person.Outbox.GetID().String()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/inbox$", userID), person.Inbox.GetID().String()) - pubKey := person.PublicKey - assert.NotNil(t, pubKey) - publicKeyID := keyID + "#main-key" - assert.Equal(t, pubKey.ID.String(), publicKeyID) + pubKey := person.PublicKey + assert.NotNil(t, pubKey) + publicKeyID := keyID + "#main-key" + assert.Equal(t, pubKey.ID.String(), publicKeyID) - pubKeyPem := pubKey.PublicKeyPem - assert.NotNil(t, pubKeyPem) - assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) + pubKeyPem := pubKey.PublicKeyPem + assert.NotNil(t, pubKeyPem) + assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) + }) } func TestActivityPubMissingPerson(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "user does not exist") + onGiteaRun(t, func(*testing.T, *url.URL) { + req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999") + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "user does not exist") + }) } func TestActivityPubPersonInbox(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.AppURL, u.String())() - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + srv := httptest.NewServer(testWebRoutes) + defer srv.Close() - user1url := u.JoinPath("/api/v1/activitypub/user-id/1").String() + "#main-key" - cf, err := activitypub.GetClientFactory(db.DefaultContext) + onGiteaRun(t, func(*testing.T, *url.URL) { + appURL := setting.AppURL + setting.AppURL = srv.URL + "/" + defer func() { + setting.Database.LogSQL = false + setting.AppURL = appURL + }() + username1 := "user1" + ctx := context.Background() + user1, err := user_model.GetUserByName(ctx, username1) + require.NoError(t, err) + user1url := fmt.Sprintf("%s/api/v1/activitypub/user-id/1#main-key", srv.URL) + cf, err := activitypub.GetClientFactory(ctx) require.NoError(t, err) c, err := cf.WithKeys(db.DefaultContext, user1, user1url) require.NoError(t, err) - user2inboxurl := u.JoinPath("/api/v1/activitypub/user-id/2/inbox").String() + user2inboxurl := fmt.Sprintf("%s/api/v1/activitypub/user-id/2/inbox", srv.URL) // Signed request succeeds resp, err := c.Post([]byte{}, user2inboxurl) diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go index 29fbe6d781..737f580061 100644 --- a/tests/integration/api_activitypub_repository_test.go +++ b/tests/integration/api_activitypub_repository_test.go @@ -1,4 +1,4 @@ -// Copyright 2024, 2025 The Forgejo Authors. All rights reserved. +// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -6,79 +6,157 @@ package integration import ( "fmt" "net/http" + "net/http/httptest" "net/url" "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/forgefed" - "forgejo.org/models/unittest" - "forgejo.org/models/user" - "forgejo.org/modules/activitypub" - forgefed_modules "forgejo.org/modules/forgefed" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/forgefed" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/activitypub" + forgefed_modules "code.gitea.io/gitea/modules/forgefed" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestActivityPubRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - repositoryID := 2 - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%v", repositoryID)) - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "@context") + onGiteaRun(t, func(*testing.T, *url.URL) { + repositoryID := 2 + req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%v", repositoryID)) + resp := MakeRequest(t, req, http.StatusOK) + body := resp.Body.Bytes() + assert.Contains(t, string(body), "@context") - var repository forgefed_modules.Repository - err := repository.UnmarshalJSON(resp.Body.Bytes()) - require.NoError(t, err) + var repository forgefed_modules.Repository + err := repository.UnmarshalJSON(body) + require.NoError(t, err) - assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%v$", repositoryID), repository.GetID().String()) + assert.Regexp(t, fmt.Sprintf("activitypub/repository-id/%v$", repositoryID), repository.GetID().String()) + }) } func TestActivityPubMissingRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - defer tests.PrepareTestEnv(t)() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - repositoryID := 9999999 - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%v", repositoryID)) - resp := MakeRequest(t, req, http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "repository does not exist") + onGiteaRun(t, func(*testing.T, *url.URL) { + repositoryID := 9999999 + req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%v", repositoryID)) + resp := MakeRequest(t, req, http.StatusNotFound) + assert.Contains(t, resp.Body.String(), "repository does not exist") + }) } func TestActivityPubRepositoryInboxValid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) + srv := httptest.NewServer(testWebRoutes) + defer srv.Close() + + 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 + responseBody := fmt.Sprintf(`{"links":[{"href":"http://%s/api/v1/nodeinfo","rel":"http://nodeinfo.diaspora.software/ns/schema/2.1"}]}`, req.Host) + t.Logf("response: %s", responseBody) + // TODO: as soon as content-type will become important: content-type: application/json;charset=utf-8 + fmt.Fprint(res, responseBody) + }) + 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 + responseBody := fmt.Sprintf(`{"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":{}}`) + fmt.Fprint(res, responseBody) + }) + federatedRoutes.HandleFunc("/api/v1/activitypub/user-id/15", + func(res http.ResponseWriter, req *http.Request) { + // curl -H "Accept: application/json" https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/2 + responseBody := fmt.Sprintf(`{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1"],` + + `"id":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/15","type":"Person",` + + `"icon":{"type":"Image","mediaType":"image/png","url":"https://federated-repo.prod.meissa.de/avatars/1bb05d9a5f6675ed0272af9ea193063c"},` + + `"url":"https://federated-repo.prod.meissa.de/stargoose1","inbox":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/15/inbox",` + + `"outbox":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/15/outbox","preferredUsername":"stargoose1",` + + `"publicKey":{"id":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/15#main-key","owner":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/15",` + + `"publicKeyPem":"-----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"}}`) + fmt.Fprint(res, responseBody) + }) + federatedRoutes.HandleFunc("/api/v1/activitypub/user-id/30", + func(res http.ResponseWriter, req *http.Request) { + // curl -H "Accept: application/json" https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/3 + responseBody := fmt.Sprintf(`{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1"],` + + `"id":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/30","type":"Person",` + + `"icon":{"type":"Image","mediaType":"image/png","url":"https://federated-repo.prod.meissa.de/avatars/9c03f03d1c1f13f21976a22489326fe1"},` + + `"url":"https://federated-repo.prod.meissa.de/stargoose2","inbox":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/30/inbox",` + + `"outbox":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/30/outbox","preferredUsername":"stargoose2",` + + `"publicKey":{"id":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/30#main-key","owner":"https://federated-repo.prod.meissa.de/api/v1/activitypub/user-id/30",` + + `"publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAyv5NytsfqpWXSrwuk8a3\n0W1zE13QJioXb/e3opgN2CfKZkdm3hb+4+mGKoU/rCqegnL9/AO0Aw+R8fCHXx44\n` + + `iNkdVpdY8Dzq+tQ9IetPWbyVIBvSzGgvpqfS05JuVPsy8cBX9wByODjr5kq7k1/v\nY1G7E3uh0a/XJc+mZutwGC3gPgR93NSrqsvTPN4wdhCCu9uj02S8OBoKuSYaPkU+\n` + + `tZ4CEDpnclAOw/eNiH4x2irMvVtruEgtlTA5K2I4YJrmtGLidus47FCyc8/zEKUh\nAeiD8KWDvqsQgOhUwcQgRxAnYVCoMD9cnE+WFFRHTuQecNlmdNFs3Cr0yKcWjDde\n` + + `trvnehW7LfPveGb0tHRHPuVAJpncTOidUR5h/7pqMyvKHzuAHWomm9rEaGUxd/7a\nL1CFjAf39+QIEgu0Anj8mIc7CTiz+DQhDz+0jBOsQ0iDXc5GeBz7X9Xv4Jp966nq\n` + + `MUR0GQGXvfZQN9IqMO+WoUVy10Ddhns1EWGlA0x4fecnAgMBAAE=\n-----END PUBLIC KEY-----\n"}}`) + fmt.Fprint(res, responseBody) + }) + federatedRoutes.HandleFunc("/", + func(res http.ResponseWriter, req *http.Request) { + t.Errorf("Unhandled request: %q", req.URL.EscapedPath()) + }) + federatedSrv := httptest.NewServer(federatedRoutes) defer federatedSrv.Close() - onGiteaRun(t, func(t *testing.T, u *url.URL) { + onGiteaRun(t, func(*testing.T, *url.URL) { + appURL := setting.AppURL + setting.AppURL = srv.URL + "/" + defer func() { + setting.Database.LogSQL = false + setting.AppURL = appURL + }() actionsUser := user.NewActionsUser() repositoryID := 2 - timeNow := time.Now().UTC() - cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) c, err := cf.WithKeys(db.DefaultContext, actionsUser, "not used") require.NoError(t, err) - repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() + repoInboxURL := fmt.Sprintf( + "%s/api/v1/activitypub/repository-id/%v/inbox", + srv.URL, repositoryID) + + timeNow := time.Now().UTC() activity1 := []byte(fmt.Sprintf( `{"type":"Like",`+ `"startTime":"%s",`+ `"actor":"%s/api/v1/activitypub/user-id/15",`+ - `"object":"%s"}`, + `"object":"%s/api/v1/activitypub/repository-id/%v"}`, timeNow.Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + federatedSrv.URL, srv.URL, repositoryID)) t.Logf("activity: %s", activity1) resp, err := c.Post(activity1, repoInboxURL) @@ -94,10 +172,10 @@ func TestActivityPubRepositoryInboxValid(t *testing.T) { `{"type":"Like",`+ `"startTime":"%s",`+ `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, + `"object":"%s/api/v1/activitypub/repository-id/%v"}`, // Make sure this activity happens later then the one before timeNow.Add(time.Second).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)).String())) + federatedSrv.URL, srv.URL, repositoryID)) t.Logf("activity: %s", activity2) resp, err = c.Post(activity2, repoInboxURL) @@ -109,15 +187,17 @@ func TestActivityPubRepositoryInboxValid(t *testing.T) { // The same user sends another like activity otherRepositoryID := 3 - otherRepoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", otherRepositoryID)).String() + otherRepoInboxURL := fmt.Sprintf( + "%s/api/v1/activitypub/repository-id/%v/inbox", + srv.URL, otherRepositoryID) activity3 := []byte(fmt.Sprintf( `{"type":"Like",`+ `"startTime":"%s",`+ `"actor":"%s/api/v1/activitypub/user-id/30",`+ - `"object":"%s"}`, + `"object":"%s/api/v1/activitypub/repository-id/%v"}`, // Make sure this activity happens later then the ones before timeNow.Add(time.Second*2).Format(time.RFC3339), - federatedSrv.URL, u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d", otherRepositoryID)).String())) + federatedSrv.URL, srv.URL, otherRepositoryID)) t.Logf("activity: %s", activity3) resp, err = c.Post(activity3, otherRepoInboxURL) @@ -135,18 +215,32 @@ func TestActivityPubRepositoryInboxValid(t *testing.T) { } func TestActivityPubRepositoryInboxInvalid(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + setting.Federation.Enabled = true + testWebRoutes = routers.NormalRoutes() + defer func() { + setting.Federation.Enabled = false + testWebRoutes = routers.NormalRoutes() + }() - onGiteaRun(t, func(t *testing.T, u *url.URL) { + srv := httptest.NewServer(testWebRoutes) + defer srv.Close() + + onGiteaRun(t, func(*testing.T, *url.URL) { + appURL := setting.AppURL + setting.AppURL = srv.URL + "/" + defer func() { + setting.Database.LogSQL = false + setting.AppURL = appURL + }() actionsUser := user.NewActionsUser() repositoryID := 2 cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) c, err := cf.WithKeys(db.DefaultContext, actionsUser, "not used") require.NoError(t, err) + repoInboxURL := fmt.Sprintf("%s/api/v1/activitypub/repository-id/%v/inbox", + srv.URL, repositoryID) - repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%v/inbox", repositoryID)).String() activity := []byte(`{"type":"Wrong"}`) resp, err := c.Post(activity, repoInboxURL) require.NoError(t, err) diff --git a/tests/integration/api_admin_actions_test.go b/tests/integration/api_admin_actions_test.go deleted file mode 100644 index 763c35544a..0000000000 --- a/tests/integration/api_admin_actions_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "testing" - - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestAPISearchActionJobs_GlobalRunner(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 393}) - adminUsername := "user1" - token := getUserToken(t, adminUsername, auth_model.AccessTokenScopeWriteAdmin) - - req := NewRequest( - t, - "GET", - fmt.Sprintf("/api/v1/admin/runners/jobs?labels=%s", "ubuntu-latest"), - ).AddTokenAuth(token) - res := MakeRequest(t, req, http.StatusOK) - - var jobs []*api.ActionRunJob - DecodeJSON(t, res, &jobs) - - assert.Len(t, jobs, 1) - assert.EqualValues(t, job.ID, jobs[0].ID) -} diff --git a/tests/integration/api_admin_org_test.go b/tests/integration/api_admin_org_test.go index df5e961ec6..a29d0ba1d7 100644 --- a/tests/integration/api_admin_org_test.go +++ b/tests/integration/api_admin_org_test.go @@ -5,68 +5,71 @@ package integration import ( "net/http" + "net/url" "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestAPIAdminOrgCreate(t *testing.T) { - defer tests.PrepareTestEnv(t)() - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + onGiteaRun(t, func(*testing.T, *url.URL) { + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) - org := api.CreateOrgOption{ - UserName: "user2_org", - FullName: "User2's organization", - Description: "This organization created by admin for user2", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "private", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusCreated) + org := api.CreateOrgOption{ + UserName: "user2_org", + FullName: "User2's organization", + Description: "This organization created by admin for user2", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "private", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). + AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusCreated) - var apiOrg api.Organization - DecodeJSON(t, resp, &apiOrg) + var apiOrg api.Organization + DecodeJSON(t, resp, &apiOrg) - assert.Equal(t, org.UserName, apiOrg.Name) - assert.Equal(t, org.FullName, apiOrg.FullName) - assert.Equal(t, org.Description, apiOrg.Description) - assert.Equal(t, org.Website, apiOrg.Website) - assert.Equal(t, org.Location, apiOrg.Location) - assert.Equal(t, org.Visibility, apiOrg.Visibility) + assert.Equal(t, org.UserName, apiOrg.Name) + assert.Equal(t, org.FullName, apiOrg.FullName) + assert.Equal(t, org.Description, apiOrg.Description) + assert.Equal(t, org.Website, apiOrg.Website) + assert.Equal(t, org.Location, apiOrg.Location) + assert.Equal(t, org.Visibility, apiOrg.Visibility) - unittest.AssertExistsAndLoadBean(t, &user_model.User{ - Name: org.UserName, - LowerName: strings.ToLower(org.UserName), - FullName: org.FullName, + unittest.AssertExistsAndLoadBean(t, &user_model.User{ + Name: org.UserName, + LowerName: strings.ToLower(org.UserName), + FullName: org.FullName, + }) }) } func TestAPIAdminOrgCreateBadVisibility(t *testing.T) { - defer tests.PrepareTestEnv(t)() - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) + onGiteaRun(t, func(*testing.T, *url.URL) { + session := loginUser(t, "user1") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteAdmin) - org := api.CreateOrgOption{ - UserName: "user2_org", - FullName: "User2's organization", - Description: "This organization created by admin for user2", - Website: "https://try.gitea.io", - Location: "Shanghai", - Visibility: "notvalid", - } - req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). - AddTokenAuth(token) - MakeRequest(t, req, http.StatusUnprocessableEntity) + org := api.CreateOrgOption{ + UserName: "user2_org", + FullName: "User2's organization", + Description: "This organization created by admin for user2", + Website: "https://try.gitea.io", + Location: "Shanghai", + Visibility: "notvalid", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/admin/users/user2/orgs", &org). + AddTokenAuth(token) + MakeRequest(t, req, http.StatusUnprocessableEntity) + }) } func TestAPIAdminOrgCreateNotAdmin(t *testing.T) { diff --git a/tests/integration/api_admin_test.go b/tests/integration/api_admin_test.go index c5f8906bfc..5f8d360dec 100644 --- a/tests/integration/api_admin_test.go +++ b/tests/integration/api_admin_test.go @@ -9,14 +9,14 @@ import ( "testing" "time" - asymkey_model "forgejo.org/models/asymkey" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + asymkey_model "code.gitea.io/gitea/models/asymkey" + auth_model "code.gitea.io/gitea/models/auth" + "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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/gobwas/glob" "github.com/stretchr/testify/assert" diff --git a/tests/integration/api_block_test.go b/tests/integration/api_block_test.go index 8b25ce9283..a69ee9b74f 100644 --- a/tests/integration/api_block_test.go +++ b/tests/integration/api_block_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_branch_test.go b/tests/integration/api_branch_test.go index df6b7022cd..63159f3c41 100644 --- a/tests/integration/api_branch_test.go +++ b/tests/integration/api_branch_test.go @@ -5,18 +5,18 @@ package integration import ( "net/http" - "net/http/httptest" "net/url" "testing" - auth_model "forgejo.org/models/auth" - git_model "forgejo.org/models/git" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func testAPIGetBranch(t *testing.T, branchName string, exists bool) { @@ -188,37 +188,6 @@ func testAPICreateBranch(t testing.TB, session *TestSession, user, repo, oldBran return resp.Result().StatusCode == status } -func TestAPIUpdateBranch(t *testing.T) { - onGiteaRun(t, func(t *testing.T, _ *url.URL) { - t.Run("UpdateBranchWithEmptyRepo", func(t *testing.T) { - testAPIUpdateBranch(t, "user10", "repo6", "master", "test", http.StatusNotFound) - }) - t.Run("UpdateBranchWithSameBranchNames", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "repo1", "master", "master", http.StatusUnprocessableEntity) - assert.Contains(t, resp.Body.String(), "Cannot rename a branch using the same name or rename to a branch that already exists.") - }) - t.Run("UpdateBranchThatAlreadyExists", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "repo1", "master", "branch2", http.StatusUnprocessableEntity) - assert.Contains(t, resp.Body.String(), "Cannot rename a branch using the same name or rename to a branch that already exists.") - }) - t.Run("UpdateBranchWithNonExistentBranch", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "repo1", "i-dont-exist", "new-branch-name", http.StatusNotFound) - assert.Contains(t, resp.Body.String(), "Branch doesn't exist.") - }) - t.Run("RenameBranchNormalScenario", func(t *testing.T) { - testAPIUpdateBranch(t, "user2", "repo1", "branch2", "new-branch-name", http.StatusNoContent) - }) - }) -} - -func testAPIUpdateBranch(t *testing.T, ownerName, repoName, from, to string, expectedHTTPStatus int) *httptest.ResponseRecorder { - token := getUserToken(t, ownerName, auth_model.AccessTokenScopeWriteRepository) - req := NewRequestWithJSON(t, "PATCH", "api/v1/repos/"+ownerName+"/"+repoName+"/branches/"+from, &api.UpdateBranchRepoOption{ - Name: to, - }).AddTokenAuth(token) - return MakeRequest(t, req, expectedHTTPStatus) -} - func TestAPIBranchProtection(t *testing.T) { defer tests.PrepareTestEnv(t)() @@ -265,17 +234,35 @@ func TestAPIBranchProtection(t *testing.T) { } func TestAPICreateBranchWithSyncBranches(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + branches, err := db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ + RepoID: 1, + }) + require.NoError(t, err) + assert.Len(t, branches, 4) + + // make a broke repository with no branch on database + _, err = db.DeleteByBean(db.DefaultContext, git_model.Branch{RepoID: 1}) + require.NoError(t, err) + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - unittest.AssertCount(t, &git_model.Branch{RepoID: 1}, 4) - - // make a broke repository with no branch on database - unittest.AssertSuccessfulDelete(t, &git_model.Branch{RepoID: 1}) - ctx := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) giteaURL.Path = ctx.GitPath() testAPICreateBranch(t, ctx.Session, "user2", "repo1", "", "new_branch", http.StatusCreated) - - unittest.AssertExistsIf(t, true, &git_model.Branch{RepoID: 1, Name: "new_branch"}) }) + + branches, err = db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ + RepoID: 1, + }) + require.NoError(t, err) + assert.Len(t, branches, 5) + + branches, err = db.Find[git_model.Branch](db.DefaultContext, git_model.FindBranchOptions{ + RepoID: 1, + Keyword: "new_branch", + }) + require.NoError(t, err) + assert.Len(t, branches, 1) } diff --git a/tests/integration/api_comment_attachment_test.go b/tests/integration/api_comment_attachment_test.go index 16eb3c9b12..db1b98a20f 100644 --- a/tests/integration/api_comment_attachment_test.go +++ b/tests/integration/api_comment_attachment_test.go @@ -12,15 +12,15 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "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" - api "forgejo.org/modules/structs" - "forgejo.org/services/convert" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_comment_test.go b/tests/integration/api_comment_test.go index fd0cadbb1a..a53b56d783 100644 --- a/tests/integration/api_comment_test.go +++ b/tests/integration/api_comment_test.go @@ -10,23 +10,21 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "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" - api "forgejo.org/modules/structs" - "forgejo.org/services/convert" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -const IssueIDNotExist = 10000 - func TestAPIListRepoComments(t *testing.T) { defer tests.PrepareTestEnv(t)() @@ -91,10 +89,6 @@ func TestAPIListIssueComments(t *testing.T) { expectedCount := unittest.GetCount(t, &issues_model.Comment{IssueID: issue.ID}, unittest.Cond("type = ?", issues_model.CommentTypeComment)) assert.Len(t, comments, expectedCount) - - req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/comments", repoOwner.Name, repo.Name, IssueIDNotExist). - AddTokenAuth(token) - MakeRequest(t, req, http.StatusNotFound) } func TestAPICreateComment(t *testing.T) { @@ -117,13 +111,6 @@ func TestAPICreateComment(t *testing.T) { DecodeJSON(t, resp, &updatedComment) assert.EqualValues(t, commentBody, updatedComment.Body) unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: updatedComment.ID, IssueID: issue.ID, Content: commentBody}) - - urlStr = fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/comments", - repoOwner.Name, repo.Name, IssueIDNotExist) - req = NewRequestWithValues(t, "POST", urlStr, map[string]string{ - "body": commentBody, - }).AddTokenAuth(token) - MakeRequest(t, req, http.StatusNotFound) } func TestAPICreateCommentAutoDate(t *testing.T) { @@ -477,7 +464,4 @@ func TestAPIListIssueTimeline(t *testing.T) { DecodeJSON(t, resp, &comments) expectedCount := unittest.GetCount(t, &issues_model.Comment{IssueID: issue.ID}) assert.Len(t, comments, expectedCount) - - req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/timeline", repoOwner.Name, repo.Name, IssueIDNotExist) - MakeRequest(t, req, http.StatusNotFound) } diff --git a/tests/integration/api_feed_plain_text_titles_test.go b/tests/integration/api_feed_plain_text_titles_test.go index 889d0a103a..b1247780d8 100644 --- a/tests/integration/api_feed_plain_text_titles_test.go +++ b/tests/integration/api_feed_plain_text_titles_test.go @@ -7,9 +7,9 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/feed_user_test.go b/tests/integration/api_feed_user_test.go similarity index 83% rename from tests/integration/feed_user_test.go rename to tests/integration/api_feed_user_test.go index dfcb33b35d..e0e5faed1b 100644 --- a/tests/integration/feed_user_test.go +++ b/tests/integration/api_feed_user_test.go @@ -4,37 +4,19 @@ package integration import ( - "encoding/xml" "net/http" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -// RSS is a struct to unmarshal RSS feeds test only -type RSS struct { - Channel struct { - Title string `xml:"title"` - Link string `xml:"link"` - Description string `xml:"description"` - PubDate string `xml:"pubDate"` - Items []struct { - Title string `xml:"title"` - Link string `xml:"link"` - Description string `xml:"description"` - PubDate string `xml:"pubDate"` - } `xml:"item"` - } `xml:"channel"` -} - func TestFeed(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestFeed")() + defer tests.AddFixtures("tests/integration/fixtures/TestFeed/")() defer tests.PrepareTestEnv(t)() t.Run("User", func(t *testing.T) { @@ -56,12 +38,6 @@ func TestFeed(t *testing.T) { data := resp.Body.String() assert.Contains(t, data, `= 3 { - hash := parts[0] - size, err := strconv.Atoi(parts[1]) - if err != nil { - continue - } - file := parts[2] - - checksum := Checksum{ - Hash: hash, - Size: size, - File: file, - } - - if isMD5Sum { - result.MD5Sum = append(result.MD5Sum, checksum) - } else if isBLAKE2b { - result.BLAKE2B = append(result.BLAKE2B, checksum) - } - } - } - } - - assert.Equal(t, "Forgejo", result.Origin) - assert.Equal(t, "Forgejo", result.Label) - assert.Equal(t, "Sisyphus", result.Suite) - assert.Equal(t, "x86_64", result.Architectures) - - assert.Len(t, result.MD5Sum, 3) - assert.Equal(t, "bbf7ae6b2f540673ed1cfc0266b5f319", result.MD5Sum[0].Hash) - assert.Equal(t, 1003, result.MD5Sum[0].Size) - assert.Equal(t, "base/pkglist.classic", result.MD5Sum[0].File) - - assert.Len(t, result.BLAKE2B, 3) - assert.Equal(t, "b527bf038895ce29107ec3a6d2eebd7c365e8ce5ab767276eeddd7c549a159025225cb0ecfdbf7b71da13db7e865e77bcb0e2dae4d21335df01a4a17e0056a70", result.BLAKE2B[0].Hash) - assert.Equal(t, 1003, result.BLAKE2B[0].Size) - assert.Equal(t, "base/pkglist.classic", result.BLAKE2B[0].File) - }) - - t.Run("pkglist.classic", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req = NewRequest(t, "GET", url+"/pkglist.classic") - resp := MakeRequest(t, req, http.StatusOK) - - body := resp.Body - defer body.Reset() - - type RpmHeader struct { - Magic [8]byte - Nindex uint32 - Hsize uint32 - } - - type RpmHdrIndex struct { - Tag uint32 - Type uint32 - Offset uint32 - Count uint32 - } - - type Metadata struct { - Name string - Version string - Release string - Summary []string - Description []string - BuildTime int - Size int - License string - Packager string - Group []string - URL string - Arch string - SourceRpm string - ProvideNames []string - RequireFlags []int - RequireNames []string - RequireVersions []string - ChangeLogTimes []int - ChangeLogNames []string - ChangeLogTexts []string - ProvideFlags []int - ProvideVersions []string - DirIndexes []int - BaseNames []string - DirNames []string - DistTag string - AptIndexLegacyFileName string - AptIndexLegacyFileSize int - MD5Sum string - BLAKE2B string - AptIndexLegacyDirectory string - } - - var result Metadata - - const rpmHeaderMagic = "\x8e\xad\xe8\x01\x00\x00\x00\x00" - - var hdr RpmHeader - for { - if err := binary.Read(body, binary.BigEndian, &hdr); err != nil { - if err == io.EOF { - break - } - require.NoError(t, err) - } - - if !bytes.Equal(hdr.Magic[:], []byte(rpmHeaderMagic)) { - require.NoError(t, err) - } - - nindex := hdr.Nindex - index := make([]RpmHdrIndex, nindex) - if err := binary.Read(body, binary.BigEndian, &index); err != nil { - require.NoError(t, err) - } - - data := make([]byte, hdr.Hsize) - if err := binary.Read(body, binary.BigEndian, &data); err != nil { - require.NoError(t, err) - } - - var indexPtrs []*RpmHdrIndex - for i := range index { - indexPtrs = append(indexPtrs, &index[i]) - } - - for _, idx := range indexPtrs { - tag := binary.BigEndian.Uint32([]byte{byte(idx.Tag >> 24), byte(idx.Tag >> 16), byte(idx.Tag >> 8), byte(idx.Tag)}) - typ := binary.BigEndian.Uint32([]byte{byte(idx.Type >> 24), byte(idx.Type >> 16), byte(idx.Type >> 8), byte(idx.Type)}) - offset := binary.BigEndian.Uint32([]byte{byte(idx.Offset >> 24), byte(idx.Offset >> 16), byte(idx.Offset >> 8), byte(idx.Offset)}) - count := binary.BigEndian.Uint32([]byte{byte(idx.Count >> 24), byte(idx.Count >> 16), byte(idx.Count >> 8), byte(idx.Count)}) - - if typ == 6 || typ == 8 || typ == 9 { - elem := data[offset:] - for j := uint32(0); j < count; j++ { - strEnd := bytes.IndexByte(elem, 0) - if strEnd == -1 { - require.NoError(t, err) - } - switch tag { - case 1000: - result.Name = string(elem[:strEnd]) - case 1001: - result.Version = string(elem[:strEnd]) - case 1002: - result.Release = string(elem[:strEnd]) - case 1004: - var summaries []string - for i := uint32(0); i < count; i++ { - summaries = append(summaries, string(elem[:strEnd])) - } - result.Summary = summaries - case 1005: - var descriptions []string - for i := uint32(0); i < count; i++ { - descriptions = append(descriptions, string(elem[:strEnd])) - } - result.Description = descriptions - case 1014: - result.License = string(elem[:strEnd]) - case 1015: - result.Packager = string(elem[:strEnd]) - case 1016: - var groups []string - for i := uint32(0); i < count; i++ { - groups = append(groups, string(elem[:strEnd])) - } - result.Group = groups - case 1020: - result.URL = string(elem[:strEnd]) - case 1022: - result.Arch = string(elem[:strEnd]) - case 1044: - result.SourceRpm = string(elem[:strEnd]) - case 1047: - var provideNames []string - for i := uint32(0); i < count; i++ { - provideNames = append(provideNames, string(elem[:strEnd])) - } - result.ProvideNames = provideNames - case 1049: - var requireNames []string - for i := uint32(0); i < count; i++ { - requireNames = append(requireNames, string(elem[:strEnd])) - } - result.RequireNames = requireNames - case 1050: - var requireVersions []string - for i := uint32(0); i < count; i++ { - requireVersions = append(requireVersions, string(elem[:strEnd])) - } - result.RequireVersions = requireVersions - case 1081: - var changeLogNames []string - for i := uint32(0); i < count; i++ { - changeLogNames = append(changeLogNames, string(elem[:strEnd])) - } - result.ChangeLogNames = changeLogNames - case 1082: - var changeLogTexts []string - for i := uint32(0); i < count; i++ { - changeLogTexts = append(changeLogTexts, string(elem[:strEnd])) - } - result.ChangeLogTexts = changeLogTexts - case 1113: - var provideVersions []string - for i := uint32(0); i < count; i++ { - provideVersions = append(provideVersions, string(elem[:strEnd])) - } - result.ProvideVersions = provideVersions - case 1117: - var baseNames []string - for i := uint32(0); i < count; i++ { - baseNames = append(baseNames, string(elem[:strEnd])) - } - result.BaseNames = baseNames - case 1118: - var dirNames []string - for i := uint32(0); i < count; i++ { - dirNames = append(dirNames, string(elem[:strEnd])) - } - result.DirNames = dirNames - case 1155: - result.DistTag = string(elem[:strEnd]) - case 1000000: - result.AptIndexLegacyFileName = string(elem[:strEnd]) - case 1000005: - result.MD5Sum = string(elem[:strEnd]) - case 1000009: - result.BLAKE2B = string(elem[:strEnd]) - case 1000010: - result.AptIndexLegacyDirectory = string(elem[:strEnd]) - } - elem = elem[strEnd+1:] - } - } else if typ == 4 { - elem := data[offset:] - for j := uint32(0); j < count; j++ { - val := binary.BigEndian.Uint32(elem) - switch tag { - case 1006: - result.BuildTime = int(val) - case 1009: - result.Size = int(val) - case 1048: - var requireFlags []int - for i := uint32(0); i < count; i++ { - requireFlags = append(requireFlags, int(val)) - } - result.RequireFlags = requireFlags - case 1080: - var changeLogTimes []int - for i := uint32(0); i < count; i++ { - changeLogTimes = append(changeLogTimes, int(val)) - } - result.ChangeLogTimes = changeLogTimes - case 1112: - var provideFlags []int - for i := uint32(0); i < count; i++ { - provideFlags = append(provideFlags, int(val)) - } - result.ProvideFlags = provideFlags - case 1116: - var dirIndexes []int - for i := uint32(0); i < count; i++ { - dirIndexes = append(dirIndexes, int(val)) - } - result.DirIndexes = dirIndexes - case 1000001: - result.AptIndexLegacyFileSize = int(val) - } - elem = elem[4:] - } - } else { - require.NoError(t, err) - } - } - } - assert.Equal(t, "gitea-test", result.Name) - assert.Equal(t, "1.0.2", result.Version) - assert.Equal(t, "1", result.Release) - assert.Equal(t, []string{"RPM package summary"}, result.Summary) - assert.Equal(t, []string{"RPM package description"}, result.Description) - assert.Equal(t, 1678225964, result.BuildTime) - assert.Equal(t, 13, result.Size) - assert.Equal(t, "MIT", result.License) - assert.Equal(t, "KN4CK3R", result.Packager) - assert.Equal(t, []string{"System"}, result.Group) - assert.Equal(t, "https://gitea.io", result.URL) - assert.Equal(t, "x86_64", result.Arch) - assert.Equal(t, "gitea-test-1.0.2-1.src.rpm", result.SourceRpm) - assert.Equal(t, []string{"", ""}, result.ProvideNames) - assert.Equal(t, []int{16777226, 16777226, 16777226, 16777226, 16777226, 16777226, 16777226}, result.RequireFlags) - assert.Equal(t, []string{"", "", "", "", "", "", ""}, result.RequireNames) - assert.Equal(t, []string{"5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1", "5.2-1"}, result.RequireVersions) - assert.Equal(t, []int{1678276800}, result.ChangeLogTimes) - assert.Equal(t, []string{"KN4CK3R "}, result.ChangeLogNames) - assert.Equal(t, []string{"- Changelog message."}, result.ChangeLogTexts) - assert.Equal(t, []int{8, 8}, result.ProvideFlags) - assert.Equal(t, []string{"1.0.2-1", "1.0.2-1"}, result.ProvideVersions) - assert.Equal(t, []int(nil), result.DirIndexes) - assert.Equal(t, []string{"hello"}, result.BaseNames) - assert.Equal(t, []string{"/usr/local/bin/"}, result.DirNames) - assert.Equal(t, "", result.DistTag) - assert.Equal(t, "gitea-test-1.0.2-1.x86_64.rpm", result.AptIndexLegacyFileName) - assert.Equal(t, 7116, result.AptIndexLegacyFileSize) - assert.Equal(t, "9ea82dd62968719aea19c08cd2ced79a", result.MD5Sum) - assert.Equal(t, "8ba7f1f52a47b23997aa2de21b305cc71974d51f0c54fb53cb927156284dafdcc233d514a46c020e4a0666e218529e0284933c5873d24c2555830d7627140f7d", result.BLAKE2B) - assert.Equal(t, "RPMS.classic", result.AptIndexLegacyDirectory) - }) - - t.Run("pkglist.classic.xz", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", url+"/pkglist.classic.xz") - pkglistXZResp := MakeRequest(t, req, http.StatusOK) - pkglistXZ := pkglistXZResp.Body - defer pkglistXZ.Reset() - - req2 := NewRequest(t, "GET", url+"/pkglist.classic") - pkglistResp := MakeRequest(t, req2, http.StatusOK) - pkglist := pkglistResp.Body - defer pkglist.Reset() - - assert.Less(t, pkglistXZ.Len(), pkglist.Len()) - - xzReader, err := xz.NewReader(pkglistXZ) - require.NoError(t, err) - - var unxzData bytes.Buffer - _, err = io.Copy(&unxzData, xzReader) - require.NoError(t, err) - - assert.Equal(t, unxzData.Len(), pkglist.Len()) - - content, _ := packages_module.NewHashedBuffer() - defer content.Close() - - h := sha256.New() - w := io.MultiWriter(content, h) - - _, err = io.Copy(w, pkglist) - require.NoError(t, err) - - hashMD5Classic, _, hashSHA256Classic, _, hashBlake2bClassic := content.Sums() - - contentUnxz, _ := packages_module.NewHashedBuffer() - defer contentUnxz.Close() - - _, err = io.Copy(io.MultiWriter(contentUnxz, sha256.New()), &unxzData) - require.NoError(t, err) - - hashMD5Unxz, _, hashSHA256Unxz, _, hashBlake2bUnxz := contentUnxz.Sums() - - assert.Equal(t, fmt.Sprintf("%x", hashSHA256Classic), fmt.Sprintf("%x", hashSHA256Unxz)) - assert.Equal(t, fmt.Sprintf("%x", hashBlake2bClassic), fmt.Sprintf("%x", hashBlake2bUnxz)) - assert.Equal(t, fmt.Sprintf("%x", hashMD5Classic), fmt.Sprintf("%x", hashMD5Unxz)) - }) - }) - - t.Run("Delete", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "DELETE", fmt.Sprintf("%s.repo/%s/RPMS.classic/%s-%s.%s.rpm", groupURL, packageArchitecture, packageName, packageVersion, packageArchitecture)) - MakeRequest(t, req, http.StatusUnauthorized) - - req = NewRequest(t, "DELETE", fmt.Sprintf("%s.repo/%s/RPMS.classic/%s-%s.%s.rpm", groupURL, packageArchitecture, packageName, packageVersion, packageArchitecture)). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusNoContent) - - pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeAlt) - require.NoError(t, err) - assert.Empty(t, pvs) - req = NewRequest(t, "DELETE", fmt.Sprintf("%s.repo/%s/RPMS.classic/%s-%s.%s.rpm", groupURL, packageArchitecture, packageName, packageVersion, packageArchitecture)). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusNotFound) - }) - }) - } -} diff --git a/tests/integration/api_packages_arch_test.go b/tests/integration/api_packages_arch_test.go index 2463fd1c8e..8651af4a58 100644 --- a/tests/integration/api_packages_arch_test.go +++ b/tests/integration/api_packages_arch_test.go @@ -18,12 +18,12 @@ import ( "testing" "testing/fstest" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - arch_model "forgejo.org/modules/packages/arch" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + arch_model "code.gitea.io/gitea/modules/packages/arch" + "code.gitea.io/gitea/tests" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/packet" @@ -223,14 +223,8 @@ HMhNSS1IzUsBcpJAPFAwwUXSM0u4BjoaR8EoGAWjgGQAAILFeyQADAAA t.Run(fmt.Sprintf("RepositoryDB[%s]", group), func(t *testing.T) { defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", groupURL+"/x86_64/base.db.tar.gz") - MakeRequest(t, req, http.StatusOK) - - req = NewRequest(t, "GET", groupURL+"/x86_64/base.files") - MakeRequest(t, req, http.StatusOK) - - req = NewRequest(t, "GET", groupURL+"/x86_64/base.files.tar.gz") - MakeRequest(t, req, http.StatusOK) + req := NewRequest(t, "GET", rootURL+"/repository.key") + respPub := MakeRequest(t, req, http.StatusOK) req = NewRequest(t, "GET", groupURL+"/x86_64/base.db") respPkg := MakeRequest(t, req, http.StatusOK) @@ -238,32 +232,23 @@ HMhNSS1IzUsBcpJAPFAwwUXSM0u4BjoaR8EoGAWjgGQAAILFeyQADAAA req = NewRequest(t, "GET", groupURL+"/x86_64/base.db.sig") respSig := MakeRequest(t, req, http.StatusOK) - req = NewRequest(t, "GET", rootURL+"/repository.key") - respPub := MakeRequest(t, req, http.StatusOK) - if err := gpgVerify(respPub.Body.Bytes(), respSig.Body.Bytes(), respPkg.Body.Bytes()); err != nil { t.Fatal(err) } files, err := listTarGzFiles(respPkg.Body.Bytes()) require.NoError(t, err) - require.Len(t, files, 2) + require.Len(t, files, 1) for s, d := range files { - if strings.HasSuffix(s, "/desc") { - name := getProperty(string(d.Data), "NAME") - ver := getProperty(string(d.Data), "VERSION") - require.Equal(t, name+"-"+ver+"/desc", s) - fn := getProperty(string(d.Data), "FILENAME") - pgp := getProperty(string(d.Data), "PGPSIG") - req = NewRequest(t, "GET", groupURL+"/x86_64/"+fn+".sig") - respSig := MakeRequest(t, req, http.StatusOK) - decodeString, err := base64.StdEncoding.DecodeString(pgp) - require.NoError(t, err) - require.Equal(t, respSig.Body.Bytes(), decodeString) - } else if strings.HasSuffix(s, "/files") { - require.True(t, strings.HasPrefix(string(d.Data), "%FILES%")) - } else { - require.Failf(t, "unknown item", "fileName:%s", s) - } + name := getProperty(string(d.Data), "NAME") + ver := getProperty(string(d.Data), "VERSION") + require.Equal(t, name+"-"+ver+"/desc", s) + fn := getProperty(string(d.Data), "FILENAME") + pgp := getProperty(string(d.Data), "PGPSIG") + req = NewRequest(t, "GET", groupURL+"/x86_64/"+fn+".sig") + respSig := MakeRequest(t, req, http.StatusOK) + decodeString, err := base64.StdEncoding.DecodeString(pgp) + require.NoError(t, err) + require.Equal(t, respSig.Body.Bytes(), decodeString) } }) @@ -290,7 +275,7 @@ HMhNSS1IzUsBcpJAPFAwwUXSM0u4BjoaR8EoGAWjgGQAAILFeyQADAAA respPkg := MakeRequest(t, req, http.StatusOK) files, err := listTarGzFiles(respPkg.Body.Bytes()) require.NoError(t, err) - require.Len(t, files, 2) + require.Len(t, files, 1) req = NewRequestWithBody(t, "DELETE", groupURL+"/test2/1.0.0-1/any", nil). AddBasicAuth(user.Name) @@ -362,7 +347,7 @@ HMhNSS1IzUsBcpJAPFAwwUXSM0u4BjoaR8EoGAWjgGQAAILFeyQADAAA files, err := listTarGzFiles(respPkg.Body.Bytes()) require.NoError(t, err) - require.Len(t, files, 2) + require.Len(t, files, 1) req = NewRequestWithBody(t, "PUT", rootURL, bytes.NewReader(pkgs["otherXZ"])). AddBasicAuth(user.Name) @@ -373,7 +358,7 @@ HMhNSS1IzUsBcpJAPFAwwUXSM0u4BjoaR8EoGAWjgGQAAILFeyQADAAA files, err = listTarGzFiles(respPkg.Body.Bytes()) require.NoError(t, err) - require.Len(t, files, 4) + require.Len(t, files, 2) }) } diff --git a/tests/integration/api_packages_cargo_test.go b/tests/integration/api_packages_cargo_test.go index 048859e312..7a9105eb3a 100644 --- a/tests/integration/api_packages_cargo_test.go +++ b/tests/integration/api_packages_cargo_test.go @@ -12,19 +12,19 @@ import ( neturl "net/url" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" - cargo_module "forgejo.org/modules/packages/cargo" - "forgejo.org/modules/setting" - cargo_router "forgejo.org/routers/api/packages/cargo" - gitea_context "forgejo.org/services/context" - cargo_service "forgejo.org/services/packages/cargo" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "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/modules/gitrepo" + "code.gitea.io/gitea/modules/json" + cargo_module "code.gitea.io/gitea/modules/packages/cargo" + "code.gitea.io/gitea/modules/setting" + cargo_router "code.gitea.io/gitea/routers/api/packages/cargo" + gitea_context "code.gitea.io/gitea/services/context" + cargo_service "code.gitea.io/gitea/services/packages/cargo" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_chef_test.go b/tests/integration/api_packages_chef_test.go index 390ac50688..febb1a8b6c 100644 --- a/tests/integration/api_packages_chef_test.go +++ b/tests/integration/api_packages_chef_test.go @@ -25,14 +25,14 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - chef_module "forgejo.org/modules/packages/chef" - "forgejo.org/modules/setting" - chef_router "forgejo.org/routers/api/packages/chef" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + chef_module "code.gitea.io/gitea/modules/packages/chef" + "code.gitea.io/gitea/modules/setting" + chef_router "code.gitea.io/gitea/routers/api/packages/chef" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_composer_test.go b/tests/integration/api_packages_composer_test.go index 9c906a8959..9d25cc4d64 100644 --- a/tests/integration/api_packages_composer_test.go +++ b/tests/integration/api_packages_composer_test.go @@ -11,15 +11,14 @@ import ( neturl "net/url" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - composer_module "forgejo.org/modules/packages/composer" - "forgejo.org/modules/setting" - "forgejo.org/routers/api/packages/composer" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + composer_module "code.gitea.io/gitea/modules/packages/composer" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/api/packages/composer" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -219,39 +218,5 @@ func TestPackageComposer(t *testing.T) { assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum) assert.Len(t, pkgs[0].Bin, 1) assert.Equal(t, packageBin, pkgs[0].Bin[0]) - - // Test package linked to repository - repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - userPkgs, err := packages.GetPackagesByType(db.DefaultContext, user.ID, packages.TypeComposer) - require.NoError(t, err) - assert.Len(t, userPkgs, 1) - assert.EqualValues(t, 0, userPkgs[0].RepoID) - - err = packages.SetRepositoryLink(db.DefaultContext, userPkgs[0].ID, repo1.ID) - require.NoError(t, err) - - req = NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName)). - AddBasicAuth(user.Name) - resp = MakeRequest(t, req, http.StatusOK) - - result = composer.PackageMetadataResponse{} - DecodeJSON(t, resp, &result) - - assert.Contains(t, result.Packages, packageName) - pkgs = result.Packages[packageName] - assert.Len(t, pkgs, 1) - assert.Equal(t, packageName, pkgs[0].Name) - assert.Equal(t, packageVersion, pkgs[0].Version) - assert.Equal(t, packageType, pkgs[0].Type) - assert.Equal(t, packageDescription, pkgs[0].Description) - assert.Len(t, pkgs[0].Authors, 1) - assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name) - assert.Equal(t, "zip", pkgs[0].Dist.Type) - assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum) - assert.Len(t, pkgs[0].Bin, 1) - assert.Equal(t, packageBin, pkgs[0].Bin[0]) - assert.Equal(t, repo1.HTMLURL(), pkgs[0].Source.URL) - assert.Equal(t, "git", pkgs[0].Source.Type) - assert.Equal(t, packageVersion, pkgs[0].Source.Reference) }) } diff --git a/tests/integration/api_packages_conan_test.go b/tests/integration/api_packages_conan_test.go index c0185c852d..9d8f435068 100644 --- a/tests/integration/api_packages_conan_test.go +++ b/tests/integration/api_packages_conan_test.go @@ -11,16 +11,16 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/packages" - conan_model "forgejo.org/models/packages/conan" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - conan_module "forgejo.org/modules/packages/conan" - "forgejo.org/modules/setting" - conan_router "forgejo.org/routers/api/packages/conan" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + conan_model "code.gitea.io/gitea/models/packages/conan" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + conan_module "code.gitea.io/gitea/modules/packages/conan" + "code.gitea.io/gitea/modules/setting" + conan_router "code.gitea.io/gitea/routers/api/packages/conan" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_conda_test.go b/tests/integration/api_packages_conda_test.go index 6924968d35..4625c5854c 100644 --- a/tests/integration/api_packages_conda_test.go +++ b/tests/integration/api_packages_conda_test.go @@ -12,13 +12,13 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - conda_module "forgejo.org/modules/packages/conda" - "forgejo.org/modules/zstd" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + conda_module "code.gitea.io/gitea/modules/packages/conda" + "code.gitea.io/gitea/modules/zstd" + "code.gitea.io/gitea/tests" "github.com/dsnet/compress/bzip2" "github.com/stretchr/testify/assert" diff --git a/tests/integration/api_packages_container_cleanup_sha256_test.go b/tests/integration/api_packages_container_cleanup_sha256_test.go index b1ed435b80..eb63eff720 100644 --- a/tests/integration/api_packages_container_cleanup_sha256_test.go +++ b/tests/integration/api_packages_container_cleanup_sha256_test.go @@ -12,17 +12,17 @@ import ( "testing" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - packages_module "forgejo.org/modules/packages" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - packages_cleanup "forgejo.org/services/packages/cleanup" - packages_container "forgejo.org/services/packages/container" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + packages_cleanup "code.gitea.io/gitea/services/packages/cleanup" + packages_container "code.gitea.io/gitea/services/packages/container" + "code.gitea.io/gitea/tests" oci "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/assert" diff --git a/tests/integration/api_packages_container_test.go b/tests/integration/api_packages_container_test.go index 223c865dec..3c28f45660 100644 --- a/tests/integration/api_packages_container_test.go +++ b/tests/integration/api_packages_container_test.go @@ -13,17 +13,17 @@ import ( "sync" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - container_module "forgejo.org/modules/packages/container" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + container_module "code.gitea.io/gitea/modules/packages/container" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" oci "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/assert" diff --git a/tests/integration/api_packages_cran_test.go b/tests/integration/api_packages_cran_test.go index 2326d36171..31864d1ab7 100644 --- a/tests/integration/api_packages_cran_test.go +++ b/tests/integration/api_packages_cran_test.go @@ -12,12 +12,12 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - cran_module "forgejo.org/modules/packages/cran" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + cran_module "code.gitea.io/gitea/modules/packages/cran" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -116,14 +116,6 @@ func TestPackageCran(t *testing.T) { MakeRequest(t, req, http.StatusOK) }) - t.Run("DownloadArchived", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", fmt.Sprintf("%s/src/contrib/Archive/%s/%s_%s.tar.gz", url, packageName, packageName, packageVersion)). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusOK) - }) - t.Run("Enumerate", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/api_packages_debian_test.go b/tests/integration/api_packages_debian_test.go index 67498ec043..d85f56fdbb 100644 --- a/tests/integration/api_packages_debian_test.go +++ b/tests/integration/api_packages_debian_test.go @@ -13,13 +13,13 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - debian_module "forgejo.org/modules/packages/debian" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + debian_module "code.gitea.io/gitea/modules/packages/debian" + "code.gitea.io/gitea/tests" "github.com/blakesmith/ar" "github.com/stretchr/testify/assert" diff --git a/tests/integration/api_packages_generic_test.go b/tests/integration/api_packages_generic_test.go index 5a3727cae5..1a53f33387 100644 --- a/tests/integration/api_packages_generic_test.go +++ b/tests/integration/api_packages_generic_test.go @@ -10,12 +10,12 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "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" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_goproxy_test.go b/tests/integration/api_packages_goproxy_test.go index 1534fa73cc..716d90b242 100644 --- a/tests/integration/api_packages_goproxy_test.go +++ b/tests/integration/api_packages_goproxy_test.go @@ -11,11 +11,11 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_helm_test.go b/tests/integration/api_packages_helm_test.go index df19e7cd03..4b48b74ce0 100644 --- a/tests/integration/api_packages_helm_test.go +++ b/tests/integration/api_packages_helm_test.go @@ -12,13 +12,13 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - helm_module "forgejo.org/modules/packages/helm" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + helm_module "code.gitea.io/gitea/modules/packages/helm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_maven_test.go b/tests/integration/api_packages_maven_test.go index 438c2f0fb5..7ada3b28ac 100644 --- a/tests/integration/api_packages_maven_test.go +++ b/tests/integration/api_packages_maven_test.go @@ -8,15 +8,14 @@ import ( "net/http" "strconv" "strings" - "sync" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/packages/maven" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages/maven" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -255,35 +254,3 @@ func TestPackageMaven(t *testing.T) { assert.NotContains(t, resp.Body.String(), "Internal server error") }) } - -func TestPackageMavenConcurrent(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - groupID := "com.gitea" - artifactID := "test-project" - packageVersion := "1.0.1" - - root := fmt.Sprintf("/api/packages/%s/maven/%s/%s", user.Name, strings.ReplaceAll(groupID, ".", "/"), artifactID) - - putFile := func(t *testing.T, path, content string, expectedStatus int) { - req := NewRequestWithBody(t, "PUT", root+path, strings.NewReader(content)). - AddBasicAuth(user.Name) - MakeRequest(t, req, expectedStatus) - } - - t.Run("Concurrent Upload", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func(i int) { - putFile(t, fmt.Sprintf("/%s/%s.jar", packageVersion, strconv.Itoa(i)), "test", http.StatusCreated) - wg.Done() - }(i) - } - wg.Wait() - }) -} diff --git a/tests/integration/api_packages_npm_test.go b/tests/integration/api_packages_npm_test.go index 38c7ee54c0..d0c54c306b 100644 --- a/tests/integration/api_packages_npm_test.go +++ b/tests/integration/api_packages_npm_test.go @@ -11,14 +11,14 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/packages/npm" - "forgejo.org/modules/setting" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages/npm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_nuget_test.go b/tests/integration/api_packages_nuget_test.go index b4da9695f0..03e2176fe5 100644 --- a/tests/integration/api_packages_nuget_test.go +++ b/tests/integration/api_packages_nuget_test.go @@ -17,16 +17,16 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - nuget_module "forgejo.org/modules/packages/nuget" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/routers/api/packages/nuget" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + nuget_module "code.gitea.io/gitea/modules/packages/nuget" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/routers/api/packages/nuget" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -49,9 +49,6 @@ func TestPackageNuGet(t *testing.T) { Version string `xml:"Version"` NormalizedVersion string `xml:"NormalizedVersion"` Authors string `xml:"Authors"` - Owners string `xml:"Owners,omitempty"` - Copyright string `xml:"Copyright,omitempty"` - Language string `xml:"Language,omitempty"` Dependencies string `xml:"Dependencies"` Description string `xml:"Description"` VersionDownloadCount nuget.TypedValue[int64] `xml:"VersionDownloadCount"` @@ -61,15 +58,9 @@ func TestPackageNuGet(t *testing.T) { LastUpdated nuget.TypedValue[time.Time] `xml:"LastUpdated"` Published nuget.TypedValue[time.Time] `xml:"Published"` ProjectURL string `xml:"ProjectUrl,omitempty"` - LicenseURL string `xml:"LicenseUrl,omitempty"` - IconURL string `xml:"IconUrl,omitempty"` ReleaseNotes string `xml:"ReleaseNotes,omitempty"` RequireLicenseAcceptance nuget.TypedValue[bool] `xml:"RequireLicenseAcceptance"` - DevelopmentDependency nuget.TypedValue[bool] `xml:"DevelopmentDependency"` Title string `xml:"Title"` - MinClientVersion string `xml:"MinClientVersion,omitempty"` - Tags string `xml:"Tags,omitempty"` - ID string `xml:"Id,omitempty"` } type FeedEntry struct { @@ -96,43 +87,21 @@ func TestPackageNuGet(t *testing.T) { packageName := "test.package" packageVersion := "1.0.3" packageAuthors := "KN4CK3R" - packageDescription := "Forgejo Test Package" + packageDescription := "Gitea Test Package" symbolFilename := "test.pdb" symbolID := "d910bb6948bd4c6cb40155bcf52c3c94" - packageTitle := "Package Title" - packageLanguage := "Package Language" - packageOwners := "Package Owners" - packageCopyright := "Package Copyright" - packageProjectURL := "https://forgejo.org" - packageLicenseURL := "https://forgejo.org/docs/latest/license/" - packageIconURL := "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png" - packageReleaseNotes := "Package Release Notes" - packageTags := "tag_1 tag_2 tag_3" - packageMinClientVersion := "1.0.0.0" - createPackage := func(id, version string) io.Reader { var buf bytes.Buffer archive := zip.NewWriter(&buf) w, _ := archive.Create("package.nuspec") w.Write([]byte(` - + ` + id + ` - ` + packageTitle + ` - ` + packageLanguage + ` ` + version + ` ` + packageAuthors + ` - ` + packageOwners + ` - ` + packageCopyright + ` - true - true - ` + packageProjectURL + ` - ` + packageLicenseURL + ` - ` + packageIconURL + ` ` + packageDescription + ` - ` + packageReleaseNotes + ` - ` + packageTags + ` @@ -146,22 +115,11 @@ func TestPackageNuGet(t *testing.T) { nuspec := ` - + ` + packageName + ` - ` + packageTitle + ` - ` + packageLanguage + ` ` + packageVersion + ` ` + packageAuthors + ` - ` + packageOwners + ` - ` + packageCopyright + ` - true - true - ` + packageProjectURL + ` - ` + packageLicenseURL + ` - ` + packageIconURL + ` ` + packageDescription + ` - ` + packageReleaseNotes + ` - ` + packageTags + ` @@ -367,7 +325,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) require.NoError(t, err) - assert.Equal(t, int64(len(content)), pb.Size) + assert.Equal(t, int64(414), pb.Size) case fmt.Sprintf("%s.%s.snupkg", packageName, packageVersion): assert.False(t, pf.IsLead) @@ -379,7 +337,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) require.NoError(t, err) - assert.Equal(t, int64(len([]byte(nuspec))), pb.Size) + assert.Equal(t, int64(453), pb.Size) case symbolFilename: assert.False(t, pf.IsLead) @@ -710,22 +668,10 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) var result FeedEntry decodeXML(t, resp, &result) - assert.Equal(t, packageName, result.Properties.ID) + assert.Equal(t, packageName, result.Properties.Title) assert.Equal(t, packageVersion, result.Properties.Version) assert.Equal(t, packageAuthors, result.Properties.Authors) assert.Equal(t, packageDescription, result.Properties.Description) - assert.Equal(t, packageTitle, result.Properties.Title) - assert.Equal(t, packageLanguage, result.Properties.Language) - assert.Equal(t, packageOwners, result.Properties.Owners) - assert.Equal(t, packageCopyright, result.Properties.Copyright) - assert.Equal(t, packageProjectURL, result.Properties.ProjectURL) - assert.Equal(t, packageLicenseURL, result.Properties.LicenseURL) - assert.Equal(t, packageIconURL, result.Properties.IconURL) - assert.Equal(t, packageReleaseNotes, result.Properties.ReleaseNotes) - assert.Equal(t, packageTags, result.Properties.Tags) - assert.Equal(t, packageMinClientVersion, result.Properties.MinClientVersion) - assert.True(t, result.Properties.DevelopmentDependency.Value) - assert.True(t, result.Properties.RequireLicenseAcceptance.Value) assert.Equal(t, "Microsoft.CSharp:4.5.0:.NETStandard2.0", result.Properties.Dependencies) }) diff --git a/tests/integration/api_packages_pub_test.go b/tests/integration/api_packages_pub_test.go index 72ba2f14cd..d6bce3055e 100644 --- a/tests/integration/api_packages_pub_test.go +++ b/tests/integration/api_packages_pub_test.go @@ -15,13 +15,13 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - pub_module "forgejo.org/modules/packages/pub" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + pub_module "code.gitea.io/gitea/modules/packages/pub" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_packages_pypi_test.go b/tests/integration/api_packages_pypi_test.go index f025f8e577..ef03dbe509 100644 --- a/tests/integration/api_packages_pypi_test.go +++ b/tests/integration/api_packages_pypi_test.go @@ -13,12 +13,12 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/packages/pypi" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages/pypi" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,16 +33,15 @@ func TestPackagePyPI(t *testing.T) { packageVersion := "1!1.0.1+r1234" packageAuthor := "KN4CK3R" packageDescription := "Test Description" - projectURL := "https://example.com" content := "test" hashSHA256 := "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" root := fmt.Sprintf("/api/packages/%s/pypi", user.Name) - createBasicMultipartFile := func(filename, packageName, content string) (body *bytes.Buffer, writer *multipart.Writer, closer func() error) { - body = &bytes.Buffer{} - writer = multipart.NewWriter(body) + uploadFile := func(t *testing.T, filename, content string, expectedStatus int) { + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) part, _ := writer.CreateFormFile("content", filename) _, _ = io.Copy(part, strings.NewReader(content)) @@ -54,27 +53,14 @@ func TestPackagePyPI(t *testing.T) { writer.WriteField("sha256_digest", hashSHA256) writer.WriteField("requires_python", "3.6") - return body, writer, writer.Close - } + _ = writer.Close() - uploadHelper := func(t *testing.T, body *bytes.Buffer, contentType string, expectedStatus int) { req := NewRequestWithBody(t, "POST", root, body). - SetHeader("Content-Type", contentType). + SetHeader("Content-Type", writer.FormDataContentType()). AddBasicAuth(user.Name) MakeRequest(t, req, expectedStatus) } - uploadFile := func(t *testing.T, filename, content string, expectedStatus int) { - body, writer, closeFunc := createBasicMultipartFile(filename, packageName, content) - - writer.WriteField("project_urls", "DOCUMENTATION , https://readthedocs.org") - writer.WriteField("project_urls", fmt.Sprintf("Home-page, %s", projectURL)) - - _ = closeFunc() - - uploadHelper(t, body, writer.FormDataContentType(), expectedStatus) - } - t.Run("Upload", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -89,7 +75,6 @@ func TestPackagePyPI(t *testing.T) { require.NoError(t, err) assert.Nil(t, pd.SemVer) assert.IsType(t, &pypi.Metadata{}, pd.Metadata) - assert.Equal(t, projectURL, pd.Metadata.(*pypi.Metadata).ProjectURL) assert.Equal(t, packageName, pd.Package.Name) assert.Equal(t, packageVersion, pd.Version.Version) @@ -149,48 +134,6 @@ func TestPackagePyPI(t *testing.T) { uploadFile(t, "test.tar.gz", content, http.StatusConflict) }) - t.Run("UploadUsingDeprecatedHomepageMetadata", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - pkgName := "homepage-package" - body, writer, closeFunc := createBasicMultipartFile("test.whl", pkgName, content) - - writer.WriteField("home_page", projectURL) - - _ = closeFunc() - - uploadHelper(t, body, writer.FormDataContentType(), http.StatusCreated) - - pvs, err := packages.GetVersionsByPackageName(db.DefaultContext, user.ID, packages.TypePyPI, pkgName) - require.NoError(t, err) - assert.Len(t, pvs, 1) - - pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) - require.NoError(t, err) - assert.IsType(t, &pypi.Metadata{}, pd.Metadata) - assert.Equal(t, projectURL, pd.Metadata.(*pypi.Metadata).ProjectURL) - }) - - t.Run("UploadWithoutAnyHomepageURLMetadata", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - pkgName := "no-project-url-or-homepage-package" - body, writer, closeFunc := createBasicMultipartFile("test.whl", pkgName, content) - - _ = closeFunc() - - uploadHelper(t, body, writer.FormDataContentType(), http.StatusCreated) - - pvs, err := packages.GetVersionsByPackageName(db.DefaultContext, user.ID, packages.TypePyPI, pkgName) - require.NoError(t, err) - assert.Len(t, pvs, 1) - - pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) - require.NoError(t, err) - assert.IsType(t, &pypi.Metadata{}, pd.Metadata) - assert.Empty(t, pd.Metadata.(*pypi.Metadata).ProjectURL) - }) - t.Run("Download", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -205,7 +148,7 @@ func TestPackagePyPI(t *testing.T) { downloadFile("test.whl") downloadFile("test.tar.gz") - pvs, err := packages.GetVersionsByPackageName(db.DefaultContext, user.ID, packages.TypePyPI, packageName) + pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypePyPI) require.NoError(t, err) assert.Len(t, pvs, 1) assert.Equal(t, int64(2), pvs[0].DownloadCount) diff --git a/tests/integration/api_packages_rpm_test.go b/tests/integration/api_packages_rpm_test.go index 3abaec3462..853c8f0f69 100644 --- a/tests/integration/api_packages_rpm_test.go +++ b/tests/integration/api_packages_rpm_test.go @@ -15,14 +15,14 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - rpm_module "forgejo.org/modules/packages/rpm" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + rpm_module "code.gitea.io/gitea/modules/packages/rpm" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/tests" "github.com/ProtonMail/go-crypto/openpgp" "github.com/sassoftware/go-rpmutils" diff --git a/tests/integration/api_packages_rubygems_test.go b/tests/integration/api_packages_rubygems_test.go index 97c2c8bb5f..eb3dc0e7f2 100644 --- a/tests/integration/api_packages_rubygems_test.go +++ b/tests/integration/api_packages_rubygems_test.go @@ -14,12 +14,12 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/packages/rubygems" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages/rubygems" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -201,137 +201,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`) holaChecksum := fmt.Sprintf("%x", sha256.Sum256(holaGemContent)) - binaryPackageName := "debug_inspector" - binaryPackageVersion := "0.0.3" - binaryRubyGemsRequirements := "ruby:~> 3.1.0" - binaryGemContent, _ := base64.StdEncoding.DecodeString(`bWV0YWRhdGEuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA0NDQAMDAwMDAw -MAAwMDAwMDAwADAwMDAwMDAxMTM0ADE0NDQyNjI3NzcyADAxMzQ1NAAgMAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVsAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAw -MDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf -iwgA+i+LZAIDxVRbb9MwFH73rzB9KTzksnYrkyUmKm1CRaqECuIBhCInOU28xRdsZ7Sa4LdznN7W -bExcHkgi5ficz+d852JHUUSf2TZfJzq/hsKzNyAZe2+gEEtRcC+0IopLYLSEvK0yoRzavLbkFqxD -K3tk+8eNiVC6B6VxGo+JabhfaisZXZ1Psslp1AjVriLZuobw1tfaOkYi+lbXis65sPR5zpVwHuxS -gCpfBJC28LUVFhjJhSqFZRT/pADrs6LmAmN9/kJK7pHyKD15GaVnUXpO05R1X5zuHvqJlGDQK6hC -QBf3YSaXO8Qak9nUQQolPDiPii0TCco/VobFwYzgIziGC5oI38HFq0G3CMunarl59hUdng1R6dcG -ObESbqHRZhvKWLDQAHdoWvLGwaET2RGJ/0K6BFdYYXynmNIFbqbfLDcGLMXhoL4GOl/M6ChO+0NH -p+9mBCQXTWjXtUXJvq7COi60JLCCovU8b7CdYQpg5UGFwPul5ZktdZEtxQ6zkdAbEg8ySour6eX8 -KpZlkPkNbNU9LnEFMohoQcdJz5qgrtBqGdscAY3I+4BfGpJtsQKg1hIMr7CNtffGsSSphK/bPGSb -7I5G3wFpRIFpb7Kazz4QCZ7jgeCM3n0nRjsfsJ43TSbBueCedEXRXU82Zdm2PTPc150jZLpTlllo -ePbEBXA8RP0R6gbox8WA/N747OOM45M4PSYRevCPRHaT/AdEhumQHJ+jULEHdMbxOB5NiBOVEqrK -bmDNiLt/sx6gp8S1UnK7/qsTEa6jeyP9E+HiLnPUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGF0 -YS50YXIuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA0NDQAMDAwMDAwMAAw -MDAwMDAwADAwMDAwMDA1MzMzADE0NDQyNjI3NzcyADAxMzM3NwAgMAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAwMDAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfiwgA -+i+LZAID7Fp7U9tIEs/f+hR94m79KCMTnleuZfcMCNCtsSnbJJsiOSNLY3uCLGn1CMvl8dnv16OH -sQnZvatdbjfFFBU0M/2e7p7uISdiPpGeePZ7jo3nGxu729vPNrKx+hubW8+eb29vb+5u7u3tbQJ+ -c3dr4xltPHuEkcaJHUGUm5kQ3hfgfml/Vbk/yYiDNHIE6bMkCeNWsxml49upmMdGEE11TePPUDjq -gyqRfS0q2rOn8fWMvtk+OjONufv/i//tnZ3te/G/ufMU/48xXDFOpyPpc5QnQUSXf7k8SKXn0iCx -kzR+Uy0SQxLZ72S87kjODM2x7cs4EVFzBd+I302/H0e278z25zZD1P5bEjVtf3lo2qhNfeQluons -MBQRTSBoMhPkixs661u0aWyQovL6jibtc2ukaUOAXa1wuKJDEj8nwo9l4JPtuwxLNyISoBLLqS9c -tTqGIRIC38sfAunMJA3s2HbthUJTmczSseEE8+Z18LzWgFAypjAK3oKPhs+38C6yCclTTqRjJ8wv -mBBD3QTRtaFp9Xq3NzQHrXod3zTkHU/CgNEtzZFtY0pjwSiFukoVWtISs8IKxkaD6nU3ID9IFGZy -l2CQJrF0FTlFZir9KcUySZVgcb1uQISe790q4WIKFnSpL35KZcQIMuGN1I/TMAyiBLbC2UhIeiM9 -jyIRpzAaRLIhxHoQatpFbE+Fts5D066urviK0SJFT1Bl5WwqmrZGvVD4uaZO4Cc4Kyye23EMZleu -UyHJwkFO20nkO5FxG3uBc62xn7w4a7WOGNsq3TJgiu/pg+t80IjWaGw713BH3HzAytSnaiSSNMKH -DXJRZN+yoYazSNhuq3VQILRanaA4yTGfc1wDRVCJaZ9cxygpj0rKmmJ5G6TkgPRUJNAtTGZMHsnH -uaZJZM8F7Ie1K6ZkxPLfuGgzsmpiJHIOE+NkP0jWQOkgfZcPBGTkOlAd2/M4OBSxhTJ0UMApcQlO -40uvpoiELLFCGOXUqrKm5fRlLH76ReKFvWHqJEod1neAoxU+TPtlhkz+DjfHw/l+lt0qooJkTCLh -u9pH9ilNO4SjwB0yP2NPO4+CsYfyhflDoDg7ZCcDI2hhJ3SZRXAW0csBXaQnCNiRDnKFWJCuclY5 -s4aU79SYfXgbyeksoapTo01cYev4Z4uq/wxmCCNbMqFzEc1lrLIOPHiGhIPkMkW2RBQ1oKxQsenM -7GgqkEwCeOItIeHFytkSW/o4Ic2GEuFtlhRAJg4myY2NUOKUBcsEjrQ5Kt3ASecC2ipf5SIfLo40 -olUGOUalppi4wvY4hDjFFFvKGZEvOJ6TSKpzbQDI8VL2Eq3Y9uRc5hwYXVkgZqJIPg0lZ4PmgSsn -/FsotcJ07Ml41tBcyaTHaYLFmBeVLRusRxNnFgukE1Dg1JInwEI6BQMuWsgGTXITKb43s2C+rAlM -NIGzgqVwlboBTKY4Ku8EFQafBJ4X3HCYwENcqZyllV0f9jhAjnHKA0ZuhaiZCCrfL04134pncF8a -Cy0zGPhyhrqjTsTsEft+ImF7TqPKOVfUxPUwPDVp0Dsevmz3TbIGdN7vvbCOzCOqtAeYVxr00hqe -9i6GBIh+uzt8Rb1jandf0Q9W96ihmT+e983BgHp9ss7OO5Z51CCre9i5OLK6J3QAPFw/1LHgzCA6 -7BEzzElZJvCOtTOzf3iKafvA6ljDVw06toZdpnkMom06b/eH1uFFp92n84v+eW9ggv0RyHat7nEf -XMwzszs0NKuLNTJfYEKD03ano1i1LyB9X8l32Dt/1bdOTod02uscmVg8MCFZ+6BjZqy6r7TDTts6 -a9BR+6x9YiqsHqj0FVgu3ctTUy2BXxs/h0Or12WbHPa6wz6mDW3Y6w9L1JfWwGxQu28N2CDH/R7I -szmB0VNEgNc1MypsapZaK08EIKzFxcBcyHJktjugNWDku8dn/CEbpz6KjN/7AYDr/72dnYfq/63t -3b2V+n9rY/Op/3+U8deWgVJuJicJVVAnVhaFGTf7TccTtr9Y1FeqteY7ZF6kLn0FLcGtkdjxNao5 -10P5htKoP8YNPZHTVgsRdWydXFaOOuaPw8ob3AORcABxDDc0xM8hEusotJNZVS1g18etXx2Njq2O -ORrVasgCvYMDs2/k2bWq1+vNurH2XrH6qDdILXwqPtbqxZfhBdPyO9CZktnuLugAvXmPVrmYI5fz -QG+o0mQxyr1PdwEz/gu08dv7kq3VjfrD5AxXTJZohO64wBxNvFvuFBSB5aVS1WjsQFmNY73VGuJs -hjgbA+1EtcUnVVN1ZcJ1ZWLACWL69lvSeUdXS/w1ygqI7JQ6uLkvFYASZ8RfYKK/UeC4urhOASwq -QqGW4CbjAO1IvsRlm4ZWyyF9MAtuqPQi9hlq5VNIBeQQTcs9vyswWrT2frnSb7Ve4OpAtv6o32UT -pShQIGVc8IBFbW5U9r+jyxbqvRBqNUiZ442Ww4Tome7I4AW2qqNXZZE+qgrAsrHiGemMth5BMuXY -H5uw6GqPuyTbWPXbfPGjBrcjFAiFkLlcmRDODPRIL8myM6yGo56BZnJwn8V9LgqaCZ9OucG+QSqy -l9cWMyekRRCQYTTxw2roec29kL6i6KShkr9squNKoUG+q8RSQs1hmwl9xiaLoPsflK0sdKpwzeqk -gpuOe+LqaF1qIJFwNYa2vLB0JIpFOESLHztLiXmS+sX26kEuMyvgC+h1b+EGK5jrD3uuoQRTQmfS -3ZWtlHTZfXg79OxkEsDC/GrL7U2ALqzQkMXKnJ2NBFeP5gz2ZlnRjNhDMhv5c/ByaIk518f3BChN -q/gseUBJv65UvWvDe3HBZXaYAhG0EZxLpHldEV86NOU7VcWhVrjIkYwu9YzbG0PYzkylvGn2x48P -ed4tjKDYrb3Pdz9mYcGCLbzpq3n/feCEH/P99/nzvZ2V+m+X/yT0VP89wlij9fo63NoJ+G5rUZpM -1v/Oa2VFd68sq+SXwQO1IHrSslbTtBMxb7UGgCgfQA31jInoiznuYoOrOw6w/Xu3vLpQjaIa2KcH -8qWCstNkFkRcoFzq5ZMLVYtXnIlE1NZUgRIbYm5LT0G+jfAZ/WPKC/zqkwPMgrkI7SnXK/pn3nof -ernO5I3T+ZxfW4H7wLP10pP18ot1RoLzXyTDJFO7JKn2sjqsGPt0BcHIi9fV+pURh55MqvprX68p -8DIl75M6ivN83mr1Lw5eZeYob21lk89dtXeqiMxC+WMNECpn1rCSHYHrjlzxTnhByO9O+A5hdLjW -La5n6UtO33COynf7tFP5urLon3d8+bQfpf/f2MH3cv7f29p4yv+PdP9PaILaeTTPH4IQyirj819M -sg78bSD9B3pxNJhnOZ7Okxu9Ru8/TLKCamKovulvl3nB2nrtv06EMwtI79qubahU8rGo+CY0j+Ro -83usYSJ94X5f5RQ1MrsnVtes0Tff0J057e9nHY6ODcVObeZXAu1/oua/NpsZcSJN3iFfPlXMr+cT -Tl1OJFBblhao3vubVE0TXsyWWbbU15DCPteI/VZx/2v//8/zvdX439l9iv/HGYt3u7Gj3ud+1ZOd -NhZT6d+JJf3hZj5v7jqB7ZpRFERZTD7dvH/Y+C8K+d/0/v/i///b2V29/zf3nuL/UcY8cFNPrLRW -COzyIiV9w9gwtvSngv1pPI2n8TS+qvEfAAAA//8DAME4UCsAMAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjaGVja3N1bXMu -eWFtbC5negAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDQ0NAAwMDAwMDAwADAwMDAwMDAA -MDAwMDAwMDA0NTAAMTQ0NDI2Mjc3NzIAMDE0NjIyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAAMDAwMDAwMAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+LCAD6L4tkAgNl -kD2yFEAIhPM9xV5grWH4f5mZuSeAAYxMrBd5escNNaOrmuajX6/X4/u3r5vl4/F8/uzPqPiMLz9+ -fzwJjNOXQnXMQG2UxSyqlbBnU0v7VVtpLZeNBsO8dMgBO+ncvHfWZ/x6500p68qBNVRwl5Y5AJep -Z0LobkCdNR5XnVkeiyDF0sM7kf5yMuz/ODmDGF2Sz+6oMt5mMb5zT/PQkcM3NesOZYI5MzsADNzo -PbhIKiAsZCrqa5IcQ7ZAG6Ktw+UXT1dIYIeTph5BaF20//2TSsE1OfAscfPUe1zJLiSagTIZUCLe -5lCp02ap4MA5xT7iRbhh9Tbqi3MpZBBIvGtOlF/vuf8dWJs5tNWlSy6ajvbt1R9/AA8NE1rUAQAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`) - binaryChecksum := fmt.Sprintf("%x", sha256.Sum256(binaryGemContent)) - root := fmt.Sprintf("/api/packages/%s/rubygems", user.Name) uploadFile := func(t *testing.T, content []byte, expectedStatus int) { @@ -365,8 +234,6 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`) pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID) require.NoError(t, err) assert.Equal(t, int64(4608), pb.Size) - - assert.Equal(t, "ruby", pd.Metadata.(*rubygems.Metadata).Platform) }) t.Run("UploadExists", func(t *testing.T) { @@ -455,33 +322,6 @@ gAAAAP//MS06Gw==`) sep, holaPackageVersion, holaPackageDependency, holaChecksum, holaRubyGemsRequirements) assert.Equal(t, expected, resp.Body.String()) }) - - t.Run("UploadBinary", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - uploadFile(t, binaryGemContent, http.StatusCreated) - - pvs, err := packages.GetVersionsByPackageName(db.DefaultContext, user.ID, packages.TypeRubyGems, binaryPackageName) - require.NoError(t, err) - - pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) - require.NoError(t, err) - - assert.Equal(t, binaryPackageName, pd.Package.Name) - assert.Equal(t, "x86_64-linux-musl", pd.Metadata.(*rubygems.Metadata).Platform) - }) - - t.Run("BinaryPackageInfo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, binaryPackageName)). - AddBasicAuth(user.Name) - resp := MakeRequest(t, req, http.StatusOK) - expected := fmt.Sprintf("%s\n%s-x86_64-linux-musl |checksum:%s,%s\n", - sep, binaryPackageVersion, binaryChecksum, binaryRubyGemsRequirements) - assert.Equal(t, expected, resp.Body.String()) - }) - t.Run("Versions", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -494,16 +334,12 @@ gAAAAP//MS06Gw==`) holaInfoReq := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, holaPackageName)). AddBasicAuth(user.Name) holaInfoResp := MakeRequest(t, holaInfoReq, http.StatusOK) - binaryInfoReq := NewRequest(t, "GET", fmt.Sprintf("%s/info/%s", root, binaryPackageName)). - AddBasicAuth(user.Name) - binaryInfoResp := MakeRequest(t, binaryInfoReq, http.StatusOK) // expected := fmt.Sprintf("%s\n%s %s %x\n", // sep, packageName, packageVersion, md5.Sum(infoResp.Body.Bytes())) lines := versionsResp.Body.String() assert.ElementsMatch(t, strings.Split(lines, "\n"), []string{ sep, - fmt.Sprintf("%s %s_x86_64-linux-musl %x", binaryPackageName, binaryPackageVersion, md5.Sum(binaryInfoResp.Body.Bytes())), fmt.Sprintf("%s %s %x", packageName, packageVersion, md5.Sum(infoResp.Body.Bytes())), fmt.Sprintf("%s %s %x", holaPackageName, holaPackageVersion, md5.Sum(holaInfoResp.Body.Bytes())), "", @@ -525,21 +361,6 @@ gAAAAP//MS06Gw==`) MakeRequest(t, req, http.StatusOK) }) - t.Run("DeleteBinary", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - body := bytes.Buffer{} - writer := multipart.NewWriter(&body) - writer.WriteField("gem_name", binaryPackageName) - writer.WriteField("version", binaryPackageVersion) - writer.Close() - - req := NewRequestWithBody(t, "DELETE", fmt.Sprintf("%s/api/v1/gems/yank", root), &body). - SetHeader("Content-Type", writer.FormDataContentType()). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusOK) - }) - t.Run("Delete", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/api_packages_swift_test.go b/tests/integration/api_packages_swift_test.go index ec0d4a2b81..5b6229f721 100644 --- a/tests/integration/api_packages_swift_test.go +++ b/tests/integration/api_packages_swift_test.go @@ -13,14 +13,14 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - swift_module "forgejo.org/modules/packages/swift" - "forgejo.org/modules/setting" - swift_router "forgejo.org/routers/api/packages/swift" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + swift_module "code.gitea.io/gitea/modules/packages/swift" + "code.gitea.io/gitea/modules/setting" + swift_router "code.gitea.io/gitea/routers/api/packages/swift" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -43,24 +43,6 @@ func TestPackageSwift(t *testing.T) { url := fmt.Sprintf("/api/packages/%s/swift", user.Name) - t.Run("CheckLogin", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithBody(t, "POST", url, strings.NewReader("")) - MakeRequest(t, req, http.StatusUnauthorized) - - req = NewRequestWithBody(t, "POST", url, strings.NewReader("")). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusOK) - - req = NewRequestWithBody(t, "POST", url+"/login", strings.NewReader("")) - MakeRequest(t, req, http.StatusUnauthorized) - - req = NewRequestWithBody(t, "POST", url+"/login", strings.NewReader("")). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusOK) - }) - t.Run("CheckAcceptMediaType", func(t *testing.T) { defer tests.PrintCurrentTest(t)() diff --git a/tests/integration/api_packages_test.go b/tests/integration/api_packages_test.go index a157d18cd5..27aed0feb1 100644 --- a/tests/integration/api_packages_test.go +++ b/tests/integration/api_packages_test.go @@ -12,19 +12,18 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - container_model "forgejo.org/models/packages/container" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - packages_service "forgejo.org/services/packages" - packages_cleanup_service "forgejo.org/services/packages/cleanup" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + container_model "code.gitea.io/gitea/models/packages/container" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + packages_service "code.gitea.io/gitea/services/packages" + packages_cleanup_service "code.gitea.io/gitea/services/packages/cleanup" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -36,7 +35,7 @@ func TestPackageAPI(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) session := loginUser(t, user.Name) tokenReadPackage := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadPackage) - tokenWritePackage := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWritePackage) + tokenDeletePackage := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWritePackage) packageName := "test-package" packageVersion := "1.0.3" @@ -100,13 +99,8 @@ func TestPackageAPI(t *testing.T) { DecodeJSON(t, resp, &ap1) assert.Nil(t, ap1.Repository) - // create a repository - repo, _, f := tests.CreateDeclarativeRepo(t, user, "", []unit_model.Type{unit_model.TypeCode}, nil, nil) - defer f() - // link to public repository - req = NewRequest(t, "POST", fmt.Sprintf("/api/v1/packages/%s/generic/%s/-/link/%s", user.Name, packageName, repo.Name)).AddTokenAuth(tokenWritePackage) - MakeRequest(t, req, http.StatusCreated) + require.NoError(t, packages_model.SetRepositoryLink(db.DefaultContext, p.ID, 1)) req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/packages/%s/generic/%s/%s", user.Name, packageName, packageVersion)). AddTokenAuth(tokenReadPackage) @@ -115,15 +109,10 @@ func TestPackageAPI(t *testing.T) { var ap2 *api.Package DecodeJSON(t, resp, &ap2) assert.NotNil(t, ap2.Repository) - assert.EqualValues(t, repo.ID, ap2.Repository.ID) + assert.EqualValues(t, 1, ap2.Repository.ID) - // link to repository without write access, should fail - req = NewRequest(t, "POST", fmt.Sprintf("/api/v1/packages/%s/generic/%s/-/link/%s", user.Name, packageName, "repo3")).AddTokenAuth(tokenWritePackage) - MakeRequest(t, req, http.StatusNotFound) - - // remove link - req = NewRequest(t, "POST", fmt.Sprintf("/api/v1/packages/%s/generic/%s/-/unlink", user.Name, packageName)).AddTokenAuth(tokenWritePackage) - MakeRequest(t, req, http.StatusNoContent) + // link to private repository + require.NoError(t, packages_model.SetRepositoryLink(db.DefaultContext, p.ID, 2)) req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/packages/%s/generic/%s/%s", user.Name, packageName, packageVersion)). AddTokenAuth(tokenReadPackage) @@ -133,18 +122,7 @@ func TestPackageAPI(t *testing.T) { DecodeJSON(t, resp, &ap3) assert.Nil(t, ap3.Repository) - // force link to a repository the currently logged-in user doesn't have access to - privateRepoID := int64(6) - require.NoError(t, packages_model.SetRepositoryLink(db.DefaultContext, p.ID, privateRepoID)) - - req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/packages/%s/generic/%s/%s", user.Name, packageName, packageVersion)).AddTokenAuth(tokenReadPackage) - resp = MakeRequest(t, req, http.StatusOK) - - var ap4 *api.Package - DecodeJSON(t, resp, &ap4) - assert.Nil(t, ap4.Repository) - - require.NoError(t, packages_model.UnlinkRepositoryFromAllPackages(db.DefaultContext, privateRepoID)) + require.NoError(t, packages_model.UnlinkRepositoryFromAllPackages(db.DefaultContext, 2)) }) }) @@ -175,11 +153,11 @@ func TestPackageAPI(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/packages/%s/dummy/%s/%s", user.Name, packageName, packageVersion)). - AddTokenAuth(tokenWritePackage) + AddTokenAuth(tokenDeletePackage) MakeRequest(t, req, http.StatusNotFound) req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/packages/%s/generic/%s/%s", user.Name, packageName, packageVersion)). - AddTokenAuth(tokenWritePackage) + AddTokenAuth(tokenDeletePackage) MakeRequest(t, req, http.StatusNoContent) }) } diff --git a/tests/integration/api_packages_vagrant_test.go b/tests/integration/api_packages_vagrant_test.go index b9977d61c5..b446466296 100644 --- a/tests/integration/api_packages_vagrant_test.go +++ b/tests/integration/api_packages_vagrant_test.go @@ -12,14 +12,14 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/packages" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - vagrant_module "forgejo.org/modules/packages/vagrant" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/json" + vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_private_serv_test.go b/tests/integration/api_private_serv_test.go index a7dc59a611..3339fc4430 100644 --- a/tests/integration/api_private_serv_test.go +++ b/tests/integration/api_private_serv_test.go @@ -8,9 +8,9 @@ import ( "net/url" "testing" - asymkey_model "forgejo.org/models/asymkey" - "forgejo.org/models/perm" - "forgejo.org/modules/private" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/modules/private" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -18,7 +18,7 @@ import ( func TestAPIPrivateNoServ(t *testing.T) { onGiteaRun(t, func(*testing.T, *url.URL) { - ctx, cancel := context.WithCancel(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) defer cancel() key, user, err := private.ServNoCommand(ctx, 1) require.NoError(t, err) @@ -40,7 +40,7 @@ func TestAPIPrivateNoServ(t *testing.T) { func TestAPIPrivateServ(t *testing.T) { onGiteaRun(t, func(*testing.T, *url.URL) { - ctx, cancel := context.WithCancel(t.Context()) + ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Can push to a repo we own diff --git a/tests/integration/api_pull_commits_test.go b/tests/integration/api_pull_commits_test.go index bfdcd79e66..d62b9d9140 100644 --- a/tests/integration/api_pull_commits_test.go +++ b/tests/integration/api_pull_commits_test.go @@ -7,12 +7,12 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_pull_review_test.go b/tests/integration/api_pull_review_test.go index 930f9b816b..b66e65ee41 100644 --- a/tests/integration/api_pull_review_test.go +++ b/tests/integration/api_pull_review_test.go @@ -8,16 +8,16 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "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/json" - api "forgejo.org/modules/structs" - issue_service "forgejo.org/services/issue" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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/json" + api "code.gitea.io/gitea/modules/structs" + issue_service "code.gitea.io/gitea/services/issue" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_pull_test.go b/tests/integration/api_pull_test.go index e35eca38cf..7b95d441dd 100644 --- a/tests/integration/api_pull_test.go +++ b/tests/integration/api_pull_test.go @@ -11,18 +11,18 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "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" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/services/forms" - issue_service "forgejo.org/services/issue" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/services/forms" + issue_service "code.gitea.io/gitea/services/issue" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_push_mirror_test.go b/tests/integration/api_push_mirror_test.go index 282c3aaba0..f2135cec62 100644 --- a/tests/integration/api_push_mirror_test.go +++ b/tests/integration/api_push_mirror_test.go @@ -17,22 +17,22 @@ import ( "testing" "time" - asymkey_model "forgejo.org/models/asymkey" - auth_model "forgejo.org/models/auth" - "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/git" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + asymkey_model "code.gitea.io/gitea/models/asymkey" + 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/unit" + "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/optional" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_quota_management_test.go b/tests/integration/api_quota_management_test.go index c46c857197..6337e66516 100644 --- a/tests/integration/api_quota_management_test.go +++ b/tests/integration/api_quota_management_test.go @@ -8,16 +8,16 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_quota_use_test.go b/tests/integration/api_quota_use_test.go index 2b50cca4ab..11cbdcf145 100644 --- a/tests/integration/api_quota_use_test.go +++ b/tests/integration/api_quota_use_test.go @@ -14,22 +14,22 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/migration" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/context" - "forgejo.org/services/forms" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + quota_model "code.gitea.io/gitea/models/quota" + 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/migration" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_releases_test.go b/tests/integration/api_releases_test.go index 98fc293fbc..1bd8a643ad 100644 --- a/tests/integration/api_releases_test.go +++ b/tests/integration/api_releases_test.go @@ -13,14 +13,14 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -76,7 +76,6 @@ func TestAPIListReleases(t *testing.T) { testFilterByLen(true, url.Values{"draft": {"false"}, "pre-release": {"false"}}, 1, "exclude drafts and pre-releases") testFilterByLen(true, url.Values{"pre-release": {"true"}}, 1, "only get pre-release") testFilterByLen(true, url.Values{"draft": {"true"}, "pre-release": {"true"}}, 0, "there is no pre-release draft") - testFilterByLen(true, url.Values{"q": {"release"}}, 3, "keyword") } func createNewReleaseUsingAPI(t *testing.T, token string, owner *user_model.User, repo *repo_model.Repository, name, target, title, desc string) *api.Release { diff --git a/tests/integration/api_repo_actions_test.go b/tests/integration/api_repo_actions_test.go deleted file mode 100644 index 42c1038a0e..0000000000 --- a/tests/integration/api_repo_actions_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "net/url" - "strings" - "testing" - - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestAPISearchActionJobs_RepoRunner(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - token := getUserToken(t, user2.LowerName, auth_model.AccessTokenScopeWriteRepository) - job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 393}) - - req := NewRequestf( - t, - "GET", - "/api/v1/repos/%s/%s/actions/runners/jobs?labels=%s", - repo.OwnerName, repo.Name, - "ubuntu-latest", - ).AddTokenAuth(token) - res := MakeRequest(t, req, http.StatusOK) - - var jobs []*api.ActionRunJob - DecodeJSON(t, res, &jobs) - - assert.Len(t, jobs, 1) - assert.EqualValues(t, job.ID, jobs[0].ID) -} - -func TestAPIWorkflowDispatchReturnInfo(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - workflowName := "dispatch.yml" - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - token := getUserToken(t, user2.LowerName, auth_model.AccessTokenScopeWriteRepository) - - // create the repo - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "api-repo-workflow-dispatch", - []unit_model.Type{unit_model.TypeActions}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: fmt.Sprintf(".forgejo/workflows/%s", workflowName), - ContentReader: strings.NewReader(`name: WD -on: [workflow-dispatch] -jobs: - t1: - runs-on: docker - steps: - - run: echo "test 1" - t2: - runs-on: docker - steps: - - run: echo "test 2" -`, - ), - }, - }, - ) - defer f() - - req := NewRequestWithJSON( - t, - http.MethodPost, - fmt.Sprintf( - "/api/v1/repos/%s/%s/actions/workflows/%s/dispatches", - repo.OwnerName, repo.Name, workflowName, - ), - &api.DispatchWorkflowOption{ - Ref: repo.DefaultBranch, - ReturnRunInfo: true, - }, - ) - req.AddTokenAuth(token) - - res := MakeRequest(t, req, http.StatusCreated) - run := new(api.DispatchWorkflowRun) - DecodeJSON(t, res, run) - - assert.NotZero(t, run.ID) - assert.NotZero(t, run.RunNumber) - assert.Len(t, run.Jobs, 2) - }) -} diff --git a/tests/integration/api_repo_activities_test.go b/tests/integration/api_repo_activities_test.go index ea966c1cfe..dbdedec372 100644 --- a/tests/integration/api_repo_activities_test.go +++ b/tests/integration/api_repo_activities_test.go @@ -8,11 +8,11 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_archive_test.go b/tests/integration/api_repo_archive_test.go index 30e62943f0..a16136a39b 100644 --- a/tests/integration/api_repo_archive_test.go +++ b/tests/integration/api_repo_archive_test.go @@ -11,11 +11,11 @@ import ( "regexp" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -63,43 +63,3 @@ func TestAPIDownloadArchive(t *testing.T) { link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/archive/master", user2.Name, repo.Name)) MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusBadRequest) } - -func TestAPIDownloadArchive2(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.LowerName) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) - - link, _ := url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/zipball/master", user2.Name, repo.Name)) - resp := MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusOK) - bs, err := io.ReadAll(resp.Body) - require.NoError(t, err) - assert.Len(t, bs, 320) - - link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/tarball/master", user2.Name, repo.Name)) - resp = MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusOK) - bs, err = io.ReadAll(resp.Body) - require.NoError(t, err) - assert.Len(t, bs, 266) - - // Must return a link to a commit ID as the "immutable" archive link - linkHeaderRe := regexp.MustCompile(`^<(https?://.*/api/v1/repos/user2/repo1/archive/[a-f0-9]+\.tar\.gz.*)>; rel="immutable"$`) - m := linkHeaderRe.FindStringSubmatch(resp.Header().Get("Link")) - assert.NotEmpty(t, m[1]) - resp = MakeRequest(t, NewRequest(t, "GET", m[1]).AddTokenAuth(token), http.StatusOK) - bs2, err := io.ReadAll(resp.Body) - require.NoError(t, err) - // The locked URL should give the same bytes as the non-locked one - assert.EqualValues(t, bs, bs2) - - link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/bundle/master", user2.Name, repo.Name)) - resp = MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusOK) - bs, err = io.ReadAll(resp.Body) - require.NoError(t, err) - assert.Len(t, bs, 382) - - link, _ = url.Parse(fmt.Sprintf("/api/v1/repos/%s/%s/archive/master", user2.Name, repo.Name)) - MakeRequest(t, NewRequest(t, "GET", link.String()).AddTokenAuth(token), http.StatusBadRequest) -} diff --git a/tests/integration/api_repo_avatar_test.go b/tests/integration/api_repo_avatar_test.go index 0bd0a54f27..8ee256ec9f 100644 --- a/tests/integration/api_repo_avatar_test.go +++ b/tests/integration/api_repo_avatar_test.go @@ -10,12 +10,12 @@ import ( "os" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_branch_test.go b/tests/integration/api_repo_branch_test.go index caadea7e39..83159022ea 100644 --- a/tests/integration/api_repo_branch_test.go +++ b/tests/integration/api_repo_branch_test.go @@ -11,14 +11,14 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_collaborator_test.go b/tests/integration/api_repo_collaborator_test.go index 61f4f578d7..59cf85fef3 100644 --- a/tests/integration/api_repo_collaborator_test.go +++ b/tests/integration/api_repo_collaborator_test.go @@ -8,12 +8,12 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/perm" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/perm" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) @@ -52,20 +52,6 @@ func TestAPIRepoCollaboratorPermission(t *testing.T) { DecodeJSON(t, resp, &repoPermission) assert.Equal(t, "read", repoPermission.Permission) - - t.Run("CollaboratorCanReadTheirPermission", func(t *testing.T) { - session := loginUser(t, user4.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) - - req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var repoPermission api.RepoCollaboratorPermission - DecodeJSON(t, resp, &repoPermission) - - assert.Equal(t, "read", repoPermission.Permission) - }) }) t.Run("CollaboratorWithWriteAccess", func(t *testing.T) { diff --git a/tests/integration/api_repo_compare_test.go b/tests/integration/api_repo_compare_test.go index 35f0a21d82..765d0cef08 100644 --- a/tests/integration/api_repo_compare_test.go +++ b/tests/integration/api_repo_compare_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -35,7 +35,6 @@ func TestAPICompareBranches(t *testing.T) { assert.Equal(t, 2, apiResp.TotalCommits) assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) } func TestAPICompareCommits(t *testing.T) { @@ -55,5 +54,4 @@ func TestAPICompareCommits(t *testing.T) { assert.Equal(t, 2, apiResp.TotalCommits) assert.Len(t, apiResp.Commits, 2) - assert.Len(t, apiResp.Files, 3) } diff --git a/tests/integration/api_repo_edit_test.go b/tests/integration/api_repo_edit_test.go index 341cb0961f..7de8910ee0 100644 --- a/tests/integration/api_repo_edit_test.go +++ b/tests/integration/api_repo_edit_test.go @@ -6,16 +6,16 @@ package integration import ( "fmt" "net/http" + "net/url" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) @@ -137,260 +137,232 @@ func getNewRepoEditOption(opts *api.EditRepoOption) *api.EditRepoOption { } func TestAPIRepoEdit(t *testing.T) { - defer tests.PrepareTestEnv(t)() - bFalse, bTrue := false, true + onGiteaRun(t, func(t *testing.T, u *url.URL) { + bFalse, bTrue := false, true - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo1 & repo16 - org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the repo3, is an org - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of neither repos - repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // public repo - repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // public repo - repo15 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) // empty repo - repo16 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) // private repo + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo1 & repo16 + org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the repo3, is an org + user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) // owner of neither repos + repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) // public repo + repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // public repo + repo15 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) // empty repo + repo16 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) // private repo - // Get user2's token - session := loginUser(t, user2.Name) - token2 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - // Get user4's token - session = loginUser(t, user4.Name) - token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) + // Get user2's token + session := loginUser(t, user2.Name) + token2 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) + // Get user4's token + session = loginUser(t, user4.Name) + token4 := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - // Test editing a repo1 which user2 owns, changing name and many properties - origRepoEditOption := getRepoEditOptionFromRepo(repo1) - repoEditOption := getNewRepoEditOption(origRepoEditOption) - req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). - AddTokenAuth(token2) - resp := MakeRequest(t, req, http.StatusOK) - var repo api.Repository - DecodeJSON(t, resp, &repo) - assert.NotNil(t, repo) - // check response - assert.Equal(t, *repoEditOption.Name, repo.Name) - assert.Equal(t, *repoEditOption.Description, repo.Description) - assert.Equal(t, *repoEditOption.Website, repo.Website) - assert.Equal(t, *repoEditOption.Archived, repo.Archived) - // check repo1 from database - repo1edited := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - repo1editedOption := getRepoEditOptionFromRepo(repo1edited) - assert.Equal(t, *repoEditOption.Name, *repo1editedOption.Name) - assert.Equal(t, *repoEditOption.Description, *repo1editedOption.Description) - assert.Equal(t, *repoEditOption.Website, *repo1editedOption.Website) - assert.Equal(t, *repoEditOption.Archived, *repo1editedOption.Archived) - assert.Equal(t, *repoEditOption.Private, *repo1editedOption.Private) - assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki) + // Test editing a repo1 which user2 owns, changing name and many properties + origRepoEditOption := getRepoEditOptionFromRepo(repo1) + repoEditOption := getNewRepoEditOption(origRepoEditOption) + req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). + AddTokenAuth(token2) + resp := MakeRequest(t, req, http.StatusOK) + var repo api.Repository + DecodeJSON(t, resp, &repo) + assert.NotNil(t, repo) + // check response + assert.Equal(t, *repoEditOption.Name, repo.Name) + assert.Equal(t, *repoEditOption.Description, repo.Description) + assert.Equal(t, *repoEditOption.Website, repo.Website) + assert.Equal(t, *repoEditOption.Archived, repo.Archived) + // check repo1 from database + repo1edited := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo1editedOption := getRepoEditOptionFromRepo(repo1edited) + assert.Equal(t, *repoEditOption.Name, *repo1editedOption.Name) + assert.Equal(t, *repoEditOption.Description, *repo1editedOption.Description) + assert.Equal(t, *repoEditOption.Website, *repo1editedOption.Website) + assert.Equal(t, *repoEditOption.Archived, *repo1editedOption.Archived) + assert.Equal(t, *repoEditOption.Private, *repo1editedOption.Private) + assert.Equal(t, *repoEditOption.HasWiki, *repo1editedOption.HasWiki) - // Test editing repo1 to use internal issue and wiki (default) - *repoEditOption.HasIssues = true - repoEditOption.ExternalTracker = nil - repoEditOption.InternalTracker = &api.InternalTracker{ - EnableTimeTracker: false, - AllowOnlyContributorsToTrackTime: false, - EnableIssueDependencies: false, - } - *repoEditOption.HasWiki = true - repoEditOption.ExternalWiki = nil - url := fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name) - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &repo) - assert.NotNil(t, repo) - // check repo1 was written to database - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) - assert.True(t, *repo1editedOption.HasIssues) - assert.Nil(t, repo1editedOption.ExternalTracker) - assert.Equal(t, *repo1editedOption.InternalTracker, *repoEditOption.InternalTracker) - assert.True(t, *repo1editedOption.HasWiki) - assert.Nil(t, repo1editedOption.ExternalWiki) + // Test editing repo1 to use internal issue and wiki (default) + *repoEditOption.HasIssues = true + repoEditOption.ExternalTracker = nil + repoEditOption.InternalTracker = &api.InternalTracker{ + EnableTimeTracker: false, + AllowOnlyContributorsToTrackTime: false, + EnableIssueDependencies: false, + } + *repoEditOption.HasWiki = true + repoEditOption.ExternalWiki = nil + url := fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name) + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &repo) + assert.NotNil(t, repo) + // check repo1 was written to database + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) + assert.True(t, *repo1editedOption.HasIssues) + assert.Nil(t, repo1editedOption.ExternalTracker) + assert.Equal(t, *repo1editedOption.InternalTracker, *repoEditOption.InternalTracker) + assert.True(t, *repo1editedOption.HasWiki) + assert.Nil(t, repo1editedOption.ExternalWiki) - // Test editing repo1 to use external issue and wiki - repoEditOption.ExternalTracker = &api.ExternalTracker{ - ExternalTrackerURL: "http://www.somewebsite.com", - ExternalTrackerFormat: "http://www.somewebsite.com/{user}/{repo}?issue={index}", - ExternalTrackerStyle: "alphanumeric", - } - repoEditOption.ExternalWiki = &api.ExternalWiki{ - ExternalWikiURL: "http://www.somewebsite.com", - } - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &repo) - assert.NotNil(t, repo) - // check repo1 was written to database - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) - assert.True(t, *repo1editedOption.HasIssues) - assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) - assert.True(t, *repo1editedOption.HasWiki) - assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki) + // Test editing repo1 to use external issue and wiki + repoEditOption.ExternalTracker = &api.ExternalTracker{ + ExternalTrackerURL: "http://www.somewebsite.com", + ExternalTrackerFormat: "http://www.somewebsite.com/{user}/{repo}?issue={index}", + ExternalTrackerStyle: "alphanumeric", + } + repoEditOption.ExternalWiki = &api.ExternalWiki{ + ExternalWikiURL: "http://www.somewebsite.com", + } + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &repo) + assert.NotNil(t, repo) + // check repo1 was written to database + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) + assert.True(t, *repo1editedOption.HasIssues) + assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) + assert.True(t, *repo1editedOption.HasWiki) + assert.Equal(t, *repo1editedOption.ExternalWiki, *repoEditOption.ExternalWiki) - repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp" - repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)` - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &repo) - assert.NotNil(t, repo) - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) - assert.True(t, *repo1editedOption.HasIssues) - assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) + repoEditOption.ExternalTracker.ExternalTrackerStyle = "regexp" + repoEditOption.ExternalTracker.ExternalTrackerRegexpPattern = `(\d+)` + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &repo) + assert.NotNil(t, repo) + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) + assert.True(t, *repo1editedOption.HasIssues) + assert.Equal(t, *repo1editedOption.ExternalTracker, *repoEditOption.ExternalTracker) - // Do some tests with invalid URL for external tracker and wiki - repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com" - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - MakeRequest(t, req, http.StatusUnprocessableEntity) - repoEditOption.ExternalTracker.ExternalTrackerURL = "http://www.somewebsite.com" - repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}" - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - MakeRequest(t, req, http.StatusUnprocessableEntity) - repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}" - repoEditOption.ExternalWiki.ExternalWikiURL = "htp://www.somewebsite.com" - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - MakeRequest(t, req, http.StatusUnprocessableEntity) + // Do some tests with invalid URL for external tracker and wiki + repoEditOption.ExternalTracker.ExternalTrackerURL = "htp://www.somewebsite.com" + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + MakeRequest(t, req, http.StatusUnprocessableEntity) + repoEditOption.ExternalTracker.ExternalTrackerURL = "http://www.somewebsite.com" + repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user/{repo}?issue={index}" + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + MakeRequest(t, req, http.StatusUnprocessableEntity) + repoEditOption.ExternalTracker.ExternalTrackerFormat = "http://www.somewebsite.com/{user}/{repo}?issue={index}" + repoEditOption.ExternalWiki.ExternalWikiURL = "htp://www.somewebsite.com" + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + MakeRequest(t, req, http.StatusUnprocessableEntity) - // Test small repo change through API with issue and wiki option not set; They shall not be touched. - *repoEditOption.Description = "small change" - repoEditOption.HasIssues = nil - repoEditOption.ExternalTracker = nil - repoEditOption.HasWiki = nil - repoEditOption.ExternalWiki = nil - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &repo) - assert.NotNil(t, repo) - // check repo1 was written to database - repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - repo1editedOption = getRepoEditOptionFromRepo(repo1edited) - assert.Equal(t, *repo1editedOption.Description, *repoEditOption.Description) - assert.True(t, *repo1editedOption.HasIssues) - assert.NotNil(t, *repo1editedOption.ExternalTracker) - assert.True(t, *repo1editedOption.HasWiki) - assert.NotNil(t, *repo1editedOption.ExternalWiki) + // Test small repo change through API with issue and wiki option not set; They shall not be touched. + *repoEditOption.Description = "small change" + repoEditOption.HasIssues = nil + repoEditOption.ExternalTracker = nil + repoEditOption.HasWiki = nil + repoEditOption.ExternalWiki = nil + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + resp = MakeRequest(t, req, http.StatusOK) + DecodeJSON(t, resp, &repo) + assert.NotNil(t, repo) + // check repo1 was written to database + repo1edited = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + repo1editedOption = getRepoEditOptionFromRepo(repo1edited) + assert.Equal(t, *repo1editedOption.Description, *repoEditOption.Description) + assert.True(t, *repo1editedOption.HasIssues) + assert.NotNil(t, *repo1editedOption.ExternalTracker) + assert.True(t, *repo1editedOption.HasWiki) + assert.NotNil(t, *repo1editedOption.ExternalWiki) - // reset repo in db - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) + // reset repo in db + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) - // Test editing a non-existing repo - name := "repodoesnotexist" - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, name), &api.EditRepoOption{Name: &name}). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusNotFound) + // Test editing a non-existing repo + name := "repodoesnotexist" + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, name), &api.EditRepoOption{Name: &name}). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusNotFound) - // Test editing repo16 by user4 who does not have write access - origRepoEditOption = getRepoEditOptionFromRepo(repo16) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). - AddTokenAuth(token4) - MakeRequest(t, req, http.StatusNotFound) + // Test editing repo16 by user4 who does not have write access + origRepoEditOption = getRepoEditOptionFromRepo(repo16) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). + AddTokenAuth(token4) + MakeRequest(t, req, http.StatusNotFound) - // Tests a repo with no token given so will fail - origRepoEditOption = getRepoEditOptionFromRepo(repo16) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption) - _ = MakeRequest(t, req, http.StatusNotFound) + // Tests a repo with no token given so will fail + origRepoEditOption = getRepoEditOptionFromRepo(repo16) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption) + _ = MakeRequest(t, req, http.StatusNotFound) - // Test using access token for a private repo that the user of the token owns - origRepoEditOption = getRepoEditOptionFromRepo(repo16) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) - // reset repo in db - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) + // Test using access token for a private repo that the user of the token owns + origRepoEditOption = getRepoEditOptionFromRepo(repo16) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name), &repoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) + // reset repo in db + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, *repoEditOption.Name), &origRepoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) - // Test making a repo public that is private - repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) - assert.True(t, repo16.IsPrivate) - repoEditOption = &api.EditRepoOption{ - Private: &bFalse, - } - url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name) - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) - repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) - assert.False(t, repo16.IsPrivate) - // Make it private again - repoEditOption.Private = &bTrue - req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) + // Test making a repo public that is private + repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) + assert.True(t, repo16.IsPrivate) + repoEditOption = &api.EditRepoOption{ + Private: &bFalse, + } + url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo16.Name) + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) + repo16 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 16}) + assert.False(t, repo16.IsPrivate) + // Make it private again + repoEditOption.Private = &bTrue + req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) - // Test to change empty repo - assert.False(t, repo15.IsArchived) - url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo15.Name) - req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ - Archived: &bTrue, - }).AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) - repo15 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) - assert.True(t, repo15.IsArchived) - req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ - Archived: &bFalse, - }).AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) + // Test to change empty repo + assert.False(t, repo15.IsArchived) + url = fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo15.Name) + req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ + Archived: &bTrue, + }).AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) + repo15 = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 15}) + assert.True(t, repo15.IsArchived) + req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ + Archived: &bFalse, + }).AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) - // Test using org repo "org3/repo3" where user2 is a collaborator - origRepoEditOption = getRepoEditOptionFromRepo(repo3) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption). - AddTokenAuth(token2) - MakeRequest(t, req, http.StatusOK) - // reset repo in db - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, *repoEditOption.Name), &origRepoEditOption). - AddTokenAuth(token2) - _ = MakeRequest(t, req, http.StatusOK) + // Test using org repo "org3/repo3" where user2 is a collaborator + origRepoEditOption = getRepoEditOptionFromRepo(repo3) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption). + AddTokenAuth(token2) + MakeRequest(t, req, http.StatusOK) + // reset repo in db + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, *repoEditOption.Name), &origRepoEditOption). + AddTokenAuth(token2) + _ = MakeRequest(t, req, http.StatusOK) - // Test using org repo "org3/repo3" with no user token - origRepoEditOption = getRepoEditOptionFromRepo(repo3) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption) - MakeRequest(t, req, http.StatusNotFound) + // Test using org repo "org3/repo3" with no user token + origRepoEditOption = getRepoEditOptionFromRepo(repo3) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", org3.Name, repo3.Name), &repoEditOption) + MakeRequest(t, req, http.StatusNotFound) - // Test using repo "user2/repo1" where user4 is a NOT collaborator - origRepoEditOption = getRepoEditOptionFromRepo(repo1) - repoEditOption = getNewRepoEditOption(origRepoEditOption) - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). - AddTokenAuth(token4) - MakeRequest(t, req, http.StatusForbidden) - - t.Run("Default merge style", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - updateStyle := "invalid" - MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ - DefaultUpdateStyle: &updateStyle, - }).AddTokenAuth(token2), http.StatusUnprocessableEntity) - - MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ - DefaultMergeStyle: &updateStyle, - }).AddTokenAuth(token2), http.StatusUnprocessableEntity) - - var apiRepo api.Repository - DecodeJSON(t, MakeRequest(t, NewRequest(t, "GET", url).AddTokenAuth(token2), http.StatusOK), &apiRepo) - assert.Equal(t, "merge", apiRepo.DefaultMergeStyle) - assert.Equal(t, "merge", apiRepo.DefaultUpdateStyle) - - updateStyle = "rebase" - MakeRequest(t, NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{ - DefaultMergeStyle: &updateStyle, - DefaultUpdateStyle: &updateStyle, - HasPullRequests: &bTrue, - }).AddTokenAuth(token2), http.StatusOK) - - DecodeJSON(t, MakeRequest(t, NewRequest(t, "GET", url).AddTokenAuth(token2), http.StatusOK), &apiRepo) - assert.Equal(t, "rebase", apiRepo.DefaultMergeStyle) - assert.Equal(t, "rebase", apiRepo.DefaultUpdateStyle) + // Test using repo "user2/repo1" where user4 is a NOT collaborator + origRepoEditOption = getRepoEditOptionFromRepo(repo1) + repoEditOption = getNewRepoEditOption(origRepoEditOption) + req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", user2.Name, repo1.Name), &repoEditOption). + AddTokenAuth(token4) + MakeRequest(t, req, http.StatusForbidden) }) } diff --git a/tests/integration/api_repo_file_create_test.go b/tests/integration/api_repo_file_create_test.go index cff891f6d8..c7c30db1ff 100644 --- a/tests/integration/api_repo_file_create_test.go +++ b/tests/integration/api_repo_file_create_test.go @@ -4,6 +4,7 @@ package integration import ( + stdCtx "context" "encoding/base64" "fmt" "net/http" @@ -12,15 +13,15 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - 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/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" "github.com/stretchr/testify/assert" ) @@ -171,7 +172,7 @@ func TestAPICreateFile(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &createFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(stdCtx.Background(), repo1) commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName) latestCommit, _ := gitRepo.GetCommitByPath(treePath) expectedFileResponse := getExpectedFileResponseForCreate("user2/repo1", commitID, treePath, latestCommit.ID.String()) @@ -291,7 +292,7 @@ func TestAPICreateFile(t *testing.T) { AddTokenAuth(token2) resp = MakeRequest(t, req, http.StatusCreated) emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: reponame}) // public repo - gitRepo, _ := gitrepo.OpenRepository(t.Context(), emptyRepo) + gitRepo, _ := gitrepo.OpenRepository(stdCtx.Background(), emptyRepo) commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName) latestCommit, _ := gitRepo.GetCommitByPath(treePath) expectedFileResponse := getExpectedFileResponseForCreate("user2/"+reponame, commitID, treePath, latestCommit.ID.String()) diff --git a/tests/integration/api_repo_file_delete_test.go b/tests/integration/api_repo_file_delete_test.go index b76edf45ca..7c93307e19 100644 --- a/tests/integration/api_repo_file_delete_test.go +++ b/tests/integration/api_repo_file_delete_test.go @@ -9,11 +9,11 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_file_get_test.go b/tests/integration/api_repo_file_get_test.go index 7bd7393b01..1a4e670bc1 100644 --- a/tests/integration/api_repo_file_get_test.go +++ b/tests/integration/api_repo_file_get_test.go @@ -8,10 +8,10 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_file_helpers.go b/tests/integration/api_repo_file_helpers.go index 09cf93d8a5..4350092b8b 100644 --- a/tests/integration/api_repo_file_helpers.go +++ b/tests/integration/api_repo_file_helpers.go @@ -6,12 +6,12 @@ package integration import ( "strings" - "forgejo.org/models" - repo_model "forgejo.org/models/repo" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" - files_service "forgejo.org/services/repository/files" + "code.gitea.io/gitea/models" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" + files_service "code.gitea.io/gitea/services/repository/files" ) func createFileInBranch(user *user_model.User, repo *repo_model.Repository, treePath, branchName, content string) (*api.FilesResponse, error) { diff --git a/tests/integration/api_repo_file_update_test.go b/tests/integration/api_repo_file_update_test.go index 4ed0df2b08..ac28e0c0a2 100644 --- a/tests/integration/api_repo_file_update_test.go +++ b/tests/integration/api_repo_file_update_test.go @@ -4,6 +4,7 @@ package integration import ( + stdCtx "context" "encoding/base64" "fmt" "net/http" @@ -11,14 +12,14 @@ import ( "path/filepath" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + 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/gitrepo" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" "github.com/stretchr/testify/assert" ) @@ -134,7 +135,7 @@ func TestAPIUpdateFile(t *testing.T) { req := NewRequestWithJSON(t, "PUT", fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo1.Name, treePath), &updateFileOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusOK) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(stdCtx.Background(), repo1) commitID, _ := gitRepo.GetBranchCommitID(updateFileOptions.NewBranchName) lasCommit, _ := gitRepo.GetCommitByPath(treePath) expectedFileResponse := getExpectedFileResponseForUpdate(commitID, treePath, lasCommit.ID.String()) diff --git a/tests/integration/api_repo_files_change_test.go b/tests/integration/api_repo_files_change_test.go index d188751dab..fb3ae5e4dd 100644 --- a/tests/integration/api_repo_files_change_test.go +++ b/tests/integration/api_repo_files_change_test.go @@ -4,20 +4,21 @@ package integration import ( + stdCtx "context" "encoding/base64" "fmt" "net/http" "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/context" + auth_model "code.gitea.io/gitea/models/auth" + 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/gitrepo" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/context" "github.com/stretchr/testify/assert" ) @@ -95,7 +96,7 @@ func TestAPIChangeFiles(t *testing.T) { req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/contents", user2.Name, repo1.Name), &changeFilesOptions). AddTokenAuth(token2) resp := MakeRequest(t, req, http.StatusCreated) - gitRepo, _ := gitrepo.OpenRepository(t.Context(), repo1) + gitRepo, _ := gitrepo.OpenRepository(stdCtx.Background(), repo1) commitID, _ := gitRepo.GetBranchCommitID(changeFilesOptions.NewBranchName) createLasCommit, _ := gitRepo.GetCommitByPath(createTreePath) updateLastCommit, _ := gitRepo.GetCommitByPath(updateTreePath) diff --git a/tests/integration/api_repo_get_contents_list_test.go b/tests/integration/api_repo_get_contents_list_test.go index 543f10f6d2..e76ccd9932 100644 --- a/tests/integration/api_repo_get_contents_list_test.go +++ b/tests/integration/api_repo_get_contents_list_test.go @@ -9,15 +9,15 @@ import ( "path/filepath" "testing" - auth_model "forgejo.org/models/auth" - 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/setting" - api "forgejo.org/modules/structs" - repo_service "forgejo.org/services/repository" + auth_model "code.gitea.io/gitea/models/auth" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + repo_service "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_get_contents_test.go b/tests/integration/api_repo_get_contents_test.go index 9cf266b3dd..cb321b8b1f 100644 --- a/tests/integration/api_repo_get_contents_test.go +++ b/tests/integration/api_repo_get_contents_test.go @@ -9,15 +9,15 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - 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/setting" - api "forgejo.org/modules/structs" - repo_service "forgejo.org/services/repository" + auth_model "code.gitea.io/gitea/models/auth" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + repo_service "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_git_blobs_test.go b/tests/integration/api_repo_git_blobs_test.go index 980fff1e52..184362e7e3 100644 --- a/tests/integration/api_repo_git_blobs_test.go +++ b/tests/integration/api_repo_git_blobs_test.go @@ -7,12 +7,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_git_commits_test.go b/tests/integration/api_repo_git_commits_test.go index e80c0024b8..c4c626eb49 100644 --- a/tests/integration/api_repo_git_commits_test.go +++ b/tests/integration/api_repo_git_commits_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_git_hook_test.go b/tests/integration/api_repo_git_hook_test.go index aadc231d82..9917b41790 100644 --- a/tests/integration/api_repo_git_hook_test.go +++ b/tests/integration/api_repo_git_hook_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_git_notes_test.go b/tests/integration/api_repo_git_notes_test.go index dfafec7135..9f3e927077 100644 --- a/tests/integration/api_repo_git_notes_test.go +++ b/tests/integration/api_repo_git_notes_test.go @@ -4,21 +4,19 @@ package integration import ( - "fmt" "net/http" "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) -func TestAPIReposGetGitNotes(t *testing.T) { +func TestAPIReposGitNotes(t *testing.T) { onGiteaRun(t, func(*testing.T, *url.URL) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // Login as User2. @@ -46,53 +44,3 @@ func TestAPIReposGetGitNotes(t *testing.T) { assert.NotNil(t, apiData.Commit.RepoCommit.Verification) }) } - -func TestAPIReposSetGitNotes(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - req := NewRequestf(t, "GET", "/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()) - resp := MakeRequest(t, req, http.StatusOK) - var apiData api.Note - DecodeJSON(t, resp, &apiData) - assert.Equal(t, "This is a test note\n", apiData.Message) - - req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()), &api.NoteOptions{ - Message: "This is a new note", - }).AddTokenAuth(token) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &apiData) - assert.Equal(t, "This is a new note\n", apiData.Message) - - req = NewRequestf(t, "GET", "/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &apiData) - assert.Equal(t, "This is a new note\n", apiData.Message) - }) -} - -func TestAPIReposDeleteGitNotes(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - req := NewRequestf(t, "GET", "/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()) - resp := MakeRequest(t, req, http.StatusOK) - var apiData api.Note - DecodeJSON(t, resp, &apiData) - assert.Equal(t, "This is a test note\n", apiData.Message) - - req = NewRequestf(t, "DELETE", "/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()).AddTokenAuth(token) - MakeRequest(t, req, http.StatusNoContent) - - req = NewRequestf(t, "GET", "/api/v1/repos/%s/git/notes/65f1bf27bc3bf70f64657658635e66094edbcb4d", repo.FullName()) - MakeRequest(t, req, http.StatusNotFound) - }) -} diff --git a/tests/integration/api_repo_git_ref_test.go b/tests/integration/api_repo_git_ref_test.go index a4c05e208c..875752ae3f 100644 --- a/tests/integration/api_repo_git_ref_test.go +++ b/tests/integration/api_repo_git_ref_test.go @@ -7,10 +7,10 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" ) func TestAPIReposGitRefs(t *testing.T) { diff --git a/tests/integration/api_repo_git_tags_test.go b/tests/integration/api_repo_git_tags_test.go index 73d7250c46..c5883a8058 100644 --- a/tests/integration/api_repo_git_tags_test.go +++ b/tests/integration/api_repo_git_tags_test.go @@ -8,15 +8,15 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_git_trees_test.go b/tests/integration/api_repo_git_trees_test.go index f321760218..8eec6d8d22 100644 --- a/tests/integration/api_repo_git_trees_test.go +++ b/tests/integration/api_repo_git_trees_test.go @@ -7,11 +7,11 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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/tests" ) func TestAPIReposGitTrees(t *testing.T) { diff --git a/tests/integration/api_repo_hook_test.go b/tests/integration/api_repo_hook_test.go index b2b8b47d40..9ae8119b28 100644 --- a/tests/integration/api_repo_hook_test.go +++ b/tests/integration/api_repo_hook_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_lfs_locks_test.go b/tests/integration/api_repo_lfs_locks_test.go index b3a295c2de..4ba01e6d9b 100644 --- a/tests/integration/api_repo_lfs_locks_test.go +++ b/tests/integration/api_repo_lfs_locks_test.go @@ -9,13 +9,13 @@ import ( "testing" "time" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_lfs_migrate_test.go b/tests/integration/api_repo_lfs_migrate_test.go index fcfa43cac4..de85b9160d 100644 --- a/tests/integration/api_repo_lfs_migrate_test.go +++ b/tests/integration/api_repo_lfs_migrate_test.go @@ -8,14 +8,14 @@ import ( "path" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/services/migrations" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/migrations" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_lfs_test.go b/tests/integration/api_repo_lfs_test.go index 078cedf78e..7a2a92d415 100644 --- a/tests/integration/api_repo_lfs_test.go +++ b/tests/integration/api_repo_lfs_test.go @@ -11,17 +11,17 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "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/json" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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/json" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_repo_pulls_test.go b/tests/integration/api_repo_pulls_test.go deleted file mode 100644 index aec492e65f..0000000000 --- a/tests/integration/api_repo_pulls_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "testing" - - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestAPIRepoPulls(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - // repo = user2/repo1 - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - - // issue id without assigned review member or review team - issueID := 5 - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d", repo.OwnerName, repo.Name, issueID)) - res := MakeRequest(t, req, http.StatusOK) - var pr *api.PullRequest - DecodeJSON(t, res, &pr) - - assert.NotNil(t, pr.RequestedReviewers) - assert.NotNil(t, pr.RequestedReviewersTeams) -} diff --git a/tests/integration/api_repo_raw_test.go b/tests/integration/api_repo_raw_test.go index 5ae11a8e71..e5f83d1c80 100644 --- a/tests/integration/api_repo_raw_test.go +++ b/tests/integration/api_repo_raw_test.go @@ -7,10 +7,10 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_secrets_test.go b/tests/integration/api_repo_secrets_test.go index a2c9439f03..c3074d9ece 100644 --- a/tests/integration/api_repo_secrets_test.go +++ b/tests/integration/api_repo_secrets_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" ) func TestAPIRepoSecrets(t *testing.T) { diff --git a/tests/integration/api_repo_tags_test.go b/tests/integration/api_repo_tags_test.go index 81475249a1..09f17ef475 100644 --- a/tests/integration/api_repo_tags_test.go +++ b/tests/integration/api_repo_tags_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_teams_test.go b/tests/integration/api_repo_teams_test.go index c75714d003..91bfd66b3a 100644 --- a/tests/integration/api_repo_teams_test.go +++ b/tests/integration/api_repo_teams_test.go @@ -8,14 +8,14 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/modules/util" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index d00b6feb66..b635b7099e 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -9,18 +9,18 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - access_model "forgejo.org/models/perm/access" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + access_model "code.gitea.io/gitea/models/perm/access" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -396,7 +396,6 @@ func TestAPIRepoMigrate(t *testing.T) { CloneAddr: testCase.cloneURL, RepoOwnerID: testCase.userID, RepoName: testCase.repoName, - Wiki: true, }).AddTokenAuth(token) resp := MakeRequest(t, req, NoExpectedStatus) if resp.Code == http.StatusUnprocessableEntity { @@ -765,58 +764,3 @@ func TestAPIRepoCommitPull(t *testing.T) { req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/not-a-commit/pull") MakeRequest(t, req, http.StatusNotFound) } - -func TestAPIListOwnRepoSorting(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository, auth_model.AccessTokenScopeReadUser) - - t.Run("No sorting", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos").AddTokenAuth(token), http.StatusOK) - }) - - t.Run("ID sorting", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - var repos []api.Repository - resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=id").AddTokenAuth(token), http.StatusOK) - DecodeJSON(t, resp, &repos) - - assert.Len(t, repos, 2) - assert.EqualValues(t, 1, repos[0].ID) - assert.EqualValues(t, 2, repos[1].ID) - }) - - t.Run("Name sorting", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - var repos []api.Repository - resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=name").AddTokenAuth(token), http.StatusOK) - DecodeJSON(t, resp, &repos) - - assert.Len(t, repos, 2) - assert.EqualValues(t, "big_test_private_4", repos[0].Name) - // Postgres doesn't do ascii sorting. - if setting.Database.Type.IsPostgreSQL() { - assert.EqualValues(t, "commitsonpr", repos[1].Name) - } else { - assert.EqualValues(t, "commits_search_test", repos[1].Name) - } - }) - - t.Run("Reverse alphabetic sorting", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - var repos []api.Repository - resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=reversealphabetically").AddTokenAuth(token), http.StatusOK) - DecodeJSON(t, resp, &repos) - - assert.Len(t, repos, 2) - assert.EqualValues(t, "utf8", repos[0].Name) - assert.EqualValues(t, "test_workflows", repos[1].Name) - }) -} diff --git a/tests/integration/api_repo_topic_test.go b/tests/integration/api_repo_topic_test.go index c826fbd818..dcb8ae09da 100644 --- a/tests/integration/api_repo_topic_test.go +++ b/tests/integration/api_repo_topic_test.go @@ -10,12 +10,12 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_repo_variables_test.go b/tests/integration/api_repo_variables_test.go index 6e3e8c1db6..7847962b07 100644 --- a/tests/integration/api_repo_variables_test.go +++ b/tests/integration/api_repo_variables_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" ) func TestAPIRepoVariables(t *testing.T) { diff --git a/tests/integration/api_settings_test.go b/tests/integration/api_settings_test.go index e13f4062da..9881578fba 100644 --- a/tests/integration/api_settings_test.go +++ b/tests/integration/api_settings_test.go @@ -7,9 +7,9 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_team_test.go b/tests/integration/api_team_test.go index 41d34dcd50..4fee39d687 100644 --- a/tests/integration/api_team_test.go +++ b/tests/integration/api_team_test.go @@ -9,17 +9,17 @@ import ( "sort" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/services/convert" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_team_user_test.go b/tests/integration/api_team_user_test.go index 0c76dd459d..6c80bc9f80 100644 --- a/tests/integration/api_team_user_test.go +++ b/tests/integration/api_team_user_test.go @@ -8,13 +8,13 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/services/convert" - "forgejo.org/tests" + auth_model "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/services/convert" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_token_test.go b/tests/integration/api_token_test.go index aba6a25256..01d18ef6f1 100644 --- a/tests/integration/api_token_test.go +++ b/tests/integration/api_token_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/log" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -30,23 +30,6 @@ func TestAPICreateAndDeleteToken(t *testing.T) { deleteAPIAccessToken(t, newAccessToken, user) } -func TestAPIGetTokens(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - - // with basic auth... - req := NewRequest(t, "GET", "/api/v1/users/user2/tokens"). - AddBasicAuth(user.Name) - MakeRequest(t, req, http.StatusOK) - - // ... or with a token. - newAccessToken := createAPIAccessTokenWithoutCleanUp(t, "test-key-1", user, []auth_model.AccessTokenScope{auth_model.AccessTokenScopeAll}) - req = NewRequest(t, "GET", "/api/v1/users/user2/tokens"). - AddTokenAuth(newAccessToken.Token) - MakeRequest(t, req, http.StatusOK) - deleteAPIAccessToken(t, newAccessToken, user) -} - // TestAPIDeleteMissingToken ensures that error is thrown when token not found func TestAPIDeleteMissingToken(t *testing.T) { defer tests.PrepareTestEnv(t)() diff --git a/tests/integration/api_twofa_test.go b/tests/integration/api_twofa_test.go index 6441b23199..fb1d2badfc 100644 --- a/tests/integration/api_twofa_test.go +++ b/tests/integration/api_twofa_test.go @@ -8,11 +8,11 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + auth_model "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/tests" "github.com/pquerna/otp/totp" "github.com/stretchr/testify/assert" @@ -38,8 +38,9 @@ func TestAPITwoFactor(t *testing.T) { tfa := &auth_model.TwoFactor{ UID: user.ID, } + require.NoError(t, tfa.SetSecret(otpKey.Secret())) - require.NoError(t, auth_model.NewTwoFactor(db.DefaultContext, tfa, otpKey.Secret())) + require.NoError(t, auth_model.NewTwoFactor(db.DefaultContext, tfa)) req = NewRequest(t, "GET", "/api/v1/user"). AddBasicAuth(user.Name) diff --git a/tests/integration/api_user_actions_test.go b/tests/integration/api_user_actions_test.go deleted file mode 100644 index 1eb5089ee4..0000000000 --- a/tests/integration/api_user_actions_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "testing" - - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestAPISearchActionJobs_UserRunner(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - normalUsername := "user2" - session := loginUser(t, normalUsername) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser) - job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: 394}) - - req := NewRequest(t, "GET", - fmt.Sprintf("/api/v1/user/actions/runners/jobs?labels=%s", "debian-latest")). - AddTokenAuth(token) - res := MakeRequest(t, req, http.StatusOK) - - var jobs []*api.ActionRunJob - DecodeJSON(t, res, &jobs) - - assert.Len(t, jobs, 1) - assert.EqualValues(t, job.ID, jobs[0].ID) -} diff --git a/tests/integration/api_user_avatar_test.go b/tests/integration/api_user_avatar_test.go index 858e6cf71f..22dc09a6b7 100644 --- a/tests/integration/api_user_avatar_test.go +++ b/tests/integration/api_user_avatar_test.go @@ -9,9 +9,9 @@ import ( "os" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/api_user_email_test.go b/tests/integration/api_user_email_test.go index b0907ad1cf..6441e2ed8e 100644 --- a/tests/integration/api_user_email_test.go +++ b/tests/integration/api_user_email_test.go @@ -7,9 +7,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_follow_test.go b/tests/integration/api_user_follow_test.go index 703d8ff494..68443eff48 100644 --- a/tests/integration/api_user_follow_test.go +++ b/tests/integration/api_user_follow_test.go @@ -8,9 +8,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_heatmap_test.go b/tests/integration/api_user_heatmap_test.go index 69d2524aaa..a23536735b 100644 --- a/tests/integration/api_user_heatmap_test.go +++ b/tests/integration/api_user_heatmap_test.go @@ -9,10 +9,10 @@ import ( "testing" "time" - activities_model "forgejo.org/models/activities" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/timeutil" - "forgejo.org/tests" + activities_model "code.gitea.io/gitea/models/activities" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_info_test.go b/tests/integration/api_user_info_test.go index eefabe52ac..89f7266859 100644 --- a/tests/integration/api_user_info_test.go +++ b/tests/integration/api_user_info_test.go @@ -8,11 +8,11 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_org_perm_test.go b/tests/integration/api_user_org_perm_test.go index 9a09a34087..85bb1db170 100644 --- a/tests/integration/api_user_org_perm_test.go +++ b/tests/integration/api_user_org_perm_test.go @@ -8,9 +8,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_orgs_test.go b/tests/integration/api_user_orgs_test.go index ca3fc7df34..e31199406d 100644 --- a/tests/integration/api_user_orgs_test.go +++ b/tests/integration/api_user_orgs_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "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" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_search_test.go b/tests/integration/api_user_search_test.go index 3df3e45778..97c42aa696 100644 --- a/tests/integration/api_user_search_test.go +++ b/tests/integration/api_user_search_test.go @@ -7,13 +7,13 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -143,39 +143,3 @@ func TestAPIUserSearchNotLoggedInUserHidden(t *testing.T) { DecodeJSON(t, resp, &results) assert.Empty(t, results.Data) } - -func TestAPIUserSearchByEmail(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - // admin can search user with private email - adminUsername := "user1" - session := loginUser(t, adminUsername) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser) - query := "user2@example.com" - req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query). - AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var results SearchResults - DecodeJSON(t, resp, &results) - assert.Len(t, results.Data, 1) - assert.Equal(t, query, results.Data[0].Email) - - // no login user can not search user with private email - req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &results) - assert.Empty(t, results.Data) - - // user can search self with private email - user2 := "user2" - session = loginUser(t, user2) - token = getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser) - req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query). - AddTokenAuth(token) - resp = MakeRequest(t, req, http.StatusOK) - - DecodeJSON(t, resp, &results) - assert.Len(t, results.Data, 1) - assert.Equal(t, query, results.Data[0].Email) -} diff --git a/tests/integration/api_user_secrets_test.go b/tests/integration/api_user_secrets_test.go index 50ecdedfd6..56bf30e804 100644 --- a/tests/integration/api_user_secrets_test.go +++ b/tests/integration/api_user_secrets_test.go @@ -8,9 +8,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" ) func TestAPIUserSecrets(t *testing.T) { diff --git a/tests/integration/api_user_star_test.go b/tests/integration/api_user_star_test.go index 27e5b9e0ca..aafe9cfb8b 100644 --- a/tests/integration/api_user_star_test.go +++ b/tests/integration/api_user_star_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_user_variables_test.go b/tests/integration/api_user_variables_test.go index 2e219be7ec..9fd84ddf81 100644 --- a/tests/integration/api_user_variables_test.go +++ b/tests/integration/api_user_variables_test.go @@ -8,9 +8,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" ) func TestAPIUserVariables(t *testing.T) { diff --git a/tests/integration/api_user_watch_test.go b/tests/integration/api_user_watch_test.go index fd8964a8ed..953e00551d 100644 --- a/tests/integration/api_user_watch_test.go +++ b/tests/integration/api_user_watch_test.go @@ -8,9 +8,9 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/api_wiki_test.go b/tests/integration/api_wiki_test.go index 1720587dd4..ac868bbed0 100644 --- a/tests/integration/api_wiki_test.go +++ b/tests/integration/api_wiki_test.go @@ -5,21 +5,21 @@ package integration import ( + "context" "encoding/base64" "fmt" "net/http" - "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - api "forgejo.org/modules/structs" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/optional" + api "code.gitea.io/gitea/modules/structs" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -223,40 +223,17 @@ func TestAPIListWikiPages(t *testing.T) { Message: "add unescaped file\n", }, }, - { - Title: "XSS", - HTMLURL: meta[5].HTMLURL, - SubURL: "XSS", - LastCommit: &api.WikiCommit{ - ID: "f54f5a6b7c4f83b606600e43186165854f189530", - Author: &api.CommitUser{ - Identity: api.Identity{ - Name: "Gusted", - Email: "valid@example.org", - }, - Date: "2024-01-31T00:00:00Z", - }, - Committer: &api.CommitUser{ - Identity: api.Identity{ - Name: "Gusted", - Email: "valid@example.org", - }, - Date: "2024-01-31T00:00:00Z", - }, - Message: "Yay XSS", - }, - }, } assert.Equal(t, dummymeta, meta) } func TestAPINewWikiPage(t *testing.T) { - defer tests.PrepareTestEnv(t)() for _, title := range []string{ "New page", "&&&&", } { + defer tests.PrepareTestEnv(t)() username := "user2" session := loginUser(t, username) token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) @@ -319,7 +296,7 @@ func TestAPIEditOtherWikiPage(t *testing.T) { testCreateWiki(http.StatusForbidden) // Update the repo settings for user2's repo to enable globally writeable wiki - ctx := t.Context() + ctx := context.Background() repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) var units []repo_model.RepoUnit units = append(units, repo_model.RepoUnit{ @@ -432,26 +409,26 @@ func TestAPIListPageRevisions(t *testing.T) { } func TestAPIWikiNonMasterBranch(t *testing.T) { - onGiteaRun(t, func(t *testing.T, _ *url.URL) { - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, user, tests.DeclarativeRepoOptions{ - WikiBranch: optional.Some("main"), - }) - defer f() + defer tests.PrepareTestEnv(t)() - uris := []string{ - "revisions/Home", - "pages", - "page/Home", - } - baseURL := fmt.Sprintf("/api/v1/repos/%s/wiki", repo.FullName()) - for _, uri := range uris { - t.Run(uri, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestf(t, "GET", "%s/%s", baseURL, uri) - MakeRequest(t, req, http.StatusOK) - }) - } + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, user, tests.DeclarativeRepoOptions{ + WikiBranch: optional.Some("main"), }) + defer f() + + uris := []string{ + "revisions/Home", + "pages", + "page/Home", + } + baseURL := fmt.Sprintf("/api/v1/repos/%s/wiki", repo.FullName()) + for _, uri := range uris { + t.Run(uri, func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequestf(t, "GET", "%s/%s", baseURL, uri) + MakeRequest(t, req, http.StatusOK) + }) + } } diff --git a/tests/integration/appearance_settings_test.go b/tests/integration/appearance_settings_test.go deleted file mode 100644 index 33ca9f97aa..0000000000 --- a/tests/integration/appearance_settings_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "strings" - "testing" - - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestThemeChange(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user := loginUser(t, "user2") - - // Verify default theme - testSelectedTheme(t, user, "forgejo-auto", "Forgejo (follow system theme)") - - // Change theme to forgejo-dark and verify it works fine - testChangeTheme(t, user, "forgejo-dark") - testSelectedTheme(t, user, "forgejo-dark", "Forgejo dark") - - // Change theme to gitea-dark and also verify that it's name is not translated - testChangeTheme(t, user, "gitea-dark") - testSelectedTheme(t, user, "gitea-dark", "gitea-dark") -} - -// testSelectedTheme checks that the expected theme is used in html[data-theme] -// and is default on appearance page -func testSelectedTheme(t *testing.T, session *TestSession, expectedTheme, expectedName string) { - t.Helper() - response := session.MakeRequest(t, NewRequest(t, "GET", "/user/settings/appearance"), http.StatusOK) - page := NewHTMLParser(t, response.Body) - - dataTheme, dataThemeExists := page.Find("html").Attr("data-theme") - assert.True(t, dataThemeExists) - assert.EqualValues(t, expectedTheme, dataTheme) - - selectedTheme := page.Find("form[action='/user/settings/appearance/theme'] .menu .item.selected") - selectorTheme, selectorThemeExists := selectedTheme.Attr("data-value") - assert.True(t, selectorThemeExists) - assert.EqualValues(t, expectedTheme, selectorTheme) - assert.EqualValues(t, expectedName, strings.TrimSpace(selectedTheme.Text())) -} - -// testSelectedTheme changes user's theme -func testChangeTheme(t *testing.T, session *TestSession, newTheme string) { - t.Helper() - session.MakeRequest(t, NewRequestWithValues(t, "POST", "/user/settings/appearance/theme", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings/appearance"), - "theme": newTheme, - }), http.StatusSeeOther) -} diff --git a/tests/integration/attachment_test.go b/tests/integration/attachment_test.go index 5920620f48..7cbc2545d5 100644 --- a/tests/integration/attachment_test.go +++ b/tests/integration/attachment_test.go @@ -13,10 +13,10 @@ import ( "strings" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/storage" - "forgejo.org/modules/test" - "forgejo.org/tests" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,7 +30,7 @@ func generateImg() bytes.Buffer { return buff } -func createAttachment(t *testing.T, session *TestSession, csrf, repoURL, filename string, buff bytes.Buffer, expectedStatus int) string { +func createAttachment(t *testing.T, session *TestSession, repoURL, filename string, buff bytes.Buffer, expectedStatus int) string { body := &bytes.Buffer{} // Setup multi-part @@ -42,6 +42,8 @@ func createAttachment(t *testing.T, session *TestSession, csrf, repoURL, filenam err = writer.Close() require.NoError(t, err) + csrf := GetCSRF(t, session, repoURL) + req := NewRequestWithBody(t, "POST", repoURL+"/issues/attachments", body) req.Header.Add("X-Csrf-Token", csrf) req.Header.Add("Content-Type", writer.FormDataContentType()) @@ -58,14 +60,15 @@ func createAttachment(t *testing.T, session *TestSession, csrf, repoURL, filenam func TestCreateAnonymousAttachment(t *testing.T) { defer tests.PrepareTestEnv(t)() session := emptyTestSession(t) - createAttachment(t, session, GetCSRF(t, session, "/user/login"), "user2/repo1", "image.png", generateImg(), http.StatusSeeOther) + // this test is not right because it just doesn't pass the CSRF validation + createAttachment(t, session, "user2/repo1", "image.png", generateImg(), http.StatusBadRequest) } func TestCreateIssueAttachment(t *testing.T) { defer tests.PrepareTestEnv(t)() const repoURL = "user2/repo1" session := loginUser(t, "user2") - uuid := createAttachment(t, session, GetCSRF(t, session, repoURL), repoURL, "image.png", generateImg(), http.StatusOK) + uuid := createAttachment(t, session, repoURL, "image.png", generateImg(), http.StatusOK) req := NewRequest(t, "GET", repoURL+"/issues/new") resp := session.MakeRequest(t, req, http.StatusOK) diff --git a/tests/integration/auth_ldap_test.go b/tests/integration/auth_ldap_test.go index 6b9a71a5aa..9bcb532d75 100644 --- a/tests/integration/auth_ldap_test.go +++ b/tests/integration/auth_ldap_test.go @@ -4,21 +4,22 @@ package integration import ( + "context" "net/http" "os" "strings" "testing" - "forgejo.org/models" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/translation" - "forgejo.org/services/auth" - "forgejo.org/services/auth/source/ldap" - "forgejo.org/tests" + "code.gitea.io/gitea/models" + auth_model "code.gitea.io/gitea/models/auth" + "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/translation" + "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/ldap" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -184,6 +185,7 @@ func TestLDAPUserSignin(t *testing.T) { assert.Equal(t, u.UserName, htmlDoc.GetInputValueByName("name")) assert.Equal(t, u.FullName, htmlDoc.GetInputValueByName("full_name")) + assert.Equal(t, u.Email, htmlDoc.Find("#signed-user-email").Text()) } func TestLDAPAuthChange(t *testing.T) { @@ -243,7 +245,7 @@ func TestLDAPUserSync(t *testing.T) { } defer tests.PrepareTestEnv(t)() addAuthSourceLDAP(t, "", "", "", "") - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) // Check if users exists for _, gitLDAPUser := range gitLDAPUsers { @@ -282,7 +284,7 @@ func TestLDAPUserSyncWithEmptyUsernameAttribute(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) - tr := htmlDoc.doc.Find("table.table tbody tr:not(.no-results-row)") + tr := htmlDoc.doc.Find("table.table tbody tr") assert.Equal(t, 0, tr.Length()) } @@ -295,7 +297,7 @@ func TestLDAPUserSyncWithEmptyUsernameAttribute(t *testing.T) { MakeRequest(t, req, http.StatusSeeOther) } - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) authSource := unittest.AssertExistsAndLoadBean(t, &auth_model.Source{ Name: payload["name"], @@ -330,7 +332,7 @@ func TestLDAPUserSyncWithGroupFilter(t *testing.T) { u := otherLDAPUsers[0] testLoginFailed(t, u.UserName, u.Password, translation.NewLocale("en-US").TrString("form.username_password_incorrect")) - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) // Assert members of LDAP group "cn=git" are added for _, gitLDAPUser := range gitLDAPUsers { @@ -353,7 +355,7 @@ func TestLDAPUserSyncWithGroupFilter(t *testing.T) { ldapConfig.GroupFilter = "(cn=ship_crew)" auth_model.UpdateSource(db.DefaultContext, ldapSource) - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) for _, gitLDAPUser := range gitLDAPUsers { if gitLDAPUser.UserName == "fry" || gitLDAPUser.UserName == "leela" || gitLDAPUser.UserName == "bender" { @@ -392,7 +394,7 @@ func TestLDAPUserSSHKeySync(t *testing.T) { defer tests.PrepareTestEnv(t)() addAuthSourceLDAP(t, "sshPublicKey", "", "", "") - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) // Check if users has SSH keys synced for _, u := range gitLDAPUsers { @@ -428,7 +430,7 @@ func TestLDAPGroupTeamSyncAddMember(t *testing.T) { require.NoError(t, err) team, err := organization.GetTeam(db.DefaultContext, org.ID, "team11") require.NoError(t, err) - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) for _, gitLDAPUser := range gitLDAPUsers { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ Name: gitLDAPUser.UserName, @@ -517,7 +519,7 @@ func TestLDAPUserSyncInvalidMail(t *testing.T) { } defer tests.PrepareTestEnv(t)() addAuthSourceLDAP(t, "", "nonexisting", "", "") - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) // Check if users exists for _, gitLDAPUser := range gitLDAPUsers { @@ -543,7 +545,7 @@ func TestLDAPUserSyncInvalidMailDefaultDomain(t *testing.T) { } defer tests.PrepareTestEnv(t)() addAuthSourceLDAP(t, "", "nonexisting", "test.org", "") - auth.SyncExternalUsers(t.Context(), true) + auth.SyncExternalUsers(context.Background(), true) // Check if users exists for _, gitLDAPUser := range gitLDAPUsers { diff --git a/tests/integration/auth_token_test.go b/tests/integration/auth_token_test.go index b4242c2681..d1fd5dda83 100644 --- a/tests/integration/auth_token_test.go +++ b/tests/integration/auth_token_test.go @@ -10,13 +10,13 @@ import ( "strings" "testing" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/timeutil" - "forgejo.org/tests" + "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/setting" + "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/benchmarks_test.go b/tests/integration/benchmarks_test.go index 40875e0c7d..62da761d2d 100644 --- a/tests/integration/benchmarks_test.go +++ b/tests/integration/benchmarks_test.go @@ -9,9 +9,9 @@ import ( "net/url" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + api "code.gitea.io/gitea/modules/structs" ) // StringWithCharset random string (from https://www.calhoun.io/creating-random-strings-in-go/) diff --git a/tests/integration/block_test.go b/tests/integration/block_test.go index 7a2756522b..b17a445bf8 100644 --- a/tests/integration/block_test.go +++ b/tests/integration/block_test.go @@ -11,15 +11,15 @@ import ( "strconv" "testing" - "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/translation" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" + "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/translation" + forgejo_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -147,27 +147,13 @@ func TestBlockUserFromOrganization(t *testing.T) { session.MakeRequest(t, req, http.StatusInternalServerError) }) }) - - t.Run("Block the doer", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithValues(t, "POST", org.OrganisationLink()+"/settings/blocked_users/block", map[string]string{ - "_csrf": GetCSRF(t, session, org.OrganisationLink()+"/settings/blocked_users"), - "uname": doer.Name, - }) - session.MakeRequest(t, req, http.StatusSeeOther) - assert.False(t, unittest.BeanExists(t, &user_model.BlockedUser{BlockID: doer.ID, UserID: org.ID})) - flashCookie := session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "error%3DYou%2Bcannot%2Bblock%2Byourself.", flashCookie.Value) - }) } // TestBlockActions ensures that certain actions cannot be performed as a doer // and as a blocked user and are handled cleanly after the blocking has taken // place. func TestBlockActions(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestBlockActions")() + defer tests.AddFixtures("tests/integration/fixtures/TestBlockActions/")() defer tests.PrepareTestEnv(t)() doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) @@ -253,12 +239,6 @@ func TestBlockActions(t *testing.T) { DecodeJSON(t, resp, &errorResp) assert.EqualValues(t, expectedMessage, errorResp.Error) - - req = NewRequest(t, "GET", issue10URL) - resp = session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - msg := htmlDoc.doc.Find("div .warning").Text() - assert.Contains(t, msg, "You cannot comment on this issue because you are blocked") }) t.Run("Blocked by issue poster", func(t *testing.T) { @@ -280,12 +260,6 @@ func TestBlockActions(t *testing.T) { DecodeJSON(t, resp, &errorResp) assert.EqualValues(t, expectedMessage, errorResp.Error) - - req = NewRequest(t, "GET", issue10URL) - resp = session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - msg := htmlDoc.doc.Find("div .warning").Text() - assert.Contains(t, msg, "You cannot comment on this issue because you are blocked") }) }) @@ -438,7 +412,7 @@ func TestBlockActions(t *testing.T) { } func TestBlockedNotification(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestBlockedNotifications")() + defer tests.AddFixtures("tests/integration/fixtures/TestBlockedNotifications")() defer tests.PrepareTestEnv(t)() doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) diff --git a/tests/integration/branches_test.go b/tests/integration/branches_test.go index c599106866..e0482b6f2e 100644 --- a/tests/integration/branches_test.go +++ b/tests/integration/branches_test.go @@ -9,10 +9,10 @@ import ( "net/url" "testing" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - gitea_context "forgejo.org/services/context" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + gitea_context "code.gitea.io/gitea/services/context" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/change_default_branch_test.go b/tests/integration/change_default_branch_test.go index 84f02e41f9..703834b712 100644 --- a/tests/integration/change_default_branch_test.go +++ b/tests/integration/change_default_branch_test.go @@ -8,10 +8,10 @@ import ( "net/http" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + 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/tests" ) func TestChangeDefaultBranch(t *testing.T) { diff --git a/tests/integration/cmd_admin_test.go b/tests/integration/cmd_admin_test.go index 043ecef346..576b09eefd 100644 --- a/tests/integration/cmd_admin_test.go +++ b/tests/integration/cmd_admin_test.go @@ -7,10 +7,9 @@ import ( "net/url" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -45,7 +44,6 @@ func Test_Cmd_AdminUser(t *testing.T) { }, } { t.Run(testCase.name, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() name := "testuser" options := []string{"user", "create", "--username", name, "--password", "password", "--email", name + "@example.com"} diff --git a/tests/integration/cmd_forgejo_actions_test.go b/tests/integration/cmd_forgejo_actions_test.go index bee50a6d98..067cdefb88 100644 --- a/tests/integration/cmd_forgejo_actions_test.go +++ b/tests/integration/cmd_forgejo_actions_test.go @@ -3,6 +3,7 @@ package integration import ( + gocontext "context" "io" "net/url" "os" @@ -10,11 +11,10 @@ import ( "strings" "testing" - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + actions_model "code.gitea.io/gitea/models/actions" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -67,7 +67,6 @@ func Test_CmdForgejo_Actions(t *testing.T) { }, } { t.Run(testCase.testName, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() output, err := runMainApp("forgejo-cli", "actions", "register", "--secret", testCase.secret, "--scope", testCase.scope) assert.EqualValues(t, "", output) @@ -188,7 +187,7 @@ func Test_CmdForgejo_Actions(t *testing.T) { require.NoError(t, err) if assert.EqualValues(t, testCase.uuid, uuid) { ownerName, repoName, found := strings.Cut(testCase.scope, "/") - action, err := actions_model.GetRunnerByUUID(t.Context(), uuid) + action, err := actions_model.GetRunnerByUUID(gocontext.Background(), uuid) require.NoError(t, err) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: action.OwnerID}) diff --git a/tests/integration/cmd_forgejo_f3_test.go b/tests/integration/cmd_forgejo_f3_test.go index 1eda413e4c..9156405220 100644 --- a/tests/integration/cmd_forgejo_f3_test.go +++ b/tests/integration/cmd_forgejo_f3_test.go @@ -9,14 +9,14 @@ import ( "fmt" "testing" - "forgejo.org/cmd/forgejo" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/services/f3/driver/options" - "forgejo.org/tests" + "code.gitea.io/gitea/cmd/forgejo" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/services/f3/driver/options" + "code.gitea.io/gitea/tests" - _ "forgejo.org/services/f3/driver" - _ "forgejo.org/services/f3/driver/tests" + _ "code.gitea.io/gitea/services/f3/driver" + _ "code.gitea.io/gitea/services/f3/driver/tests" f3_filesystem_options "code.forgejo.org/f3/gof3/v3/forges/filesystem/options" f3_logger "code.forgejo.org/f3/gof3/v3/logger" @@ -59,7 +59,7 @@ func TestF3_CmdMirror_LocalForgejo(t *testing.T) { defer tests.PrepareTestEnv(t)() defer test.MockVariableValue(&setting.F3.Enabled, true)() - ctx := t.Context() + ctx := context.Background() mirrorOptions := f3_tests_forge.GetFactory(options.Name)().NewOptions(t) mirrorTree := f3_generic.GetFactory("f3")(ctx, mirrorOptions) diff --git a/tests/integration/cmd_keys_test.go b/tests/integration/cmd_keys_test.go index c76055c4a8..e93a8b5b57 100644 --- a/tests/integration/cmd_keys_test.go +++ b/tests/integration/cmd_keys_test.go @@ -9,8 +9,8 @@ import ( "os/exec" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/util" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/codeowner_test.go b/tests/integration/codeowner_test.go index e2eeb843d8..6ef354650b 100644 --- a/tests/integration/codeowner_test.go +++ b/tests/integration/codeowner_test.go @@ -4,6 +4,7 @@ package integration import ( + "context" "fmt" "net/http" "net/url" @@ -13,15 +14,15 @@ import ( "testing" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/require" ) @@ -47,7 +48,7 @@ func TestCodeOwner(t *testing.T) { r := fmt.Sprintf("%suser2/%s.git", u.String(), repo.Name) cloneURL, _ := url.Parse(r) cloneURL.User = url.UserPassword("user2", userPassword) - require.NoError(t, git.CloneWithArgs(t.Context(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) + require.NoError(t, git.CloneWithArgs(context.Background(), nil, cloneURL.String(), dstPath, git.CloneRepoOptions{})) t.Run("Normal", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -168,7 +169,7 @@ func TestCodeOwner(t *testing.T) { _, err := db.GetEngine(db.DefaultContext).Cols("is_private").Update(repo) require.NoError(t, err) - err = os.WriteFile(path.Join(dstPath, "README.md"), []byte("## very sensitive info"), 0o666) + err = os.WriteFile(path.Join(dstPath, "README.md"), []byte("## very senstive info"), 0o666) require.NoError(t, err) err = git.AddChanges(dstPath, true) diff --git a/tests/integration/comment_roles_system_test.go b/tests/integration/comment_roles_system_test.go deleted file mode 100644 index 0b4e78048a..0000000000 --- a/tests/integration/comment_roles_system_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "testing" - - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -// TestSystemCommentRoles verifies that system users don't have role labels. -// As it is not possible to do actions as system users, the tests are done using fixtures. - -func TestSystemCommentRoles(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestSystemCommentRoles")() - defer tests.PrepareTestEnv(t)() - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - - testCases := []struct { - name string - username string - index int64 - roleCount int64 - }{ - {"user2", "user2", 1000, 1}, // As a verification, also check a normal user with one role. - {"Ghost", "Ghost", 1001, 0}, // System users should not have any roles, so 0. - {"Actions", "forgejo-actions", 1002, 0}, - {"APActor", "Ghost", 1003, 0}, // actor is displayed as Ghost, could be a bug. - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ - RepoID: repo.ID, - Index: tc.index, - }) - - req := NewRequestf(t, "GET", "%s/issues/%d", repo.Link(), issue.Index) - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - assert.EqualValues(t, tc.username, htmlDoc.Find("a.author").Text()) - assert.EqualValues(t, tc.roleCount, htmlDoc.Find(".role-label").Length()) - }) - } -} diff --git a/tests/integration/commit_status_test.go b/tests/integration/commit_status_test.go deleted file mode 100644 index 9dd1bcd283..0000000000 --- a/tests/integration/commit_status_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "testing" - - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - "forgejo.org/models/unittest" - "forgejo.org/modules/structs" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestGetLatestCommitStatusForPairs(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - t.Run("Empty", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - pairs, err := git_model.GetLatestCommitStatusForPairs(db.DefaultContext, nil) - require.NoError(t, err) - assert.EqualValues(t, map[int64][]*git_model.CommitStatus{}, pairs) - }) - - t.Run("Repo 1", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - pairs, err := git_model.GetLatestCommitStatusForPairs(db.DefaultContext, []git_model.RepoSHA{{RepoID: 1, SHA: "1234123412341234123412341234123412341234"}}) - require.NoError(t, err) - - assert.EqualValues(t, map[int64][]*git_model.CommitStatus{ - 1: { - { - ID: 7, - Index: 6, - RepoID: 1, - State: structs.CommitStatusPending, - SHA: "1234123412341234123412341234123412341234", - TargetURL: "https://example.com/builds/", - Description: "My awesome deploy service", - ContextHash: "ae9547713a6665fc4261d0756904932085a41cf2", - Context: "deploy/awesomeness", - CreatorID: 2, - }, - { - ID: 4, - Index: 4, - State: structs.CommitStatusFailure, - TargetURL: "https://example.com/builds/", - Description: "My awesome CI-service", - Context: "ci/awesomeness", - CreatorID: 2, - RepoID: 1, - SHA: "1234123412341234123412341234123412341234", - ContextHash: "c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7", - }, - { - ID: 3, - Index: 3, - State: structs.CommitStatusSuccess, - TargetURL: "https://example.com/coverage/", - Description: "My awesome Coverage service", - Context: "cov/awesomeness", - CreatorID: 2, - RepoID: 1, - SHA: "1234123412341234123412341234123412341234", - ContextHash: "3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe", - }, - }, - }, pairs) - }) - t.Run("Repo 62", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - pairs, err := git_model.GetLatestCommitStatusForPairs(db.DefaultContext, []git_model.RepoSHA{{RepoID: 62, SHA: "774f93df12d14931ea93259ae93418da4482fcc1"}}) - require.NoError(t, err) - - assert.EqualValues(t, map[int64][]*git_model.CommitStatus{ - 62: { - { - ID: 8, - Index: 2, - RepoID: 62, - State: structs.CommitStatusError, - TargetURL: "/user2/test_workflows/actions", - Description: "My awesome deploy service - v2", - Context: "deploy/awesomeness", - SHA: "774f93df12d14931ea93259ae93418da4482fcc1", - ContextHash: "ae9547713a6665fc4261d0756904932085a41cf2", - CreatorID: 2, - }, - }, - }, pairs) - }) - - t.Run("Repo 62 non-existent sha", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - pairs, err := git_model.GetLatestCommitStatusForPairs(db.DefaultContext, []git_model.RepoSHA{{RepoID: 62, SHA: "774f93df12d14931ea93259ae93418da4482fcc"}}) - require.NoError(t, err) - - assert.EqualValues(t, map[int64][]*git_model.CommitStatus{}, pairs) - }) - - t.Run("SHA with non-existent repo id", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - pairs, err := git_model.GetLatestCommitStatusForPairs(db.DefaultContext, []git_model.RepoSHA{{RepoID: 1, SHA: "774f93df12d14931ea93259ae93418da4482fcc1"}}) - require.NoError(t, err) - - assert.EqualValues(t, map[int64][]*git_model.CommitStatus{}, pairs) - }) -} - -func TestGetLatestCommitStatusForRepoCommitIDs(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - t.Run("Empty", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoStatuses, err := git_model.GetLatestCommitStatusForRepoCommitIDs(db.DefaultContext, 62, nil) - require.NoError(t, err) - assert.EqualValues(t, map[string][]*git_model.CommitStatus{}, repoStatuses) - }) - - t.Run("Repo 1", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoStatuses, err := git_model.GetLatestCommitStatusForRepoCommitIDs(db.DefaultContext, 1, []string{"1234123412341234123412341234123412341234"}) - require.NoError(t, err) - assert.EqualValues(t, map[string][]*git_model.CommitStatus{ - "1234123412341234123412341234123412341234": { - { - ID: 3, - Index: 3, - State: structs.CommitStatusSuccess, - TargetURL: "https://example.com/coverage/", - Description: "My awesome Coverage service", - Context: "cov/awesomeness", - CreatorID: 2, - RepoID: 1, - SHA: "1234123412341234123412341234123412341234", - ContextHash: "3929ac7bccd3fa1bf9b38ddedb77973b1b9a8cfe", - }, - { - ID: 4, - Index: 4, - State: structs.CommitStatusFailure, - TargetURL: "https://example.com/builds/", - Description: "My awesome CI-service", - Context: "ci/awesomeness", - CreatorID: 2, - RepoID: 1, - SHA: "1234123412341234123412341234123412341234", - ContextHash: "c65f4d64a3b14a3eced0c9b36799e66e1bd5ced7", - }, - { - ID: 7, - Index: 6, - RepoID: 1, - State: structs.CommitStatusPending, - SHA: "1234123412341234123412341234123412341234", - TargetURL: "https://example.com/builds/", - Description: "My awesome deploy service", - ContextHash: "ae9547713a6665fc4261d0756904932085a41cf2", - Context: "deploy/awesomeness", - CreatorID: 2, - }, - }, - }, repoStatuses) - }) - - t.Run("Repo 62", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoStatuses, err := git_model.GetLatestCommitStatusForRepoCommitIDs(db.DefaultContext, 62, []string{"774f93df12d14931ea93259ae93418da4482fcc1"}) - require.NoError(t, err) - assert.EqualValues(t, map[string][]*git_model.CommitStatus{ - "774f93df12d14931ea93259ae93418da4482fcc1": { - { - ID: 8, - Index: 2, - RepoID: 62, - State: structs.CommitStatusError, - TargetURL: "/user2/test_workflows/actions", - Description: "My awesome deploy service - v2", - Context: "deploy/awesomeness", - SHA: "774f93df12d14931ea93259ae93418da4482fcc1", - ContextHash: "ae9547713a6665fc4261d0756904932085a41cf2", - CreatorID: 2, - }, - }, - }, repoStatuses) - }) - - t.Run("Repo 62 non-existent sha", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoStatuses, err := git_model.GetLatestCommitStatusForRepoCommitIDs(db.DefaultContext, 62, []string{"774f93df12d14931ea93259ae93418da4482fcc"}) - require.NoError(t, err) - assert.EqualValues(t, map[string][]*git_model.CommitStatus{}, repoStatuses) - }) - - t.Run("non-existent repo ID", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - repoStatuses, err := git_model.GetLatestCommitStatusForRepoCommitIDs(db.DefaultContext, 1, []string{"774f93df12d14931ea93259ae93418da4482fcc"}) - require.NoError(t, err) - assert.EqualValues(t, map[string][]*git_model.CommitStatus{}, repoStatuses) - }) -} diff --git a/tests/integration/compare_test.go b/tests/integration/compare_test.go index 3c3e8adf94..c65335c469 100644 --- a/tests/integration/compare_test.go +++ b/tests/integration/compare_test.go @@ -11,19 +11,18 @@ import ( "strings" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/optional" - "forgejo.org/modules/test" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/gitrepo" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/test" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" - "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -41,7 +40,7 @@ func TestCompareTag(t *testing.T) { req = NewRequest(t, "GET", "/user2/repo1/compare/invalid") resp = session.MakeRequest(t, req, http.StatusNotFound) - assert.NotContains(t, resp.Body.String(), ">500<", "expect 404 page not 500") + assert.False(t, strings.Contains(resp.Body.String(), ">500<"), "expect 404 page not 500") } // Compare with inferred default branch (master) @@ -68,114 +67,6 @@ func inspectCompare(t *testing.T, htmlDoc *HTMLDoc, diffCount int, diffChanges [ } } -func TestComparePatchAndDiffMenuEntries(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user2") - req := NewRequest(t, "GET", "/user2/repo-release/compare/v1.0...v2.0") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - downloadOptions := htmlDoc.doc.Find("a.item[download]") - var patchDownloadEntryPresent bool - var diffDownloadEntryPresent bool - downloadOptions.Each(func(idx int, c *goquery.Selection) { - value, exists := c.Attr("download") - if exists && strings.HasSuffix(value, ".patch") { - patchDownloadEntryPresent = true - } - - if exists && strings.HasSuffix(value, ".diff") { - diffDownloadEntryPresent = true - } - }) - - assert.True(t, patchDownloadEntryPresent, "Patch file download entry should be present") - assert.True(t, diffDownloadEntryPresent, "Diff file download entry should be present") -} - -func TestComparePatchDownload(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user2") - req := NewRequest(t, "GET", "/user2/repo-release/compare/v1.0...v2.0.patch") - attendedResponse := `From 4380f99290b2b3922733ff82c57afad915ace907 Mon Sep 17 00:00:00 2001 -From: user1 -Date: Mon, 17 Apr 2023 14:39:35 +0200 -Subject: [PATCH 1/3] feature v2 - ---- - feature | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - create mode 100644 feature - -diff --git a/feature b/feature -new file mode 100644 -index 0000000..e69de29 - -From 79f9d88f1b054d650f88da0bd658e21f7b0cf6ec Mon Sep 17 00:00:00 2001 -From: user1 -Date: Mon, 17 Apr 2023 14:38:53 +0200 -Subject: [PATCH 2/3] bugfix - ---- - bugfix | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - create mode 100644 bugfix - -diff --git a/bugfix b/bugfix -new file mode 100644 -index 0000000..e69de29 - -From 7197b56fdc75b453f47c9110938cb46a303579fd Mon Sep 17 00:00:00 2001 -From: user1 -Date: Mon, 17 Apr 2023 14:42:34 +0200 -Subject: [PATCH 3/3] readme: v2 - ---- - README.md | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/README.md b/README.md -index 6dfe48a..bc7068d 100644 ---- a/README.md -+++ b/README.md -@@ -1,3 +1,3 @@ - # Releases test repo - --With a v1.0 -+With a v1.0 and a v2.0 -` - - resp := session.MakeRequest(t, req, http.StatusOK) - assert.Equal(t, attendedResponse, resp.Body.String()) -} - -func TestCompareDiffDownload(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user2") - req := NewRequest(t, "GET", "/user2/repo-release/compare/v1.0...v2.0.diff") - attendedResponse := `diff --git a/README.md b/README.md -index 6dfe48a..bc7068d 100644 ---- a/README.md -+++ b/README.md -@@ -1,3 +1,3 @@ - # Releases test repo - --With a v1.0 -+With a v1.0 and a v2.0 -diff --git a/bugfix b/bugfix -new file mode 100644 -index 0000000..e69de29 -diff --git a/feature b/feature -new file mode 100644 -index 0000000..e69de29 -` - - resp := session.MakeRequest(t, req, http.StatusOK) - assert.Equal(t, attendedResponse, resp.Body.String()) -} - // Git commit graph for repo20 // * 8babce9 (origin/remove-files-b) Add a dummy file // * b67e43a Delete test.csv and link_hi @@ -400,43 +291,3 @@ func TestCompareCodeExpand(t *testing.T) { }) }) } - -func TestCompareSignedIn(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - // Setup the test with a connected user - session := loginUser(t, "user1") - testRepoFork(t, session, "user2", "repo1", "user1", "repo1") - testCreateBranch(t, session, "user1", "repo1", "branch/master", "recent-push", http.StatusSeeOther) - testEditFile(t, session, "user1", "repo1", "recent-push", "README.md", "Hello recently!\n") - - newPrSelector := "button.ui.button.primary.show-form" - - t.Run("PR creation button displayed if logged in", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user1/repo1/compare/master...recent-push") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - // Check that the "Sign in" button doesn't show up - htmlDoc.AssertElement(t, "a[href='/user/login?redirect_to=%2Fuser1%2Frepo1%2Fcompare%2Fmaster...recent-push']", false) - - // Check that the "New pull request" button shows up - htmlDoc.AssertElement(t, newPrSelector, true) - }) - - t.Run("no PR creation button but display warning", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user1/repo1/compare/master...recent-push") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - // Check that the "Sign in" button shows up - htmlDoc.AssertElement(t, "a[href='/user/login?redirect_to=%2Fuser1%2Frepo1%2Fcompare%2Fmaster...recent-push']", true) - - // Check that the "New pull request" button doesn't show up - htmlDoc.AssertElement(t, newPrSelector, false) - }) - }) -} diff --git a/tests/integration/cors_test.go b/tests/integration/cors_test.go index a050693035..25dfbabf41 100644 --- a/tests/integration/cors_test.go +++ b/tests/integration/cors_test.go @@ -7,10 +7,10 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/create_no_session_test.go b/tests/integration/create_no_session_test.go index ed547c5b5a..ca2a775459 100644 --- a/tests/integration/create_no_session_test.go +++ b/tests/integration/create_no_session_test.go @@ -10,10 +10,10 @@ import ( "path/filepath" "testing" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "code.forgejo.org/go-chi/session" "github.com/stretchr/testify/assert" diff --git a/tests/integration/csrf_test.go b/tests/integration/csrf_test.go index 100614cbb4..fcb9661b8a 100644 --- a/tests/integration/csrf_test.go +++ b/tests/integration/csrf_test.go @@ -7,9 +7,9 @@ import ( "net/http" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/db_collation_test.go b/tests/integration/db_collation_test.go index 6bfe656b9b..0e5bf00ed7 100644 --- a/tests/integration/db_collation_test.go +++ b/tests/integration/db_collation_test.go @@ -9,10 +9,10 @@ import ( "testing" "time" - "forgejo.org/models/db" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/delete_user_test.go b/tests/integration/delete_user_test.go index 767d6c9724..fa407a75ad 100644 --- a/tests/integration/delete_user_test.go +++ b/tests/integration/delete_user_test.go @@ -8,13 +8,13 @@ import ( "net/http" "testing" - 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/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + 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/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/tests" ) func assertUserDeleted(t *testing.T, userID int64, purged bool) { diff --git a/tests/integration/disable_forgotten_password_test.go b/tests/integration/disable_forgotten_password_test.go deleted file mode 100644 index 7a1e502d93..0000000000 --- a/tests/integration/disable_forgotten_password_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package integration - -import ( - "net/http" - "testing" - - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" -) - -func TestDisableForgottenPasswordFalse(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Service.EnableInternalSignIn, true)() - - req := NewRequest(t, "GET", "/user/login/") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "a[href='/user/forgot_password']", true) -} - -func TestDisableForgottenPasswordTrue(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Service.EnableInternalSignIn, false)() - - req := NewRequest(t, "GET", "/user/login/") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "a[href='/user/forgot_password']", false) -} - -func TestDisableForgottenPasswordDefault(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/user/login/") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "a[href='/user/forgot_password']", true) -} diff --git a/tests/integration/doctor_packages_nuget_test.go b/tests/integration/doctor_packages_nuget_test.go index e505799730..a012567efc 100644 --- a/tests/integration/doctor_packages_nuget_test.go +++ b/tests/integration/doctor_packages_nuget_test.go @@ -11,17 +11,17 @@ 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/log" - packages_module "forgejo.org/modules/packages" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - doctor "forgejo.org/services/doctor" - packages_service "forgejo.org/services/packages" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/log" + packages_module "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + doctor "code.gitea.io/gitea/services/doctor" + packages_service "code.gitea.io/gitea/services/packages" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/download_test.go b/tests/integration/download_test.go index d5e68402c5..efe5ac791c 100644 --- a/tests/integration/download_test.go +++ b/tests/integration/download_test.go @@ -7,8 +7,8 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/dummy_lang_test.go b/tests/integration/dummy_lang_test.go deleted file mode 100644 index 08c5176731..0000000000 --- a/tests/integration/dummy_lang_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "net/http" - "testing" - - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestKeyLocale(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/user2/repo1/issues?lang=dummy") - resp := MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - newButton := htmlDoc.doc.Find(".list-header-issues > .issue-list-new") - assert.Equal(t, "(repo.issues.new)", newButton.Text()) -} diff --git a/tests/integration/dump_restore_test.go b/tests/integration/dump_restore_test.go index 239170a256..fa65695150 100644 --- a/tests/integration/dump_restore_test.go +++ b/tests/integration/dump_restore_test.go @@ -4,6 +4,7 @@ package integration import ( + "context" "errors" "fmt" "net/url" @@ -13,14 +14,15 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - base "forgejo.org/modules/migration" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/services/migrations" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + base "code.gitea.io/gitea/modules/migration" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/services/migrations" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -43,7 +45,9 @@ func TestDumpRestore(t *testing.T) { reponame := "repo1" - basePath := t.TempDir() + basePath, err := os.MkdirTemp("", reponame) + require.NoError(t, err) + defer util.RemoveAll(basePath) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: reponame}) repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) @@ -54,7 +58,7 @@ func TestDumpRestore(t *testing.T) { // Phase 1: dump repo1 from the Gitea instance to the filesystem // - ctx := t.Context() + ctx := context.Background() opts := migrations.MigrateOptions{ GitServiceType: structs.GiteaService, Issues: true, @@ -66,7 +70,7 @@ func TestDumpRestore(t *testing.T) { CloneAddr: repo.CloneLink().HTTPS, RepoName: reponame, } - err := migrations.DumpRepository(ctx, basePath, repoOwner.Name, opts) + err = migrations.DumpRepository(ctx, basePath, repoOwner.Name, opts) require.NoError(t, err) // diff --git a/tests/integration/easymde_test.go b/tests/integration/easymde_test.go index 7ecbe4f5b7..c8203d36be 100644 --- a/tests/integration/easymde_test.go +++ b/tests/integration/easymde_test.go @@ -6,19 +6,14 @@ package integration import ( "net/http" "testing" - - "forgejo.org/tests" ) func TestEasyMDESwitch(t *testing.T) { - defer tests.PrepareTestEnv(t)() session := loginUser(t, "user2") testEasyMDESwitch(t, session, "user2/glob/issues/1", false) testEasyMDESwitch(t, session, "user2/glob/issues/new", false) testEasyMDESwitch(t, session, "user2/glob/wiki?action=_new", true) testEasyMDESwitch(t, session, "user2/glob/releases/new", true) - testEasyMDESwitch(t, session, "user2/glob/milestones/new", true) - testEasyMDESwitch(t, session, "user2/repo1/milestones/1/edit", true) } func testEasyMDESwitch(t *testing.T, session *TestSession, url string, expected bool) { diff --git a/tests/integration/editor_test.go b/tests/integration/editor_test.go index 7321aa26c9..4ed6485717 100644 --- a/tests/integration/editor_test.go +++ b/tests/integration/editor_test.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -15,19 +14,48 @@ import ( "path" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/json" - "forgejo.org/modules/translation" - gitea_context "forgejo.org/services/context" - "forgejo.org/tests" + 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/json" + "code.gitea.io/gitea/modules/translation" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func TestCreateFile(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { + session := loginUser(t, "user2") + testCreateFile(t, session, "user2", "repo1", "master", "test.txt", "Content") + }) +} + +func testCreateFile(t *testing.T, session *TestSession, user, repo, branch, filePath, content string) *httptest.ResponseRecorder { + // Request editor page + newURL := fmt.Sprintf("/%s/%s/_new/%s/", user, repo, branch) + req := NewRequest(t, "GET", newURL) + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + lastCommit := doc.GetInputValueByName("last_commit") + assert.NotEmpty(t, lastCommit) + + // Save new file to master branch + req = NewRequestWithValues(t, "POST", newURL, map[string]string{ + "_csrf": doc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": filePath, + "content": content, + "commit_choice": "direct", + "commit_mail_id": "3", + }) + return session.MakeRequest(t, req, http.StatusSeeOther) +} + func TestCreateFileOnProtectedBranch(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { session := loginUser(t, "user2") diff --git a/tests/integration/empty_repo_test.go b/tests/integration/empty_repo_test.go index baea2566ff..4122c78ec2 100644 --- a/tests/integration/empty_repo_test.go +++ b/tests/integration/empty_repo_test.go @@ -11,15 +11,15 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + 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/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -136,24 +136,3 @@ func TestEmptyRepoAddFileByAPI(t *testing.T) { DecodeJSON(t, resp, &apiRepo) assert.Equal(t, "new_branch", apiRepo.DefaultBranch) } - -func TestEmptyRepoAPIRequestsReturn404(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user30") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository) - - t.Run("Raw", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/api/v1/repos/user30/empty/raw/main/something").AddTokenAuth(token) - _ = session.MakeRequest(t, req, http.StatusNotFound) - }) - - t.Run("Media", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/api/v1/repos/user30/empty/media/main/something").AddTokenAuth(token) - _ = session.MakeRequest(t, req, http.StatusNotFound) - }) -} diff --git a/tests/integration/eventsource_test.go b/tests/integration/eventsource_test.go index 8eb5110e54..e081df0e57 100644 --- a/tests/integration/eventsource_test.go +++ b/tests/integration/eventsource_test.go @@ -9,15 +9,15 @@ import ( "testing" "time" - activities_model "forgejo.org/models/activities" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/eventsource" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + activities_model "code.gitea.io/gitea/models/activities" + 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/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/eventsource" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/explore_code_test.go b/tests/integration/explore_code_test.go index 97cc97b996..d84b47cf05 100644 --- a/tests/integration/explore_code_test.go +++ b/tests/integration/explore_code_test.go @@ -4,9 +4,9 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -20,6 +20,11 @@ func TestExploreCodeSearchIndexer(t *testing.T) { resp := MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body).Find(".explore") + msg := doc. + Find(".ui.container"). + Find(".ui.message[data-test-tag=grep]") + assert.EqualValues(t, 0, msg.Length()) + doc.Find(".file-body").Each(func(i int, sel *goquery.Selection) { assert.Positive(t, sel.Find(".code-inner").Find(".search-highlight").Length(), 0) }) diff --git a/tests/integration/explore_org_test.go b/tests/integration/explore_org_test.go deleted file mode 100644 index 111fd2dda7..0000000000 --- a/tests/integration/explore_org_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "net/http" - "testing" - - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestExploreOrg(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - // Set the default sort order - defer test.MockVariableValue(&setting.UI.ExploreDefaultSort, "alphabetically")() - - cases := []struct{ sortOrder, expected string }{ - {"", "?sort=" + setting.UI.ExploreDefaultSort + "&q="}, - {"newest", "?sort=newest&q="}, - {"oldest", "?sort=oldest&q="}, - {"alphabetically", "?sort=alphabetically&q="}, - {"reversealphabetically", "?sort=reversealphabetically&q="}, - } - for _, c := range cases { - req := NewRequest(t, "GET", "/explore/organizations?sort="+c.sortOrder) - resp := MakeRequest(t, req, http.StatusOK) - h := NewHTMLParser(t, resp.Body) - href, _ := h.Find(`.ui.dropdown .menu a.active.item[href^="?sort="]`).Attr("href") - assert.Equal(t, c.expected, href) - } - - // these sort orders shouldn't be supported, to avoid leaking user activity - cases404 := []string{ - "/explore/organizations?sort=mostMembers", - "/explore/organizations?sort=leastGroups", - "/explore/organizations?sort=leastupdate", - "/explore/organizations?sort=reverseleastupdate", - } - for _, c := range cases404 { - req := NewRequest(t, "GET", c).SetHeader("Accept", "text/html") - MakeRequest(t, req, http.StatusNotFound) - } -} diff --git a/tests/integration/explore_repos_test.go b/tests/integration/explore_repos_test.go index 604d473ac5..c0179c50da 100644 --- a/tests/integration/explore_repos_test.go +++ b/tests/integration/explore_repos_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/explore_user_test.go b/tests/integration/explore_user_test.go index 689e623e69..441d89cea5 100644 --- a/tests/integration/explore_user_test.go +++ b/tests/integration/explore_user_test.go @@ -7,9 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -17,11 +15,8 @@ import ( func TestExploreUser(t *testing.T) { defer tests.PrepareTestEnv(t)() - // Set the default sort order - defer test.MockVariableValue(&setting.UI.ExploreDefaultSort, "reversealphabetically")() - cases := []struct{ sortOrder, expected string }{ - {"", "?sort=" + setting.UI.ExploreDefaultSort + "&q="}, + {"", "?sort=newest&q="}, {"newest", "?sort=newest&q="}, {"oldest", "?sort=oldest&q="}, {"alphabetically", "?sort=alphabetically&q="}, diff --git a/tests/integration/feed_repo_test.go b/tests/integration/feed_repo_test.go deleted file mode 100644 index a4d5ef2610..0000000000 --- a/tests/integration/feed_repo_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2025 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "encoding/xml" - "net/http" - "testing" - - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestFeedRepo(t *testing.T) { - t.Run("RSS", func(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/user2/repo1.rss") - resp := MakeRequest(t, req, http.StatusOK) - - data := resp.Body.String() - assert.Contains(t, data, ` size { + bufSize = size + } + + buffer := make([]byte, bufSize) + tmpFile, err := os.CreateTemp(repoPath, prefix) - require.NoError(t, err) + if err != nil { + return "", err + } defer tmpFile.Close() - _, err = io.CopyN(tmpFile, rand.Reader, size) - require.NoError(t, err) + written := 0 + for written < size { + n := size - written + if n > bufSize { + n = bufSize + } + _, err := rand.Read(buffer[:n]) + if err != nil { + return "", err + } + n, err = tmpFile.Write(buffer[:n]) + if err != nil { + return "", err + } + written += n + } // Commit // Now here we should explicitly allow lfs filters to run globalArgs := git.AllowLFSFiltersArgs() - require.NoError(t, git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name()))) - require.NoError(t, git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{ + err = git.AddChangesWithArgs(repoPath, globalArgs, false, filepath.Base(tmpFile.Name())) + if err != nil { + return "", err + } + err = git.CommitChangesWithArgs(repoPath, globalArgs, git.CommitChangesOptions{ Committer: &git.Signature{ Email: email, Name: fullName, @@ -338,8 +357,8 @@ func generateCommitWithNewData(t *testing.T, size int64, repoPath, email, fullNa When: time.Now(), }, Message: fmt.Sprintf("Testing commit @ %v", time.Now()), - })) - return filepath.Base(tmpFile.Name()) + }) + return filepath.Base(tmpFile.Name()), err } func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) { @@ -351,7 +370,6 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) ctx := NewAPITestContext(t, baseCtx.Username, baseCtx.Reponame, auth_model.AccessTokenScopeWriteRepository) t.Run("PushToNewProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("CreateBranchProtected", doGitCreateBranch(dstPath, "before-create-1")) t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-1", parameterProtectBranch{ "enable_push": "all", @@ -360,7 +378,8 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) t.Run("PushProtectedBranch", doGitPushTestRepository(dstPath, "origin", "before-create-1")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-data-") + require.NoError(t, err) }) t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "before-create-2", parameterProtectBranch{ @@ -373,11 +392,11 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) }) t.Run("FailToPushToProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("ProtectProtectedBranch", doProtectBranch(ctx, "protected")) t.Run("Create modified-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-branch", "protected")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + require.NoError(t, err) }) doGitPushTestRepositoryFail(dstPath, "origin", "modified-protected-branch:protected")(t) @@ -386,10 +405,10 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "modified-protected-branch:unprotected")) t.Run("FailToPushProtectedFilesToProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("Create modified-protected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-protected-file-protected-branch", "protected")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "protected-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "protected-file-") + require.NoError(t, err) }) t.Run("ProtectedFilePathsApplyToAdmins", doProtectBranch(ctx, "protected")) @@ -400,13 +419,13 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) }) t.Run("PushUnprotectedFilesToProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("Create modified-unprotected-file-protected-branch", doGitCheckoutBranch(dstPath, "-b", "modified-unprotected-file-protected-branch", "protected")) t.Run("UnprotectedFilePaths", doProtectBranch(ctx, "protected", parameterProtectBranch{ "unprotected_file_patterns": "unprotected-file-*", })) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "unprotected-file-") + require.NoError(t, err) }) doGitPushTestRepository(dstPath, "origin", "modified-unprotected-file-protected-branch:protected")(t) doGitCheckoutBranch(dstPath, "protected")(t) @@ -422,19 +441,19 @@ func doBranchProtect(baseCtx *APITestContext, dstPath string) func(t *testing.T) })) t.Run("WhitelistedUserFailToForcePushToProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("Create toforce", doGitCheckoutBranch(dstPath, "-b", "toforce", "master")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + require.NoError(t, err) }) doGitPushTestRepositoryFail(dstPath, "-f", "origin", "toforce:protected")(t) }) t.Run("WhitelistedUserPushToProtectedBranch", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("Create topush", doGitCheckoutBranch(dstPath, "-b", "topush", "protected")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + require.NoError(t, err) }) doGitPushTestRepository(dstPath, "origin", "topush:protected")(t) }) @@ -674,7 +693,8 @@ func doAutoPRMerge(baseCtx *APITestContext, dstPath string) func(t *testing.T) { t.Run("CheckoutProtected", doGitCheckoutBranch(dstPath, "protected")) t.Run("PullProtected", doGitPull(dstPath, "origin", "protected")) t.Run("GenerateCommit", func(t *testing.T) { - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", "branch-data-file-") + require.NoError(t, err) }) t.Run("PushToUnprotectedBranch", doGitPushTestRepository(dstPath, "origin", "protected:unprotected3")) var pr api.PullRequest @@ -766,11 +786,6 @@ func doInternalReferences(ctx *APITestContext, dstPath string) func(t *testing.T require.Error(t, gitErr) assert.Contains(t, stdErr, fmt.Sprintf("remote: Forgejo: The deletion of refs/pull/%d/head is skipped as it's an internal reference.", pr1.Index)) assert.Contains(t, stdErr, fmt.Sprintf("[remote rejected] refs/pull/%d/head (hook declined)", pr1.Index)) - - _, stdErr, gitErr = git.NewCommand(git.DefaultContext, "push", "origin", "--force").AddDynamicArguments(fmt.Sprintf("HEAD~1:refs/pull/%d/head", pr1.Index)).RunStdString(&git.RunOpts{Dir: dstPath}) - require.Error(t, gitErr) - assert.Contains(t, stdErr, fmt.Sprintf("remote: Forgejo: The modification of refs/pull/%d/head is skipped as it's an internal reference.", pr1.Index)) - assert.Contains(t, stdErr, fmt.Sprintf("[remote rejected] HEAD~1 -> refs/pull/%d/head (hook declined)", pr1.Index)) } } @@ -1129,30 +1144,3 @@ func TestDataAsync_Issue29101(t *testing.T) { defer r2.Close() }) } - -func doLFSNoAccess(ctx APITestContext, publicKeyID int64, objectFormat git.ObjectFormat) func(*testing.T) { - return func(t *testing.T) { - // This is set in withKeyFile - sshCommand := os.Getenv("GIT_SSH_COMMAND") - - // Sanity check, because we are going to execute whatever is in here. - require.True(t, strings.HasPrefix(sshCommand, "ssh ")) - - // We really have to split on the arguments and pass them individually. - sshOptions, err := shellquote.Split(strings.TrimPrefix(sshCommand, "ssh ")) - require.NoError(t, err) - - sshOptions = append(sshOptions, "-p "+strconv.Itoa(setting.SSH.ListenPort), "git@"+setting.SSH.ListenHost) - - cmd := exec.CommandContext(t.Context(), "ssh", append(sshOptions, "git-lfs-authenticate", "user40/repo60.git", "upload")...) - stderr := bytes.Buffer{} - cmd.Stderr = &stderr - - require.ErrorContains(t, cmd.Run(), "exit status 1") - if objectFormat.Name() == "sha1" { - assert.Contains(t, stderr.String(), fmt.Sprintf("Forgejo: User: 2:user2 with Key: %d:test-key-sha1 is not authorized to write to user40/repo60.", publicKeyID)) - } else { - assert.Contains(t, stderr.String(), fmt.Sprintf("Forgejo: User: 2:user2 with Key: %d:test-key-sha256 is not authorized to write to user40/repo60.", publicKeyID)) - } - } -} diff --git a/tests/integration/goget_test.go b/tests/integration/goget_test.go index d1187e4cb5..854f8d7a2d 100644 --- a/tests/integration/goget_test.go +++ b/tests/integration/goget_test.go @@ -8,8 +8,8 @@ import ( "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/gpg_git_test.go b/tests/integration/gpg_git_test.go index 0fd998e815..5302997f6d 100644 --- a/tests/integration/gpg_git_test.go +++ b/tests/integration/gpg_git_test.go @@ -10,15 +10,15 @@ import ( "os" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/process" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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/process" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" diff --git a/tests/integration/incoming_email_test.go b/tests/integration/incoming_email_test.go index a47aaed87a..66f833b28d 100644 --- a/tests/integration/incoming_email_test.go +++ b/tests/integration/incoming_email_test.go @@ -12,15 +12,15 @@ import ( "testing" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/services/mailer/incoming" - incoming_payload "forgejo.org/services/mailer/incoming/payload" - token_service "forgejo.org/services/mailer/token" - "forgejo.org/tests" + "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" + "code.gitea.io/gitea/services/mailer/incoming" + incoming_payload "code.gitea.io/gitea/services/mailer/incoming/payload" + token_service "code.gitea.io/gitea/services/mailer/token" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go index 4257a999d9..e43200f4cb 100644 --- a/tests/integration/integration_test.go +++ b/tests/integration/integration_test.go @@ -25,23 +25,23 @@ import ( "testing" "time" - "forgejo.org/cmd" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/graceful" - "forgejo.org/modules/json" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/testlogger" - "forgejo.org/modules/util" - "forgejo.org/modules/web" - "forgejo.org/routers" - "forgejo.org/services/auth/source/remote" - gitea_context "forgejo.org/services/context" - user_service "forgejo.org/services/user" - "forgejo.org/tests" + "code.gitea.io/gitea/cmd" + "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/graceful" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/testlogger" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/services/auth/source/remote" + gitea_context "code.gitea.io/gitea/services/context" + user_service "code.gitea.io/gitea/services/user" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/markbates/goth" @@ -159,6 +159,13 @@ func TestMain(m *testing.M) { } } + 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") + err := unittest.InitFixtures( unittest.FixturesOptions{ Dir: filepath.Join(filepath.Dir(setting.AppPath), "models/fixtures/"), @@ -298,7 +305,9 @@ func addAuthSource(t *testing.T, payload map[string]string) *auth.Source { payload["_csrf"] = GetCSRF(t, session, "/admin/auths/new") req := NewRequestWithValues(t, "POST", "/admin/auths/new", payload) session.MakeRequest(t, req, http.StatusSeeOther) - return unittest.AssertExistsAndLoadBean(t, &auth.Source{Name: payload["name"]}) + source, err := auth.GetSourceByName(context.Background(), payload["name"]) + require.NoError(t, err) + return source } func authSourcePayloadOAuth2(name string) map[string]string { @@ -347,7 +356,7 @@ func authSourcePayloadGitHubCustom(name string) map[string]string { } func createRemoteAuthSource(t *testing.T, name, url, matchingSource string) *auth.Source { - require.NoError(t, auth.CreateSource(t.Context(), &auth.Source{ + require.NoError(t, auth.CreateSource(context.Background(), &auth.Source{ Type: auth.Remote, Name: name, IsActive: true, @@ -356,7 +365,9 @@ func createRemoteAuthSource(t *testing.T, name, url, matchingSource string) *aut MatchingSource: matchingSource, }, })) - return unittest.AssertExistsAndLoadBean(t, &auth.Source{Name: name}) + source, err := auth.GetSourceByName(context.Background(), name) + require.NoError(t, err) + return source } func createUser(ctx context.Context, t testing.TB, user *user_model.User) func() { @@ -421,15 +432,7 @@ var tokenCounter int64 // but without the "scope_" prefix. func getTokenForLoggedInUser(t testing.TB, session *TestSession, scopes ...auth.AccessTokenScope) string { t.Helper() - accessTokenName := fmt.Sprintf("api-testing-token-%d", atomic.AddInt64(&tokenCounter, 1)) - createApplicationSettingsToken(t, session, accessTokenName, scopes...) - token := assertAccessToken(t, session) - return token -} - -// createApplicationSettingsToken creates a token with given name and scopes for the currently logged in user. -// It will assert CSRF token and redirect to the application settings page. -func createApplicationSettingsToken(t testing.TB, session *TestSession, name string, scopes ...auth.AccessTokenScope) { + var token string req := NewRequest(t, "GET", "/user/settings/applications") resp := session.MakeRequest(t, req, http.StatusOK) var csrf string @@ -447,7 +450,7 @@ func createApplicationSettingsToken(t testing.TB, session *TestSession, name str assert.NotEmpty(t, csrf) urlValues := url.Values{} urlValues.Add("_csrf", csrf) - urlValues.Add("name", name) + urlValues.Add("name", fmt.Sprintf("api-testing-token-%d", atomic.AddInt64(&tokenCounter, 1))) for _, scope := range scopes { urlValues.Add("scope", string(scope)) } @@ -466,15 +469,11 @@ func createApplicationSettingsToken(t testing.TB, session *TestSession, name str } } } -} -// assertAccessToken retrieves a token from "/user/settings/applications" and returns it. -// It will also assert that the page contains a token. -func assertAccessToken(t testing.TB, session *TestSession) string { - req := NewRequest(t, "GET", "/user/settings/applications") - resp := session.MakeRequest(t, req, http.StatusOK) + req = NewRequest(t, "GET", "/user/settings/applications") + resp = session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) - token := htmlDoc.doc.Find(".ui.info p").Text() + token = htmlDoc.doc.Find(".ui.info p").Text() assert.NotEmpty(t, token) return token } @@ -664,17 +663,12 @@ func VerifyJSONSchema(t testing.TB, resp *httptest.ResponseRecorder, schemaFile require.NoError(t, schemaValidation) } -// GetCSRF returns CSRF token from body -// If it fails, it means the CSRF token is not found in the response body returned by the url with the given session. -// In this case, you should find a better url to get it. func GetCSRF(t testing.TB, session *TestSession, urlStr string) string { t.Helper() req := NewRequest(t, "GET", urlStr) resp := session.MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) - csrf := doc.GetCSRF() - require.NotEmpty(t, csrf) - return csrf + return doc.GetCSRF() } func GetHTMLTitle(t testing.TB, session *TestSession, urlStr string) string { diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 6845612a6d..909242efc6 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -5,6 +5,7 @@ package integration import ( + "context" "fmt" "net/http" "net/url" @@ -15,22 +16,22 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - project_model "forgejo.org/models/project" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/indexer/issues" - "forgejo.org/modules/optional" - "forgejo.org/modules/references" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + project_model "code.gitea.io/gitea/models/project" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/indexer/issues" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/references" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -80,7 +81,7 @@ func TestViewIssues(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) search := htmlDoc.doc.Find(".list-header-search > .search > .input > input") placeholder, _ := search.Attr("placeholder") - assert.Equal(t, "Search issues…", placeholder) + assert.Equal(t, "Search issues...", placeholder) } func TestViewIssuesSortByType(t *testing.T) { @@ -119,7 +120,7 @@ func TestViewIssuesKeyword(t *testing.T) { RepoID: repo.ID, Index: 1, }) - issues.UpdateIssueIndexer(t.Context(), issue.ID) + issues.UpdateIssueIndexer(context.Background(), issue.ID) time.Sleep(time.Second * 1) const keyword = "first" @@ -137,25 +138,27 @@ func TestViewIssuesKeyword(t *testing.T) { }) // keyword: 'firstt' - // should not match when using phrase search - req = NewRequestf(t, "GET", "%s/issues?q=\"%st\"", repo.Link(), keyword) + // should not match when fuzzy searching is disabled + req = NewRequestf(t, "GET", "%s/issues?q=%st&fuzzy=false", repo.Link(), keyword) resp = MakeRequest(t, req, http.StatusOK) htmlDoc = NewHTMLParser(t, resp.Body) issuesSelection = getIssuesSelection(t, htmlDoc) assert.EqualValues(t, 0, issuesSelection.Length()) - // should match as 'first' when using a standard query - req = NewRequestf(t, "GET", "%s/issues?q=%st", repo.Link(), keyword) - resp = MakeRequest(t, req, http.StatusOK) - htmlDoc = NewHTMLParser(t, resp.Body) - issuesSelection = getIssuesSelection(t, htmlDoc) - assert.EqualValues(t, 1, issuesSelection.Length()) - issuesSelection.Each(func(_ int, selection *goquery.Selection) { - issue := getIssue(t, repo.ID, selection) - assert.False(t, issue.IsClosed) - assert.False(t, issue.IsPull) - assertMatch(t, issue, keyword) - }) + // should match as 'first' when fuzzy seaeching is enabled + for _, fmt := range []string{"%s/issues?q=%st&fuzzy=true", "%s/issues?q=%st"} { + req = NewRequestf(t, "GET", fmt, repo.Link(), keyword) + resp = MakeRequest(t, req, http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + issuesSelection = getIssuesSelection(t, htmlDoc) + assert.EqualValues(t, 1, issuesSelection.Length()) + issuesSelection.Each(func(_ int, selection *goquery.Selection) { + issue := getIssue(t, repo.ID, selection) + assert.False(t, issue.IsClosed) + assert.False(t, issue.IsPull) + assertMatch(t, issue, keyword) + }) + } } func TestViewIssuesSearchOptions(t *testing.T) { @@ -497,7 +500,7 @@ func TestIssueCommentAttachment(t *testing.T) { link, exists := htmlDoc.doc.Find("#comment-form").Attr("action") assert.True(t, exists, "The template has changed") - uuid := createAttachment(t, session, GetCSRF(t, session, repoURL), repoURL, "image.png", generateImg(), http.StatusOK) + uuid := createAttachment(t, session, repoURL, "image.png", generateImg(), http.StatusOK) commentCount := htmlDoc.doc.Find(".comment-list .comment .render-content").Length() @@ -1084,7 +1087,7 @@ func TestIssueReferenceURL(t *testing.T) { } func TestGetContentHistory(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestGetContentHistory")() + defer tests.AddFixtures("tests/integration/fixtures/TestGetContentHistory/")() defer tests.PrepareTestEnv(t)() issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1}) @@ -1136,7 +1139,7 @@ func TestGetContentHistory(t *testing.T) { } func TestCommitRefComment(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestCommitRefComment")() + defer tests.AddFixtures("tests/integration/fixtures/TestCommitRefComment/")() defer tests.PrepareTestEnv(t)() t.Run("Pull request", func(t *testing.T) { @@ -1298,81 +1301,3 @@ func TestIssueUserDashboard(t *testing.T) { htmlDoc.AssertElement(t, sel, true) } } - -func TestIssueOrgDashboard(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - session := loginUser(t, user.Name) - - // assert 'your_repositories' is the default filter for org dashboards - const sel = ".dashboard .ui.list-header.dropdown .ui.menu a.active.item[href^='?type=your_repositories']" - - for _, path := range []string{"/org/org3/issues", "/org/org3/pulls"} { - req := NewRequest(t, "GET", path) - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, sel, true) - } -} - -func TestIssueCount(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/user2/repo1/issues") - resp := MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - - openCount := htmlDoc.doc.Find("a[data-test-name='open-issue-count']").Text() - assert.Contains(t, openCount, "1\u00a0Open") - - closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() - assert.Contains(t, closedCount, "1\u00a0Closed") - - allCount := htmlDoc.doc.Find("a[data-test-name='all-issue-count']").Text() - assert.Contains(t, allCount, "2\u00a0All") -} - -func TestIssuePostersSearch(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - type userSearchInfo struct { - UserID int64 `json:"user_id"` - UserName string `json:"username"` - } - - type userSearchResponse struct { - Results []*userSearchInfo `json:"results"` - } - - t.Run("Name search", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.UI.DefaultShowFullName, false)() - - req := NewRequest(t, "GET", "/user2/repo1/issues/posters?q=USer2") - resp := MakeRequest(t, req, http.StatusOK) - - var data userSearchResponse - DecodeJSON(t, resp, &data) - - assert.Len(t, data.Results, 1) - assert.EqualValues(t, "user2", data.Results[0].UserName) - assert.EqualValues(t, 2, data.Results[0].UserID) - }) - - t.Run("Full name search", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.UI.DefaultShowFullName, true)() - - req := NewRequest(t, "GET", "/user2/repo1/issues/posters?q=OnE") - resp := MakeRequest(t, req, http.StatusOK) - - var data userSearchResponse - DecodeJSON(t, resp, &data) - - assert.Len(t, data.Results, 1) - assert.EqualValues(t, "user1", data.Results[0].UserName) - assert.EqualValues(t, 1, data.Results[0].UserID) - }) -} diff --git a/tests/integration/comment_roles_test.go b/tests/integration/issues_comment_labels_test.go similarity index 98% rename from tests/integration/comment_roles_test.go rename to tests/integration/issues_comment_labels_test.go index 00bec95722..5299d8a057 100644 --- a/tests/integration/comment_roles_test.go +++ b/tests/integration/issues_comment_labels_test.go @@ -14,8 +14,8 @@ import ( "github.com/stretchr/testify/assert" ) -// TestCommentRoles is a test for role labels of normal users in comment headers in PRs and issues. -func TestCommentRoles(t *testing.T) { +// TestIssuesCommentLabels is a test for user (role) labels in comment headers in PRs and issues. +func TestIssuesCommentLabels(t *testing.T) { user := "user2" repo := "repo1" diff --git a/tests/integration/last_updated_time_test.go b/tests/integration/last_updated_time_test.go index 0b3f08677c..54c0eeb629 100644 --- a/tests/integration/last_updated_time_test.go +++ b/tests/integration/last_updated_time_test.go @@ -2,56 +2,60 @@ package integration import ( "net/http" + "net/url" "path" "strings" "testing" - "forgejo.org/tests" - "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) func TestRepoLastUpdatedTime(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user := "user2" - session := loginUser(t, user) + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user := "user2" + session := loginUser(t, user) - req := NewRequest(t, "GET", "/explore/repos?q=repo1") - resp := session.MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - node := doc.doc.Find(".flex-item-main:has(a[href='/user2/repo1']) .flex-item-body").First() - { - buf := "" - findTextNonNested(t, node, &buf) - assert.Equal(t, "Updated", strings.TrimSpace(buf)) - } + req := NewRequest(t, "GET", "/explore/repos?q=repo1") + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + node := doc.doc.Find(".flex-item-body").First() + { + buf := "" + findTextNonNested(t, node, &buf) + assert.Equal(t, "Updated", strings.TrimSpace(buf)) + } - // Relative time should be present as a descendent - assert.Contains(t, node.Find("relative-time").Text(), "2024-11-10") + // Relative time should be present as a descendent + { + relativeTime := node.Find("relative-time").Text() + assert.True(t, strings.HasPrefix(relativeTime, "19")) // ~1970, might underflow with timezone + } + }) } func TestBranchLastUpdatedTime(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user := "user2" - repo := "repo1" - session := loginUser(t, user) + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user := "user2" + repo := "repo1" + session := loginUser(t, user) - req := NewRequest(t, "GET", path.Join(user, repo, "branches")) - resp := session.MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - node := doc.doc.Find("p:has(span.commit-message)") + req := NewRequest(t, "GET", path.Join(user, repo, "branches")) + resp := session.MakeRequest(t, req, http.StatusOK) + doc := NewHTMLParser(t, resp.Body) + node := doc.doc.Find("p:has(span.commit-message)") - { - buf := "" - findTextNonNested(t, node, &buf) - assert.Contains(t, buf, "Updated") - } + { + buf := "" + findTextNonNested(t, node, &buf) + assert.True(t, strings.Contains(buf, "Updated")) + } - { - relativeTime := node.Find("relative-time").Text() - assert.True(t, strings.HasPrefix(relativeTime, "2017")) - } + { + relativeTime := node.Find("relative-time").Text() + assert.True(t, strings.HasPrefix(relativeTime, "2017")) + } + }) } // Find all text that are direct descendents diff --git a/tests/integration/lfs_getobject_test.go b/tests/integration/lfs_getobject_test.go index ddaef827ef..351c1a38a4 100644 --- a/tests/integration/lfs_getobject_test.go +++ b/tests/integration/lfs_getobject_test.go @@ -11,14 +11,14 @@ import ( "net/http/httptest" "testing" - "forgejo.org/models/auth" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/modules/json" - "forgejo.org/modules/lfs" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/models/auth" + "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/json" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/klauspost/compress/gzhttp" gzipp "github.com/klauspost/compress/gzip" diff --git a/tests/integration/lfs_local_endpoint_test.go b/tests/integration/lfs_local_endpoint_test.go index 8962e0a710..d42888bbe1 100644 --- a/tests/integration/lfs_local_endpoint_test.go +++ b/tests/integration/lfs_local_endpoint_test.go @@ -10,8 +10,8 @@ import ( "path/filepath" "testing" - "forgejo.org/modules/lfs" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/lfs_view_test.go b/tests/integration/lfs_view_test.go index 6df5855ed6..06cea0dac2 100644 --- a/tests/integration/lfs_view_test.go +++ b/tests/integration/lfs_view_test.go @@ -4,17 +4,18 @@ package integration import ( + "context" "fmt" "net/http" "strings" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/lfs" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/lfs" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -157,7 +158,7 @@ func TestLFSLockView(t *testing.T) { defer tests.PrintCurrentTest(t)() // make sure the display names are different, or the test is meaningless - require.NoError(t, repo3.LoadOwner(t.Context())) + require.NoError(t, repo3.LoadOwner(context.Background())) require.NotEqual(t, user2.DisplayName(), repo3.Owner.DisplayName()) req := NewRequest(t, "GET", fmt.Sprintf("/%s/settings/lfs/locks", repo3.FullName())) diff --git a/tests/integration/linguist_test.go b/tests/integration/linguist_test.go index 85080c1d2e..73423ee6a4 100644 --- a/tests/integration/linguist_test.go +++ b/tests/integration/linguist_test.go @@ -4,20 +4,21 @@ package integration import ( + "context" "net/http" "net/url" "strings" "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/indexer/stats" - "forgejo.org/modules/queue" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "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" + "code.gitea.io/gitea/modules/indexer/stats" + "code.gitea.io/gitea/modules/queue" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -81,7 +82,7 @@ func TestLinguistSupport(t *testing.T) { err := stats.UpdateRepoIndexer(repo) require.NoError(t, err) - require.NoError(t, queue.GetManager().FlushAll(t.Context(), 10*time.Second)) + require.NoError(t, queue.GetManager().FlushAll(context.Background(), 10*time.Second)) status, err := repo_model.GetIndexerStatus(db.DefaultContext, repo, repo_model.RepoIndexerTypeStats) require.NoError(t, err) diff --git a/tests/integration/links_test.go b/tests/integration/links_test.go index 3d240f900a..e9ad933b24 100644 --- a/tests/integration/links_test.go +++ b/tests/integration/links_test.go @@ -9,11 +9,11 @@ import ( "path" "testing" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + forgejo_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/markup_external_test.go b/tests/integration/markup_external_test.go index e77d9682a4..0eaa9669f4 100644 --- a/tests/integration/markup_external_test.go +++ b/tests/integration/markup_external_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/markup_test.go b/tests/integration/markup_test.go index ab6b437390..d63190a885 100644 --- a/tests/integration/markup_test.go +++ b/tests/integration/markup_test.go @@ -9,9 +9,9 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/mention_test.go b/tests/integration/mention_test.go deleted file mode 100644 index 36a0ccb312..0000000000 --- a/tests/integration/mention_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestHeadMentionCSS(t *testing.T) { - userSession := loginUser(t, "user2") - resp := userSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK) - assert.Contains(t, resp.Body.String(), `.mention[href="/user2" i]`) - - guestSession := emptyTestSession(t) - resp = guestSession.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK) - assert.NotContains(t, resp.Body.String(), `.mention[href="`) -} diff --git a/tests/integration/migrate_test.go b/tests/integration/migrate_test.go index 32b3ef867d..43cfc4f37d 100644 --- a/tests/integration/migrate_test.go +++ b/tests/integration/migrate_test.go @@ -5,6 +5,7 @@ package integration import ( + "context" "fmt" "net/http" "net/url" @@ -12,20 +13,17 @@ import ( "path/filepath" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - "forgejo.org/services/migrations" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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/modules/structs" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/services/migrations" + "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -60,8 +58,16 @@ func TestMigrateLocalPath(t *testing.T) { func TestMigrate(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.Migrations.AllowLocalNetworks, true)() - defer test.MockVariableValue(&setting.AppVer, "1.16.0")() + AllowLocalNetworks := setting.Migrations.AllowLocalNetworks + setting.Migrations.AllowLocalNetworks = true + AppVer := setting.AppVer + // Gitea SDK (go-sdk) need to parse the AppVer from server response, so we must set it to a valid version string. + setting.AppVer = "1.16.0" + defer func() { + setting.Migrations.AllowLocalNetworks = AllowLocalNetworks + setting.AppVer = AppVer + migrations.Init() + }() require.NoError(t, migrations.Init()) ownerName := "user2" @@ -76,155 +82,42 @@ func TestMigrate(t *testing.T) { {svc: structs.GiteaService}, {svc: structs.ForgejoService}, } { - t.Run(s.svc.Name(), func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // Step 0: verify the repo is available - req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName) - _ = session.MakeRequest(t, req, http.StatusOK) - // Step 1: get the Gitea migration form - req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc) - resp := session.MakeRequest(t, req, http.StatusOK) - // Step 2: load the form - htmlDoc := NewHTMLParser(t, resp.Body) - // Check form title - title := htmlDoc.doc.Find("title").Text() - assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title")) - // Get the link of migration button - link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action") - assert.True(t, exists, "The template has changed") - // Step 4: submit the migration to only migrate issues - migratedRepoName := "otherrepo-" + s.svc.Name() - req = NewRequestWithValues(t, "POST", link, map[string]string{ - "_csrf": htmlDoc.GetCSRF(), - "service": fmt.Sprintf("%d", s.svc), - "clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName), - "auth_token": token, - "issues": "on", - "repo_name": migratedRepoName, - "description": "", - "uid": fmt.Sprintf("%d", repoOwner.ID), - }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) - // Step 5: a redirection displays the migrated repository - assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), test.RedirectURL(resp)) - // Step 6: check the repo was created - unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName}) + // Step 0: verify the repo is available + req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName) + _ = session.MakeRequest(t, req, http.StatusOK) + // Step 1: get the Gitea migration form + req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc) + resp := session.MakeRequest(t, req, http.StatusOK) + // Step 2: load the form + htmlDoc := NewHTMLParser(t, resp.Body) + // Check form title + title := htmlDoc.doc.Find("title").Text() + assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title")) + // Get the link of migration button + link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action") + assert.True(t, exists, "The template has changed") + // Step 4: submit the migration to only migrate issues + migratedRepoName := "otherrepo" + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "service": fmt.Sprintf("%d", s.svc), + "clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName), + "auth_token": token, + "issues": "on", + "repo_name": migratedRepoName, + "description": "", + "uid": fmt.Sprintf("%d", repoOwner.ID), }) - } - }) -} + resp = session.MakeRequest(t, req, http.StatusSeeOther) + // Step 5: a redirection displays the migrated repository + loc := resp.Header().Get("Location") + assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), loc) + // Step 6: check the repo was created + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName}) -func TestMigrateWithWiki(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.Migrations.AllowLocalNetworks, true)() - defer test.MockVariableValue(&setting.AppVer, "1.16.0")() - require.NoError(t, migrations.Init()) - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepoWithOptions(t, user, tests.DeclarativeRepoOptions{ - WikiBranch: optional.Some("obscure-name"), - }) - defer f() - - session := loginUser(t, user.Name) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeReadMisc) - - for _, s := range []struct { - svc structs.GitServiceType - }{ - {svc: structs.GiteaService}, - {svc: structs.ForgejoService}, - } { - t.Run(s.svc.Name(), func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // Step 0: verify the repo is available - req := NewRequestf(t, "GET", "/%s", repo.FullName()) - _ = session.MakeRequest(t, req, http.StatusOK) - // Step 1: get the Gitea migration form - req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc) - resp := session.MakeRequest(t, req, http.StatusOK) - // Step 2: load the form - htmlDoc := NewHTMLParser(t, resp.Body) - // Check form title - title := htmlDoc.doc.Find("title").Text() - assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title")) - // Step 4: submit the migration to only migrate issues - migratedRepoName := "otherrepo-" + s.svc.Name() - req = NewRequestWithValues(t, "POST", "/repo/migrate", map[string]string{ - "_csrf": GetCSRF(t, session, "/repo/migrate"), - "service": fmt.Sprintf("%d", s.svc), - "clone_addr": fmt.Sprintf("%s%s", u, repo.FullName()), - "auth_token": token, - "issues": "on", - "wiki": "on", - "repo_name": migratedRepoName, - "description": "", - "uid": fmt.Sprintf("%d", user.ID), - }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) - // Step 5: a redirection displays the migrated repository - assert.EqualValues(t, fmt.Sprintf("/%s/%s", user.Name, migratedRepoName), test.RedirectURL(resp)) - // Step 6: check the repo was created and load the repo - migratedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName, WikiBranch: "obscure-name"}) - // Step 7: check if the wiki is enabled - assert.True(t, migratedRepo.UnitEnabled(db.DefaultContext, unit.TypeWiki)) - }) - } - }) -} - -func TestMigrateWithReleases(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - defer test.MockVariableValue(&setting.Migrations.AllowLocalNetworks, true)() - defer test.MockVariableValue(&setting.AppVer, "1.16.0")() - require.NoError(t, migrations.Init()) - - ownerName := "user2" - repoName := "repo1" - repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: ownerName}) - session := loginUser(t, ownerName) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeReadMisc) - - for _, s := range []struct { - svc structs.GitServiceType - }{ - {svc: structs.GiteaService}, - {svc: structs.ForgejoService}, - } { - t.Run(s.svc.Name(), func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // Step 0: verify the repo is available - req := NewRequestf(t, "GET", "/%s/%s", ownerName, repoName) - _ = session.MakeRequest(t, req, http.StatusOK) - // Step 1: get the Gitea migration form - req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", s.svc) - resp := session.MakeRequest(t, req, http.StatusOK) - // Step 2: load the form - htmlDoc := NewHTMLParser(t, resp.Body) - // Check form title - title := htmlDoc.doc.Find("title").Text() - assert.Contains(t, title, translation.NewLocale("en-US").TrString("new_migrate.title")) - // Step 4: submit the migration to only migrate issues - migratedRepoName := "otherrepo-" + s.svc.Name() - req = NewRequestWithValues(t, "POST", "/repo/migrate", map[string]string{ - "_csrf": GetCSRF(t, session, "/repo/migrate"), - "service": fmt.Sprintf("%d", s.svc), - "clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName), - "auth_token": token, - "issues": "on", - "releases": "on", - "repo_name": migratedRepoName, - "description": "", - "uid": fmt.Sprintf("%d", repoOwner.ID), - }) - resp = session.MakeRequest(t, req, http.StatusSeeOther) - // Step 5: a redirection displays the migrated repository - assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), test.RedirectURL(resp)) - // Step 6: check the repo was created and load the repo - migratedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName}) - // Step 7: check if releases are enabled - assert.True(t, migratedRepo.UnitEnabled(db.DefaultContext, unit.TypeReleases)) - }) + // Step 7: delete the repository, so we can test with other services + err := repository.DeleteRepository(context.Background(), repoOwner, repo, false) + require.NoError(t, err) } }) } diff --git a/tests/integration/migration-test/forgejo-v1.19.0.mysql.sql.gz b/tests/integration/migration-test/forgejo-v1.19.0.mysql.sql.gz new file mode 100644 index 0000000000..4cea13baf8 Binary files /dev/null and b/tests/integration/migration-test/forgejo-v1.19.0.mysql.sql.gz differ diff --git a/tests/integration/migration-test/forgejo-v1.19.0.postgres.sql.gz b/tests/integration/migration-test/forgejo-v1.19.0.postgres.sql.gz new file mode 100644 index 0000000000..7fdc409dbb Binary files /dev/null and b/tests/integration/migration-test/forgejo-v1.19.0.postgres.sql.gz differ diff --git a/tests/integration/migration-test/forgejo-v1.19.0.sqlite3.sql.gz b/tests/integration/migration-test/forgejo-v1.19.0.sqlite3.sql.gz new file mode 100644 index 0000000000..dba4bafbdc Binary files /dev/null and b/tests/integration/migration-test/forgejo-v1.19.0.sqlite3.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.6.4.mysql.sql.gz b/tests/integration/migration-test/gitea-v1.6.4.mysql.sql.gz index fdbd7ff7be..30cca8b382 100644 Binary files a/tests/integration/migration-test/gitea-v1.6.4.mysql.sql.gz and b/tests/integration/migration-test/gitea-v1.6.4.mysql.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.6.4.postgres.sql.gz b/tests/integration/migration-test/gitea-v1.6.4.postgres.sql.gz index 2cbc109946..bd66f6ba4f 100644 Binary files a/tests/integration/migration-test/gitea-v1.6.4.postgres.sql.gz and b/tests/integration/migration-test/gitea-v1.6.4.postgres.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.6.4.sqlite3.sql.gz b/tests/integration/migration-test/gitea-v1.6.4.sqlite3.sql.gz index 321803bfba..a777c53025 100644 Binary files a/tests/integration/migration-test/gitea-v1.6.4.sqlite3.sql.gz and b/tests/integration/migration-test/gitea-v1.6.4.sqlite3.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.7.0.mysql.sql.gz b/tests/integration/migration-test/gitea-v1.7.0.mysql.sql.gz index dcaad58784..d0ab10891c 100644 Binary files a/tests/integration/migration-test/gitea-v1.7.0.mysql.sql.gz and b/tests/integration/migration-test/gitea-v1.7.0.mysql.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.7.0.postgres.sql.gz b/tests/integration/migration-test/gitea-v1.7.0.postgres.sql.gz index 7a3bdc1cd7..e4716c6b43 100644 Binary files a/tests/integration/migration-test/gitea-v1.7.0.postgres.sql.gz and b/tests/integration/migration-test/gitea-v1.7.0.postgres.sql.gz differ diff --git a/tests/integration/migration-test/gitea-v1.7.0.sqlite3.sql.gz b/tests/integration/migration-test/gitea-v1.7.0.sqlite3.sql.gz index d753f4d2b8..3155249b07 100644 Binary files a/tests/integration/migration-test/gitea-v1.7.0.sqlite3.sql.gz and b/tests/integration/migration-test/gitea-v1.7.0.sqlite3.sql.gz differ diff --git a/tests/integration/migration-test/migration_test.go b/tests/integration/migration-test/migration_test.go index 8076dfa452..a391296c35 100644 --- a/tests/integration/migration-test/migration_test.go +++ b/tests/integration/migration-test/migration_test.go @@ -5,6 +5,7 @@ package migrations import ( "compress/gzip" + "context" "database/sql" "fmt" "io" @@ -16,18 +17,18 @@ import ( "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/migrations" - migrate_base "forgejo.org/models/migrations/base" - "forgejo.org/models/unittest" - "forgejo.org/modules/base" - "forgejo.org/modules/charset" - "forgejo.org/modules/git" - "forgejo.org/modules/log" - "forgejo.org/modules/setting" - "forgejo.org/modules/testlogger" - "forgejo.org/modules/util" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/migrations" + migrate_base "code.gitea.io/gitea/models/migrations/base" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/charset" + "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" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -86,7 +87,7 @@ func initMigrationTest(t *testing.T) func() { } } - require.NoError(t, git.InitFull(t.Context())) + require.NoError(t, git.InitFull(context.Background())) setting.LoadDBSetting() setting.InitLoggersForTest() return deferFn @@ -278,13 +279,13 @@ func doMigrationTest(t *testing.T, version string) { setting.InitSQLLoggersForCli(log.INFO) - err := db.InitEngineWithMigration(t.Context(), wrappedMigrate) + err := db.InitEngineWithMigration(context.Background(), wrappedMigrate) require.NoError(t, err) currentEngine.Close() beans, _ := db.NamesToBean() - err = db.InitEngineWithMigration(t.Context(), func(x *xorm.Engine) error { + err = db.InitEngineWithMigration(context.Background(), func(x *xorm.Engine) error { currentEngine = x return migrate_base.RecreateTables(beans...)(x) }) @@ -292,7 +293,7 @@ func doMigrationTest(t *testing.T, version string) { currentEngine.Close() // We do this a second time to ensure that there is not a problem with retained indices - err = db.InitEngineWithMigration(t.Context(), func(x *xorm.Engine) error { + err = db.InitEngineWithMigration(context.Background(), func(x *xorm.Engine) error { currentEngine = x return migrate_base.RecreateTables(beans...)(x) }) diff --git a/tests/integration/milestone_test.go b/tests/integration/milestone_test.go index bdfdd2c6d9..ba46740a19 100644 --- a/tests/integration/milestone_test.go +++ b/tests/integration/milestone_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -21,22 +21,5 @@ func TestViewMilestones(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) search := htmlDoc.doc.Find(".list-header-search > .search > .input > input") placeholder, _ := search.Attr("placeholder") - assert.Equal(t, "Search milestones…", placeholder) -} - -func TestMilestonesCount(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - req := NewRequest(t, "GET", "/user2/repo1/milestones") - resp := MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - - openCount := htmlDoc.doc.Find("a[data-test-name='open-issue-count']").Text() - assert.Contains(t, openCount, "2\u00a0Open") - - closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() - assert.Contains(t, closedCount, "1\u00a0Closed") - - assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='all-issue-count']").Nodes) + assert.Equal(t, "Search milestones...", placeholder) } diff --git a/tests/integration/mirror_pull_test.go b/tests/integration/mirror_pull_test.go index c9c8037e27..60fb47e94b 100644 --- a/tests/integration/mirror_pull_test.go +++ b/tests/integration/mirror_pull_test.go @@ -4,19 +4,20 @@ package integration import ( + "context" "testing" - "forgejo.org/models/db" - 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/migration" - mirror_service "forgejo.org/services/mirror" - release_service "forgejo.org/services/release" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + "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" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/migration" + mirror_service "code.gitea.io/gitea/services/mirror" + release_service "code.gitea.io/gitea/services/release" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -49,7 +50,7 @@ func TestMirrorPull(t *testing.T) { require.NoError(t, err) assert.True(t, mirrorRepo.IsMirror, "expected pull-mirror repo to be marked as a mirror immediately after its creation") - ctx := t.Context() + ctx := context.Background() mirror, err := repo_service.MigrateRepositoryGitData(ctx, user, mirrorRepo, opts, nil) require.NoError(t, err) diff --git a/tests/integration/mirror_push_test.go b/tests/integration/mirror_push_test.go index ca8d536e46..fa62219707 100644 --- a/tests/integration/mirror_push_test.go +++ b/tests/integration/mirror_push_test.go @@ -5,6 +5,7 @@ package integration import ( + "context" "fmt" "net" "net/http" @@ -16,23 +17,23 @@ import ( "testing" "time" - asymkey_model "forgejo.org/models/asymkey" - "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/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - gitea_context "forgejo.org/services/context" - doctor "forgejo.org/services/doctor" - "forgejo.org/services/migrations" - mirror_service "forgejo.org/services/mirror" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + asymkey_model "code.gitea.io/gitea/models/asymkey" + "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + gitea_context "code.gitea.io/gitea/services/context" + doctor "code.gitea.io/gitea/services/doctor" + "code.gitea.io/gitea/services/migrations" + mirror_service "code.gitea.io/gitea/services/mirror" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -65,7 +66,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { require.NoError(t, err) assert.Len(t, mirrors, 2) - ok := mirror_service.SyncPushMirror(t.Context(), mirrors[0].ID) + ok := mirror_service.SyncPushMirror(context.Background(), mirrors[0].ID) assert.True(t, ok) srcGitRepo, err := gitrepo.OpenRepository(git.DefaultContext, srcRepo) diff --git a/tests/integration/new_org_test.go b/tests/integration/new_org_test.go index ab9ee4bc18..ec9f2f244c 100644 --- a/tests/integration/new_org_test.go +++ b/tests/integration/new_org_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/modules/translation" + "code.gitea.io/gitea/modules/translation" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/nonascii_branches_test.go b/tests/integration/nonascii_branches_test.go index 2b27c8be45..8917a9b574 100644 --- a/tests/integration/nonascii_branches_test.go +++ b/tests/integration/nonascii_branches_test.go @@ -9,7 +9,7 @@ import ( "path" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/notification_test.go b/tests/integration/notification_test.go deleted file mode 100644 index be1eecd1d1..0000000000 --- a/tests/integration/notification_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "testing" - - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" -) - -func TestNotification(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user2.Name) - - req := NewRequest(t, "GET", "/notifications") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - // Unread and pinned notification. - htmlDoc.AssertElement(t, ".notifications-link[href='/user2/repo1/pulls/3']", true) - htmlDoc.AssertElement(t, ".notifications-link[href='/user2/repo1/issues/4']", true) - htmlDoc.AssertElement(t, ".notifications-link[href='/user2/repo2/issues/1']", true) - - // Read notification. - htmlDoc.AssertElement(t, ".notifications-link[href='/user2/repo2/pulls/2']", false) -} diff --git a/tests/integration/oauth_test.go b/tests/integration/oauth_test.go index 2097afcfae..f385b99e46 100644 --- a/tests/integration/oauth_test.go +++ b/tests/integration/oauth_test.go @@ -5,6 +5,7 @@ package integration import ( "bytes" + "context" "crypto/sha256" "encoding/base64" "fmt" @@ -15,17 +16,17 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers/web/auth" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" + auth_model "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/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers/web/auth" + forgejo_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/tests" "github.com/markbates/goth" "github.com/stretchr/testify/assert" @@ -517,7 +518,7 @@ func TestSignInOAuthCallbackSignIn(t *testing.T) { LoginSource: gitlab.ID, LoginName: userGitLabUserID, } - defer createUser(t.Context(), t, userGitLab)() + defer createUser(context.Background(), t, userGitLab)() // // A request for user information sent to Goth will return a @@ -555,7 +556,7 @@ func TestSignInOAuthCallbackWithoutPKCEWhenUnsupported(t *testing.T) { LoginSource: gitlab.ID, LoginName: userGitLabUserID, } - defer createUser(t.Context(), t, userGitLab)() + defer createUser(context.Background(), t, userGitLab)() // initial redirection (to generate the code_challenge) session := emptyTestSession(t) @@ -597,7 +598,7 @@ func TestSignInOAuthCallbackPKCE(t *testing.T) { LoginSource: authSource.ID, LoginName: userID, } - defer createUser(t.Context(), t, user)() + defer createUser(context.Background(), t, user)() // initial redirection (to generate the code_challenge) session := emptyTestSession(t) @@ -655,7 +656,7 @@ func TestSignInOAuthCallbackRedirectToEscaping(t *testing.T) { LoginSource: gitlab.ID, LoginName: userGitLabUserID, } - defer createUser(t.Context(), t, userGitLab)() + defer createUser(context.Background(), t, userGitLab)() // // A request for user information sent to Goth will return a @@ -690,117 +691,6 @@ func TestSignInOAuthCallbackRedirectToEscaping(t *testing.T) { assert.Equal(t, "/login/oauth/authorize?redirect_uri=https://translate.example.org", test.RedirectURL(resp)) } -func setupMockOIDCServer() *httptest.Server { - var mockServer *httptest.Server - mockServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch r.URL.Path { - case "/.well-known/openid-configuration": - w.WriteHeader(http.StatusOK) - w.Write([]byte(`{ - "issuer": "` + mockServer.URL + `", - "authorization_endpoint": "` + mockServer.URL + `/authorize", - "token_endpoint": "` + mockServer.URL + `/token", - "userinfo_endpoint": "` + mockServer.URL + `/userinfo" - }`)) - default: - http.NotFound(w, r) - } - })) - return mockServer -} - -func TestSignInOauthCallbackSyncSSHKeys(t *testing.T) { - defer tests.PrepareTestEnv(t)() - mockServer := setupMockOIDCServer() - defer mockServer.Close() - - sourceName := "oidc" - authPayload := authSourcePayloadOpenIDConnect(sourceName, mockServer.URL+"/") - authPayload["oauth2_attribute_ssh_public_key"] = "sshpubkey" - authSource := addAuthSource(t, authPayload) - - userID := "5678" - user := &user_model.User{ - Name: "oidc.user", - Email: "oidc.user@example.com", - Passwd: "oidc.userpassword", - Type: user_model.UserTypeIndividual, - LoginType: auth_model.OAuth2, - LoginSource: authSource.ID, - LoginName: userID, - IsActive: true, - } - defer createUser(t.Context(), t, user)() - - for _, tt := range []struct { - name string - rawData map[string]any - parsedKeySets []string - }{ - { - name: "Add keys", - rawData: map[string]any{ - "sshpubkey": []any{ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINDRDoephkaFELacrNNe2fqAwedhRB1MKOpLEHlPuczO nocomment", - }, - }, - parsedKeySets: []string{ - "SHA256:X/mW7JUQ8J8yhrKBbZ/pJni8qx7zPA1DTFsi8ftpDwg", - }, - }, - { - name: "Update keys", - rawData: map[string]any{ - "sshpubkey": []any{ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMLLMOLFMouSJmzOASKKv178d+7op4utSxcugF9tVVch nocomment", - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGyDh9sg1IGQGa0U363wcGXrDlGBhZI3UHvS7we/0d+T nocomment", - }, - }, - parsedKeySets: []string{ - "SHA256:gsyG4JNmY5XoLBK5lSzuwD3EXcaDBiDKBkqDkpQTH6Q", - "SHA256:bbEKB1Qpumgk6QrgiN6t/kIvtUZvIQ8rqQBz8yYPzYw", - }, - }, - { - name: "Remove keys", - rawData: map[string]any{ - "sshpubkey": []any{}, - }, - parsedKeySets: []string{}, - }, - } { - t.Run(tt.name, func(t *testing.T) { - defer mockCompleteUserAuth(func(res http.ResponseWriter, req *http.Request) (goth.User, error) { - return goth.User{ - Provider: sourceName, - UserID: userID, - Email: user.Email, - RawData: tt.rawData, - }, nil - })() - - session := emptyTestSession(t) - - req := NewRequest(t, "GET", fmt.Sprintf("/user/oauth2/%s/callback?code=XYZ&state=XYZ", sourceName)) - resp := session.MakeRequest(t, req, http.StatusSeeOther) - assert.Equal(t, "/", test.RedirectURL(resp)) - - req = NewRequest(t, "GET", "/user/settings/keys") - resp = session.MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - divs := htmlDoc.doc.Find("#keys-ssh .flex-item .flex-item-body:not(:last-child)") - - syncedKeys := make([]string, divs.Length()) - for i := 0; i < divs.Length(); i++ { - syncedKeys[i] = strings.TrimSpace(divs.Eq(i).Text()) - } - - assert.ElementsMatch(t, tt.parsedKeySets, syncedKeys, "Unequal number of keys") - }) - } -} - func TestSignUpViaOAuthWithMissingFields(t *testing.T) { defer tests.PrepareTestEnv(t)() // enable auto-creation of accounts via OAuth2 @@ -1431,94 +1321,3 @@ func TestOAuth_GrantScopesReadPublicGroupsWithTheReadScope(t *testing.T) { assert.Contains(t, parsedUserInfo.Groups, privOrg) } } - -func TestSignUpViaOAuthDefaultRestricted(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.OAuth2Client.EnableAutoRegistration, true)() - defer test.MockVariableValue(&setting.Service.DefaultUserIsRestricted, true)() - - gitlabName := "gitlab" - addAuthSource(t, authSourcePayloadGitLabCustom(gitlabName)) - userGitLabUserID := "BB(5)=47176870" - - defer mockCompleteUserAuth(func(res http.ResponseWriter, req *http.Request) (goth.User, error) { - return goth.User{ - Provider: gitlabName, - UserID: userGitLabUserID, - Name: "gitlab-user", - NickName: "gitlab-user", - Email: "gitlab@example.com", - }, nil - })() - req := NewRequest(t, "GET", fmt.Sprintf("/user/oauth2/%s/callback?code=XYZ&state=XYZ", gitlabName)) - resp := MakeRequest(t, req, http.StatusSeeOther) - assert.Equal(t, "/", test.RedirectURL(resp)) - - unittest.AssertExistsIf(t, true, &user_model.User{Name: "gitlab-user"}, "is_restricted = true") -} - -func TestSignUpViaOAuthLinking2FA(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.OAuth2Client.EnableAutoRegistration, true)() - defer test.MockVariableValue(&setting.OAuth2Client.AccountLinking, setting.OAuth2AccountLinkingAuto)() - - // Fake that user 2 is enrolled into WebAuthn. - t.Cleanup(func() { - unittest.AssertSuccessfulDelete(t, &auth_model.WebAuthnCredential{UserID: 2}) - }) - unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: 2}) - - gitlabName := "gitlab" - addAuthSource(t, authSourcePayloadGitLabCustom(gitlabName)) - userGitLabUserID := "BB(4)=107" - - defer mockCompleteUserAuth(func(res http.ResponseWriter, req *http.Request) (goth.User, error) { - return goth.User{ - Provider: gitlabName, - UserID: userGitLabUserID, - NickName: "user2", - Email: "user2@example.com", - }, nil - })() - req := NewRequest(t, "GET", fmt.Sprintf("/user/oauth2/%s/callback?code=XYZ&state=XYZ", gitlabName)) - resp := MakeRequest(t, req, http.StatusSeeOther) - - // Make sure the user has to go through 2FA after linking. - assert.Equal(t, "/user/webauthn", test.RedirectURL(resp)) -} - -func TestSignUpViaOAuth2FA(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.OAuth2Client.EnableAutoRegistration, true)() - defer test.MockVariableValue(&setting.OAuth2Client.AccountLinking, setting.OAuth2AccountLinkingAuto)() - - gitlabName := "gitlab" - addAuthSource(t, authSourcePayloadGitLabCustom(gitlabName)) - userGitLabUserID := "BB(3)=21" - - defer mockCompleteUserAuth(func(res http.ResponseWriter, req *http.Request) (goth.User, error) { - return goth.User{ - Provider: gitlabName, - UserID: userGitLabUserID, - NickName: "user2", - Email: "user2@example.com", - }, nil - })() - req := NewRequest(t, "GET", fmt.Sprintf("/user/oauth2/%s/callback?code=XYZ&state=XYZ", gitlabName)) - resp := MakeRequest(t, req, http.StatusSeeOther) - - // Make sure the user can login normally and is linked. - assert.Equal(t, "/", test.RedirectURL(resp)) - - // Fake that user 2 is enrolled into WebAuthn. - t.Cleanup(func() { - unittest.AssertSuccessfulDelete(t, &auth_model.WebAuthnCredential{UserID: 2}) - }) - unittest.AssertSuccessfulInsert(t, &auth_model.WebAuthnCredential{UserID: 2}) - - req = NewRequest(t, "GET", fmt.Sprintf("/user/oauth2/%s/callback?code=XYZ&state=XYZ", gitlabName)) - resp = MakeRequest(t, req, http.StatusSeeOther) - - // Make sure user has to go through 2FA. - assert.Equal(t, "/user/webauthn", test.RedirectURL(resp)) -} diff --git a/tests/integration/opengraph_test.go b/tests/integration/opengraph_test.go index 38998d0c76..8d29e4548d 100644 --- a/tests/integration/opengraph_test.go +++ b/tests/integration/opengraph_test.go @@ -4,16 +4,14 @@ package integration import ( - "image" "net/http" "testing" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestOpenGraphProperties(t *testing.T) { @@ -44,7 +42,7 @@ func TestOpenGraphProperties(t *testing.T) { "og:title": "User Thirty", "og:url": setting.AppURL + "user30", "og:type": "profile", - "og:image": setting.AppURL + "assets/img/avatar_default.png", + "og:image": "https://secure.gravatar.com/avatar/eae1f44b34ff27284cb0792c7601c89c?d=identicon", "og:site_name": siteName, }, }, @@ -56,7 +54,7 @@ func TestOpenGraphProperties(t *testing.T) { "og:url": setting.AppURL + "the_34-user.with.all.allowedChars", "og:description": "some [commonmark](https://commonmark.org/)!", "og:type": "profile", - "og:image": setting.AppURL + "assets/img/avatar_default.png", + "og:image": setting.AppURL + "avatars/avatar34", "og:site_name": siteName, }, }, @@ -64,109 +62,75 @@ func TestOpenGraphProperties(t *testing.T) { name: "issue", url: "/user2/repo1/issues/1", expected: map[string]string{ - "og:title": "issue1", - "og:url": setting.AppURL + "user2/repo1/issues/1", - "og:description": "content for the first issue", - "og:type": "object", - "og:image": setting.AppURL + "user2/repo1/issues/1/summary-card", - "og:image:alt": "Summary card of an issue titled \"issue1\" in repository user2/repo1", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "issue1", + "og:url": setting.AppURL + "user2/repo1/issues/1", + "og:description": "content for the first issue", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?d=identicon", + "og:site_name": siteName, }, }, { name: "pull request", url: "/user2/repo1/pulls/2", expected: map[string]string{ - "og:title": "issue2", - "og:url": setting.AppURL + "user2/repo1/pulls/2", - "og:description": "content for the second issue", - "og:type": "object", - "og:image": setting.AppURL + "user2/repo1/pulls/2/summary-card", - "og:image:alt": "Summary card of an issue titled \"issue2\" in repository user2/repo1", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "issue2", + "og:url": setting.AppURL + "user2/repo1/pulls/2", + "og:description": "content for the second issue", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?d=identicon", + "og:site_name": siteName, }, }, { name: "file in repo", url: "/user27/repo49/src/branch/master/test/test.txt", expected: map[string]string{ - "og:title": "repo49/test/test.txt at master", - "og:url": setting.AppURL + "/user27/repo49/src/branch/master/test/test.txt", - "og:type": "object", - "og:image": setting.AppURL + "user27/repo49/-/summary-card", - "og:image:alt": "Summary card of repository user27/repo49", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "repo49/test/test.txt at master", + "og:url": setting.AppURL + "/user27/repo49/src/branch/master/test/test.txt", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/7095710e927665f1bdd1ced94152f232?d=identicon", + "og:site_name": siteName, }, }, { name: "wiki page for repo without description", url: "/user2/repo1/wiki/Page-With-Spaced-Name", expected: map[string]string{ - "og:title": "Page With Spaced Name", - "og:url": setting.AppURL + "/user2/repo1/wiki/Page-With-Spaced-Name", - "og:type": "object", - "og:image": setting.AppURL + "user2/repo1/-/summary-card", - "og:image:alt": "Summary card of repository user2/repo1", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "Page With Spaced Name", + "og:url": setting.AppURL + "/user2/repo1/wiki/Page-With-Spaced-Name", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?d=identicon", + "og:site_name": siteName, }, }, { name: "index page for repo without description", url: "/user2/repo1", expected: map[string]string{ - "og:title": "repo1", - "og:url": setting.AppURL + "user2/repo1", - "og:type": "object", - "og:image": setting.AppURL + "user2/repo1/-/summary-card", - "og:image:alt": "Summary card of repository user2/repo1", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "repo1", + "og:url": setting.AppURL + "user2/repo1", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?d=identicon", + "og:site_name": siteName, }, }, { name: "index page for repo with description", url: "/user27/repo49", expected: map[string]string{ - "og:title": "repo49", - "og:url": setting.AppURL + "user27/repo49", - "og:description": "A wonderful repository with more than just a README.md", - "og:type": "object", - "og:image": setting.AppURL + "user27/repo49/-/summary-card", - "og:image:alt": "Summary card of repository user27/repo49", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, - }, - }, - { - name: "release", - url: "/user2/repo1/releases/tag/v1.1", - expected: map[string]string{ - "og:title": "testing-release - user2/repo1", - "og:url": setting.AppURL + "user2/repo1/releases/tag/v1.1", - "og:type": "object", - "og:image": setting.AppURL + "user2/repo1/releases/summary-card/v1.1", - "og:image:alt": "Summary card of an release titled \"testing-release\" in repository user2/repo1", - "og:image:width": "1200", - "og:image:height": "600", - "og:site_name": siteName, + "og:title": "repo49", + "og:url": setting.AppURL + "user27/repo49", + "og:description": "A wonderful repository with more than just a README.md", + "og:type": "object", + "og:image": "https://secure.gravatar.com/avatar/7095710e927665f1bdd1ced94152f232?d=identicon", + "og:site_name": siteName, }, }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "GET", tc.url) resp := MakeRequest(t, req, http.StatusOK) doc := NewHTMLParser(t, resp.Body) @@ -184,45 +148,3 @@ func TestOpenGraphProperties(t *testing.T) { }) } } - -func TestOpenGraphSummaryCard(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - cases := []struct { - name string - url string - }{ - { - name: "repo", - url: "/user2/repo1/-/summary-card", - }, - { - name: "issue", - url: "/user2/repo1/issues/1/summary-card", - }, - { - name: "pull request", - url: "/user2/repo1/pulls/2/summary-card", - }, - { - name: "release", - url: "/user2/repo1/releases/summary-card/v1.1", - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", tc.url) - resp := MakeRequest(t, req, http.StatusOK) - - assert.Equal(t, "image/png", resp.Header().Get("Content-Type")) - img, imgType, err := image.Decode(resp.Body) - require.NoError(t, err) - assert.Equal(t, "png", imgType) - assert.Equal(t, 1200, img.Bounds().Dx()) - assert.Equal(t, 600, img.Bounds().Dy()) - }) - } -} diff --git a/tests/integration/org_count_test.go b/tests/integration/org_count_test.go index 93035c8e5b..e3de9257f0 100644 --- a/tests/integration/org_count_test.go +++ b/tests/integration/org_count_test.go @@ -8,12 +8,12 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + "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" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/org_nav_test.go b/tests/integration/org_nav_test.go index 09736d12a0..37b62921ae 100644 --- a/tests/integration/org_nav_test.go +++ b/tests/integration/org_nav_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "forgejo.org/modules/translation" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/org_project_test.go b/tests/integration/org_project_test.go index 3ab2379b5e..31d10f16ff 100644 --- a/tests/integration/org_project_test.go +++ b/tests/integration/org_project_test.go @@ -8,8 +8,8 @@ import ( "slices" "testing" - unit_model "forgejo.org/models/unit" - "forgejo.org/tests" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/tests" ) func TestOrgProjectAccess(t *testing.T) { diff --git a/tests/integration/org_settings_test.go b/tests/integration/org_settings_test.go deleted file mode 100644 index fde57e2e26..0000000000 --- a/tests/integration/org_settings_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package integration - -import ( - "fmt" - "net/http" - "testing" - - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func getOrgSettingsFormData(t *testing.T, session *TestSession, orgName string) map[string]string { - return map[string]string{ - "_csrf": GetCSRF(t, session, fmt.Sprintf("/org/%s/settings", orgName)), - "name": orgName, - "full_name": "", - "email": "", - "description": "", - "website": "", - "location": "", - "visibility": "0", - "repo_admin_change_team_access": "on", - "max_repo_creation": "-1", - } -} - -func getOrgSettings(t *testing.T, token, orgName string) *api.Organization { - t.Helper() - - req := NewRequestf(t, "GET", "/api/v1/orgs/%s", orgName).AddTokenAuth(token) - resp := MakeRequest(t, req, http.StatusOK) - - var org *api.Organization - DecodeJSON(t, resp, &org) - - return org -} - -func TestOrgSettingsChangeEmail(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - const orgName = "org3" - settingsURL := fmt.Sprintf("/org/%s/settings", orgName) - - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadOrganization) - - t.Run("Invalid", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - settings := getOrgSettingsFormData(t, session, orgName) - - settings["email"] = "invalid" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusOK) - - org := getOrgSettings(t, token, orgName) - assert.Equal(t, "org3@example.com", org.Email) - }) - - t.Run("Valid", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - settings := getOrgSettingsFormData(t, session, orgName) - - settings["email"] = "example@example.com" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther) - - org := getOrgSettings(t, token, orgName) - assert.Equal(t, "example@example.com", org.Email) - }) - - t.Run("Empty", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - settings := getOrgSettingsFormData(t, session, orgName) - - settings["email"] = "" - session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther) - - org := getOrgSettings(t, token, orgName) - assert.Empty(t, org.Email) - }) -} diff --git a/tests/integration/org_team_invite_test.go b/tests/integration/org_team_invite_test.go index 3ca236a5dd..2fe296e8c3 100644 --- a/tests/integration/org_team_invite_test.go +++ b/tests/integration/org_team_invite_test.go @@ -10,14 +10,14 @@ import ( "strings" "testing" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/organization" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/models/auth" + "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" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/org_test.go b/tests/integration/org_test.go index bc1a5bbe72..db2e670af4 100644 --- a/tests/integration/org_test.go +++ b/tests/integration/org_test.go @@ -9,16 +9,14 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/organization" - "forgejo.org/models/perm" - "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/organization" + "code.gitea.io/gitea/models/perm" + "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -210,7 +208,9 @@ func TestTeamSearch(t *testing.T) { var results TeamSearchResults session := loginUser(t, user.Name) + csrf := GetCSRF(t, session, "/"+org.Name) req := NewRequestf(t, "GET", "/org/%s/teams/-/search?q=%s", org.Name, "_team") + req.Header.Add("X-Csrf-Token", csrf) resp := session.MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &results) assert.NotEmpty(t, results.Data) @@ -221,7 +221,9 @@ func TestTeamSearch(t *testing.T) { // no access if not organization member user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) session = loginUser(t, user5.Name) + csrf = GetCSRF(t, session, "/"+org.Name) req = NewRequestf(t, "GET", "/org/%s/teams/-/search?q=%s", org.Name, "team") + req.Header.Add("X-Csrf-Token", csrf) session.MakeRequest(t, req, http.StatusNotFound) } @@ -268,32 +270,3 @@ func TestOwnerTeamUnit(t *testing.T) { unittest.AssertExistsAndLoadBean(t, &organization.TeamUnit{TeamID: 1, Type: unit.TypeIssues, AccessMode: perm.AccessModeOwner}) } - -func TestOrgNewMigrationButton(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - migrateSelector := `a[href^="/repo/migrate?org="]` - - session := loginUser(t, "user2") - t.Run("Migration disabled", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.Repository.DisableMigrations, true)() - - req := NewRequest(t, "GET", "/org3") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - htmlDoc.AssertElement(t, migrateSelector, false) - }) - - t.Run("Migration enabled", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.Repository.DisableMigrations, false)() - - req := NewRequest(t, "GET", "/org3") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - htmlDoc.AssertElement(t, migrateSelector, true) - }) -} diff --git a/tests/integration/private_project_test.go b/tests/integration/private_project_test.go deleted file mode 100644 index ea6788cb64..0000000000 --- a/tests/integration/private_project_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "strings" - "testing" - - org_model "forgejo.org/models/organization" - project_model "forgejo.org/models/project" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestPrivateIssueProject(t *testing.T) { - defer unittest.OverrideFixtures("models/fixtures/PrivateIssueProjects")() - defer tests.PrepareTestEnv(t)() - - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - sess := loginUser(t, user2.Name) - - test := func(t *testing.T, sess *TestSession, username string, projectID int64, hasAccess bool, publicIssueHref ...string) { - t.Helper() - defer tests.PrintCurrentTest(t, 1)() - - // Test that the projects overview page shows the correct open and close issues. - req := NewRequestf(t, "GET", "%s/-/projects", username) - resp := sess.MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - openCloseStats := htmlDoc.Find(".milestone-toolbar .group").First().Text() - if hasAccess { - assert.Contains(t, openCloseStats, "2\u00a0Open") - } else { - assert.Contains(t, openCloseStats, "1\u00a0Open") - } - assert.Contains(t, openCloseStats, "0\u00a0Closed") - - // Check that on the project itself the issue is not shown. - req = NewRequestf(t, "GET", "%s/-/projects/%d", username, projectID) - resp = sess.MakeRequest(t, req, http.StatusOK) - - htmlDoc = NewHTMLParser(t, resp.Body) - issueCardsLen := htmlDoc.Find(".project-column .issue-card").Length() - if hasAccess { - assert.EqualValues(t, 2, issueCardsLen) - } else { - assert.EqualValues(t, 1, issueCardsLen) - // Ensure that the public issue is shown. - assert.EqualValues(t, publicIssueHref[0], htmlDoc.Find(".project-column .issue-card .issue-card-title").AttrOr("href", "")) - } - - // And that the issue count is correct. - issueCount := strings.TrimSpace(htmlDoc.Find(".project-column-issue-count").Text()) - if hasAccess { - assert.EqualValues(t, "2", issueCount) - } else { - assert.EqualValues(t, "1", issueCount) - } - } - - t.Run("Organization project", func(t *testing.T) { - org := unittest.AssertExistsAndLoadBean(t, &org_model.Organization{ID: 3}) - orgProject := unittest.AssertExistsAndLoadBean(t, &project_model.Project{ID: 1001, OwnerID: org.ID}) - - t.Run("Authenticated user", func(t *testing.T) { - test(t, sess, org.Name, orgProject.ID, true) - }) - - t.Run("Anonymous user", func(t *testing.T) { - test(t, emptyTestSession(t), org.Name, orgProject.ID, false, "/org3/repo21/issues/1") - }) - }) - - t.Run("User project", func(t *testing.T) { - userProject := unittest.AssertExistsAndLoadBean(t, &project_model.Project{ID: 1002, OwnerID: user2.ID}) - - t.Run("Authenticated user", func(t *testing.T) { - test(t, sess, user2.Name, userProject.ID, true) - }) - - t.Run("Anonymous user", func(t *testing.T) { - test(t, emptyTestSession(t), user2.Name, userProject.ID, false, "/user2/repo1/issues/1") - }) - }) -} diff --git a/tests/integration/privateactivity_test.go b/tests/integration/privateactivity_test.go index 84f09c64e1..5362462f7d 100644 --- a/tests/integration/privateactivity_test.go +++ b/tests/integration/privateactivity_test.go @@ -8,13 +8,13 @@ import ( "net/http" "testing" - activities_model "forgejo.org/models/activities" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + activities_model "code.gitea.io/gitea/models/activities" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/proctected_branch_test.go b/tests/integration/proctected_branch_test.go index 5024b63c42..9c6e5e3cae 100644 --- a/tests/integration/proctected_branch_test.go +++ b/tests/integration/proctected_branch_test.go @@ -10,10 +10,10 @@ import ( "strings" "testing" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/tests" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/project_test.go b/tests/integration/project_test.go index 7dc8bf112d..fc2986e1eb 100644 --- a/tests/integration/project_test.go +++ b/tests/integration/project_test.go @@ -8,11 +8,11 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - project_model "forgejo.org/models/project" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + project_model "code.gitea.io/gitea/models/project" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/pull_commit_test.go b/tests/integration/pull_commit_test.go index 90d16d725d..477f01725d 100644 --- a/tests/integration/pull_commit_test.go +++ b/tests/integration/pull_commit_test.go @@ -5,29 +5,30 @@ package integration import ( "net/http" + "net/url" "testing" - pull_service "forgejo.org/services/pull" - "forgejo.org/tests" + pull_service "code.gitea.io/gitea/services/pull" "github.com/stretchr/testify/assert" ) func TestListPullCommits(t *testing.T) { - defer tests.PrepareTestEnv(t)() - session := loginUser(t, "user5") - req := NewRequest(t, "GET", "/user2/repo1/pulls/3/commits/list") - resp := session.MakeRequest(t, req, http.StatusOK) + onGiteaRun(t, func(t *testing.T, u *url.URL) { + session := loginUser(t, "user5") + req := NewRequest(t, "GET", "/user2/repo1/pulls/3/commits/list") + resp := session.MakeRequest(t, req, http.StatusOK) - var pullCommitList struct { - Commits []pull_service.CommitInfo `json:"commits"` - LastReviewCommitSha string `json:"last_review_commit_sha"` - } - DecodeJSON(t, resp, &pullCommitList) + var pullCommitList struct { + Commits []pull_service.CommitInfo `json:"commits"` + LastReviewCommitSha string `json:"last_review_commit_sha"` + } + DecodeJSON(t, resp, &pullCommitList) - if assert.Len(t, pullCommitList.Commits, 2) { - assert.Equal(t, "5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", pullCommitList.Commits[0].ID) - assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.Commits[1].ID) - } - assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.LastReviewCommitSha) + if assert.Len(t, pullCommitList.Commits, 2) { + assert.Equal(t, "5f22f7d0d95d614d25a5b68592adb345a4b5c7fd", pullCommitList.Commits[0].ID) + assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.Commits[1].ID) + } + assert.Equal(t, "4a357436d925b5c974181ff12a994538ddc5a269", pullCommitList.LastReviewCommitSha) + }) } diff --git a/tests/integration/pull_compare_test.go b/tests/integration/pull_compare_test.go index adb24c60f6..f5baf05965 100644 --- a/tests/integration/pull_compare_test.go +++ b/tests/integration/pull_compare_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/pull_create_test.go b/tests/integration/pull_create_test.go index 42155076a8..b814642bc7 100644 --- a/tests/integration/pull_create_test.go +++ b/tests/integration/pull_create_test.go @@ -14,17 +14,17 @@ import ( "strings" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/graceful" - "forgejo.org/modules/test" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/test" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -336,10 +336,6 @@ func TestRecentlyPushed(t *testing.T) { []repo_model.RepoUnit{{ RepoID: repo.ID, Type: unit_model.TypePullRequests, - Config: &repo_model.PullRequestsConfig{ - AllowMerge: true, - AllowSquash: true, - }, }}, nil) require.NoError(t, err) @@ -531,37 +527,6 @@ func TestRecentlyPushed(t *testing.T) { link, _ := htmlDoc.Find(".ui.message a[href*='/src/branch/']").Attr("href") assert.Equal(t, "/user1/repo1/src/branch/recent-push", link) }) - - // Test that visiting the base repo does not show any banner if - // the branches have corresponding PRs (open or merged) - t.Run("branches with merged or open PRs are not shown", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - respChildPR := testPullCreateDirectly(t, session, "user2", "repo1", "master", "user1", "repo1", "recent-push", "Child Pull Request") - elemChildPR := strings.Split(test.RedirectURL(respChildPR), "/") - assert.EqualValues(t, "user2", elemChildPR[1]) - assert.EqualValues(t, "repo1", elemChildPR[2]) - assert.EqualValues(t, "pulls", elemChildPR[3]) - session2 := loginUser(t, "user2") - // Merge the PR from the fork - testPullMerge(t, session2, elemChildPR[1], elemChildPR[2], elemChildPR[4], repo_model.MergeStyleSquash, false) - - respBasePR := testPullCreate(t, session, "user2", "repo1", true, "master", "recent-push-base", "Base Pull Request") - elemBasePR := strings.Split(test.RedirectURL(respBasePR), "/") - assert.EqualValues(t, "pulls", elemBasePR[3]) - // Leave the PR from the base repo open (it conflicts with the PR from the fork anyway) - - // Count recently pushed branches on the base repo - req := NewRequest(t, "GET", "/user2/repo1") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - messages := htmlDoc.Find(".ui.message") - - // None of the branches should be shown, as they have either already been merged already, - // or have an open PR, so it doesn't make sense to make a new PR for any of them. - assert.Equal(t, 0, messages.Length()) - }) }) } diff --git a/tests/integration/pull_diff_test.go b/tests/integration/pull_diff_test.go index 70e0d5d33a..5411250935 100644 --- a/tests/integration/pull_diff_test.go +++ b/tests/integration/pull_diff_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" diff --git a/tests/integration/pull_editable_test.go b/tests/integration/pull_editable_test.go deleted file mode 100644 index f2e6f2f52c..0000000000 --- a/tests/integration/pull_editable_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "net/url" - "testing" - - auth_model "forgejo.org/models/auth" - api "forgejo.org/modules/structs" - "forgejo.org/tests" -) - -func TestPullEditable_ShowEditableLabel(t *testing.T) { - onGiteaRun(t, func(t *testing.T, forgejoURL *url.URL) { - t.Run("Show editable label if PR is editable", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - editable := true - - setPREditable(t, editable) - testEditableLabelShown(t, editable) - }) - - t.Run("Don't show editable label if PR is not editable", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - editable := false - - setPREditable(t, editable) - testEditableLabelShown(t, editable) - }) - }) -} - -func setPREditable(t *testing.T, editable bool) { - t.Helper() - session := loginUser(t, "user1") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - req := NewRequestWithJSON(t, "PATCH", "/api/v1/repos/user2/repo1/pulls/3", &api.EditPullRequestOption{ - AllowMaintainerEdit: &editable, - }).AddTokenAuth(token) - session.MakeRequest(t, req, http.StatusCreated) -} - -func testEditableLabelShown(t *testing.T, expectLabel bool) { - t.Helper() - session := loginUser(t, "user2") - req := NewRequest(t, "GET", "/user2/repo1/pulls/3") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "#editable-label", expectLabel) -} diff --git a/tests/integration/pull_icon_test.go b/tests/integration/pull_icon_test.go index 9ab8f244cf..8fde547ce9 100644 --- a/tests/integration/pull_icon_test.go +++ b/tests/integration/pull_icon_test.go @@ -12,17 +12,17 @@ import ( "testing" "time" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -133,7 +133,7 @@ func testPullRequestListIcon(t *testing.T, doc *HTMLDoc, name, expectedColor, ex } func createOpenPullRequest(ctx context.Context, t *testing.T, user *user_model.User, repo *repo_model.Repository) *issues_model.PullRequest { - pull := createPullRequest(t, user, repo, "branch-open", "open") + pull := createPullRequest(t, user, repo, "open") assert.False(t, pull.Issue.IsClosed) assert.False(t, pull.HasMerged) @@ -143,7 +143,7 @@ func createOpenPullRequest(ctx context.Context, t *testing.T, user *user_model.U } func createOpenWipPullRequest(ctx context.Context, t *testing.T, user *user_model.User, repo *repo_model.Repository) *issues_model.PullRequest { - pull := createPullRequest(t, user, repo, "branch-open-wip", "open-wip") + pull := createPullRequest(t, user, repo, "open-wip") err := issue_service.ChangeTitle(ctx, pull.Issue, user, "WIP: "+pull.Issue.Title) require.NoError(t, err) @@ -156,7 +156,7 @@ func createOpenWipPullRequest(ctx context.Context, t *testing.T, user *user_mode } func createClosedPullRequest(ctx context.Context, t *testing.T, user *user_model.User, repo *repo_model.Repository) *issues_model.PullRequest { - pull := createPullRequest(t, user, repo, "branch-closed", "closed") + pull := createPullRequest(t, user, repo, "closed") err := issue_service.ChangeStatus(ctx, pull.Issue, user, "", true) require.NoError(t, err) @@ -169,7 +169,7 @@ func createClosedPullRequest(ctx context.Context, t *testing.T, user *user_model } func createClosedWipPullRequest(ctx context.Context, t *testing.T, user *user_model.User, repo *repo_model.Repository) *issues_model.PullRequest { - pull := createPullRequest(t, user, repo, "branch-closed-wip", "closed-wip") + pull := createPullRequest(t, user, repo, "closed-wip") err := issue_service.ChangeTitle(ctx, pull.Issue, user, "WIP: "+pull.Issue.Title) require.NoError(t, err) @@ -185,7 +185,7 @@ func createClosedWipPullRequest(ctx context.Context, t *testing.T, user *user_mo } func createMergedPullRequest(ctx context.Context, t *testing.T, user *user_model.User, repo *repo_model.Repository) *issues_model.PullRequest { - pull := createPullRequest(t, user, repo, "branch-merged", "merged") + pull := createPullRequest(t, user, repo, "merged") gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) defer gitRepo.Close() @@ -202,7 +202,10 @@ func createMergedPullRequest(ctx context.Context, t *testing.T, user *user_model return pull } -func createPullRequest(t *testing.T, user *user_model.User, repo *repo_model.Repository, branch, title string) *issues_model.PullRequest { +func createPullRequest(t *testing.T, user *user_model.User, repo *repo_model.Repository, name string) *issues_model.PullRequest { + branch := "branch-" + name + title := "Testing " + name + _, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{ { diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index f60fc27bb3..caf100144d 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -5,6 +5,7 @@ package integration import ( "bytes" + "context" "fmt" "net/http" "net/http/httptest" @@ -17,32 +18,32 @@ import ( "testing" "time" - "forgejo.org/models" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - pull_model "forgejo.org/models/pull" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/hostmatcher" - "forgejo.org/modules/queue" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - "forgejo.org/services/automerge" - forgejo_context "forgejo.org/services/context" - "forgejo.org/services/forms" - "forgejo.org/services/pull" - commitstatus_service "forgejo.org/services/repository/commitstatus" - files_service "forgejo.org/services/repository/files" - webhook_service "forgejo.org/services/webhook" - "forgejo.org/tests" + "code.gitea.io/gitea/models" + auth_model "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" + pull_model "code.gitea.io/gitea/models/pull" + 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/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/hostmatcher" + "code.gitea.io/gitea/modules/queue" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/services/automerge" + forgejo_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/pull" + commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" + files_service "code.gitea.io/gitea/services/repository/files" + webhook_service "code.gitea.io/gitea/services/webhook" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -302,11 +303,11 @@ func TestCantMergeConflict(t *testing.T) { gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo1) require.NoError(t, err) - err = pull.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "CONFLICT", false) + err = pull.Merge(context.Background(), pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "CONFLICT", false) require.Error(t, err, "Merge should return an error due to conflict") assert.True(t, models.IsErrMergeConflicts(err), "Merge error is not a conflict error") - err = pull.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleRebase, "", "CONFLICT", false) + err = pull.Merge(context.Background(), pr, user1, gitRepo, repo_model.MergeStyleRebase, "", "CONFLICT", false) require.Error(t, err, "Merge should return an error due to conflict") assert.True(t, models.IsErrRebaseConflicts(err), "Merge error is not a conflict error") gitRepo.Close() @@ -401,7 +402,7 @@ func TestCantMergeUnrelated(t *testing.T) { BaseBranch: "base", }) - err = pull.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "UNRELATED", false) + err = pull.Merge(context.Background(), pr, user1, gitRepo, repo_model.MergeStyleMerge, "", "UNRELATED", false) require.Error(t, err, "Merge should return an error due to unrelated") assert.True(t, models.IsErrMergeUnrelatedHistories(err), "Merge error is not a unrelated histories error") gitRepo.Close() @@ -441,7 +442,7 @@ func TestFastForwardOnlyMerge(t *testing.T) { gitRepo, err := git.OpenRepository(git.DefaultContext, repo_model.RepoPath(user1.Name, repo1.Name)) require.NoError(t, err) - err = pull.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "FAST-FORWARD-ONLY", false) + err = pull.Merge(context.Background(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "FAST-FORWARD-ONLY", false) require.NoError(t, err) @@ -483,7 +484,7 @@ func TestCantFastForwardOnlyMergeDiverging(t *testing.T) { gitRepo, err := git.OpenRepository(git.DefaultContext, repo_model.RepoPath(user1.Name, repo1.Name)) require.NoError(t, err) - err = pull.Merge(t.Context(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "DIVERGING", false) + err = pull.Merge(context.Background(), pr, user1, gitRepo, repo_model.MergeStyleFastForwardOnly, "", "DIVERGING", false) require.Error(t, err, "Merge should return an error due to being for a diverging branch") assert.True(t, models.IsErrMergeDivergingFastForwardOnly(err), "Merge error is not a diverging fast-forward-only error") @@ -632,7 +633,7 @@ func TestPullMergeIndexerNotifier(t *testing.T) { testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") createPullResp := testPullCreate(t, session, "user1", "repo1", false, "master", "master", "Indexer notifier test pull") - require.NoError(t, queue.GetManager().FlushAll(t.Context(), 0)) + require.NoError(t, queue.GetManager().FlushAll(context.Background(), 0)) time.Sleep(time.Second) repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ @@ -671,7 +672,7 @@ func TestPullMergeIndexerNotifier(t *testing.T) { }) assert.True(t, issue.IsClosed) - require.NoError(t, queue.GetManager().FlushAll(t.Context(), 0)) + require.NoError(t, queue.GetManager().FlushAll(context.Background(), 0)) time.Sleep(time.Second) // search issues again @@ -691,7 +692,7 @@ func testResetRepo(t *testing.T, repoPath, branch, commitID string) { require.NoError(t, err) f.Close() - repo, err := git.OpenRepository(t.Context(), repoPath) + repo, err := git.OpenRepository(context.Background(), repoPath) require.NoError(t, err) defer repo.Close() id, err := repo.GetBranchCommitID(branch) @@ -821,7 +822,6 @@ func TestPullMergeBranchProtect(t *testing.T) { } for _, withAPIOrWeb := range []string{"api", "web"} { t.Run(testCase.name+" "+withAPIOrWeb, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() branch := testCase.name + "-" + withAPIOrWeb unprotected := branch + "-unprotected" doGitCheckoutBranch(dstPath, "master")(t) @@ -834,7 +834,8 @@ func TestPullMergeBranchProtect(t *testing.T) { ctx = NewAPITestContext(t, testCase.doer, "not used", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) ctx.Username = owner ctx.Reponame = repo - generateCommitWithNewData(t, littleSize, dstPath, "user2@example.com", "User Two", testCase.filename) + _, err := generateCommitWithNewData(littleSize, dstPath, "user2@example.com", "User Two", testCase.filename) + require.NoError(t, err) doGitPushTestRepository(dstPath, "origin", branch+":"+unprotected)(t) pr, err := doAPICreatePullRequest(ctx, owner, repo, branch, unprotected)(t) require.NoError(t, err) @@ -845,192 +846,180 @@ func TestPullMergeBranchProtect(t *testing.T) { }) } -func testPullAutoMergeAfterCommitStatusSucceed(t *testing.T, ctx APITestContext, forkName string, approval, deleteBranch, withAPI bool) { - // prepare environment (fork repo, create user) - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - testRepoFork(t, ctx.Session, "user2", "repo1", "user1", forkName) - defer func() { - testDeleteRepository(t, ctx.Session, "user1", forkName) - }() +func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + // create a pull request + session := loginUser(t, "user1") + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + forkedName := "repo1-1" + testRepoFork(t, session, "user2", "repo1", "user1", forkedName) + defer func() { + testDeleteRepository(t, session, "user1", forkedName) + }() + testEditFile(t, session, "user1", forkedName, "master", "README.md", "Hello, World (Edited)\n") + testPullCreate(t, session, "user1", forkedName, false, "master", "master", "Indexer notifier test pull") - // create a pull request with some changes - branchName := "master" - if deleteBranch { - branchName = "new_branch_1" - testEditFileToNewBranch(t, ctx.Session, "user1", forkName, "master", branchName, "README.md", "Hello, World (Edited)\n") - } else { - testEditFile(t, ctx.Session, "user1", forkName, "master", "README.md", "Hello, World (Edited)\n") - } - testPullCreate(t, ctx.Session, "user1", forkName, false, "master", branchName, "Indexer notifier test pull") + baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) + forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: forkedName}) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ + BaseRepoID: baseRepo.ID, + BaseBranch: "master", + HeadRepoID: forkedRepo.ID, + HeadBranch: "master", + }) - baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) - forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: forkName}) - pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ - BaseRepoID: baseRepo.ID, - BaseBranch: "master", - HeadRepoID: forkedRepo.ID, - HeadBranch: branchName, - }) + // add protected branch for commit status + csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + // Change master branch to protected + req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ + "_csrf": csrf, + "rule_name": "master", + "enable_push": "true", + "enable_status_check": "true", + "status_check_contexts": "gitea/actions", + }) + session.MakeRequest(t, req, http.StatusSeeOther) - if deleteBranch { - // check if new branch exists - forkedGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, forkedRepo) + // first time insert automerge record, return true + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") require.NoError(t, err) - newBranch, err := forkedGitRepo.GetBranch(branchName) + assert.True(t, scheduled) + + // second time insert automerge record, return false because it does exist + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") + require.Error(t, err) + assert.False(t, scheduled) + + // reload pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.False(t, pr.HasMerged) + assert.Empty(t, pr.MergedCommitID) + + // update commit status to success, then it should be merged automatically + baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) + require.NoError(t, err) + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + require.NoError(t, err) + masterCommitID, err := baseGitRepo.GetBranchCommitID("master") require.NoError(t, err) - assert.NotNil(t, newBranch) - forkedGitRepo.Close() - } - // schedule pull request for automerge - if withAPI { - mergePullRequestForm := forms.MergePullRequestForm{ - MergeMessageField: "auto merge test", - Do: string(repo_model.MergeStyleMerge), - MergeWhenChecksSucceed: true, - DeleteBranchAfterMerge: deleteBranch, - } + branches, _, err := baseGitRepo.GetBranchNames(0, 100) + require.NoError(t, err) + assert.ElementsMatch(t, []string{"sub-home-md-img-check", "home-md-img-check", "pr-to-update", "branch2", "DefaultBranch", "develop", "feature/1", "master"}, branches) + baseGitRepo.Close() + defer func() { + testResetRepo(t, baseRepo.RepoPath(), "master", masterCommitID) + }() - // first time scheduling an automerge pull request, should return a 201 - ctx.ExpectedCode = http.StatusCreated - doAPIMergePullRequestForm(t, ctx, "user2", "repo1", pr.Index, &mergePullRequestForm) + err = commitstatus_service.CreateCommitStatus(db.DefaultContext, baseRepo, user1, sha, &git_model.CommitStatus{ + State: api.CommitStatusSuccess, + TargetURL: "https://gitea.com", + Context: "gitea/actions", + }) + require.NoError(t, err) - // second time scheduling an automerge pull request, should return a 409 - ctx.ExpectedCode = http.StatusConflict - doAPIMergePullRequestForm(t, ctx, "user2", "repo1", pr.Index, &mergePullRequestForm) - } else { - mergePullRequestForm := map[string]string{ - "merge_message_field": "auto merge test", - "do": string(repo_model.MergeStyleMerge), - "merge_when_checks_succeed": "true", - "delete_branch_after_merge": strconv.FormatBool(deleteBranch), - } + time.Sleep(2 * time.Second) - // first time scheduling an automerge pull request, should return a 200 - testPullMergeForm(t, ctx.Session, http.StatusOK, "user2", "repo1", strconv.FormatInt(pr.Index, 10), mergePullRequestForm) + // realod pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.True(t, pr.HasMerged) + assert.NotEmpty(t, pr.MergedCommitID) - // second time scheduling an automerge pull request, should delete the previous scheduled automerge and return a 200 again - testPullMergeForm(t, ctx.Session, http.StatusOK, "user2", "repo1", strconv.FormatInt(pr.Index, 10), mergePullRequestForm) - } - - // reload PR again - pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) - assert.False(t, pr.HasMerged) - assert.Empty(t, pr.MergedCommitID) - - // update commit status to success, then it should be merged automatically - baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) - require.NoError(t, err) - sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) - require.NoError(t, err) - masterCommitID, err := baseGitRepo.GetBranchCommitID("master") - require.NoError(t, err) - - branches, _, err := baseGitRepo.GetBranchNames(0, 100) - require.NoError(t, err) - assert.ElementsMatch(t, []string{"sub-home-md-img-check", "home-md-img-check", "pr-to-update", "branch2", "DefaultBranch", "develop", "feature/1", "master"}, branches) - baseGitRepo.Close() - defer func() { - testResetRepo(t, baseRepo.RepoPath(), "master", masterCommitID) - }() - - err = commitstatus_service.CreateCommitStatus(db.DefaultContext, baseRepo, user1, sha, &git_model.CommitStatus{ - State: api.CommitStatusSuccess, - TargetURL: "https://gitea.com", - Context: "gitea/actions", + unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) }) - require.NoError(t, err) +} - time.Sleep(2 * time.Second) +func TestPullAutoMergeAfterCommitStatusSucceedAndApproval(t *testing.T) { + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + // create a pull request + session := loginUser(t, "user1") + user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + forkedName := "repo1-2" + testRepoFork(t, session, "user2", "repo1", "user1", forkedName) + defer func() { + testDeleteRepository(t, session, "user1", forkedName) + }() + testEditFile(t, session, "user1", forkedName, "master", "README.md", "Hello, World (Edited)\n") + testPullCreate(t, session, "user1", forkedName, false, "master", "master", "Indexer notifier test pull") - // approve PR if necessary - if approval { - // reload PR again + baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user2", Name: "repo1"}) + forkedRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: "user1", Name: forkedName}) + pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ + BaseRepoID: baseRepo.ID, + BaseBranch: "master", + HeadRepoID: forkedRepo.ID, + HeadBranch: "master", + }) + + // add protected branch for commit status + csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + // Change master branch to protected + req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/edit", map[string]string{ + "_csrf": csrf, + "rule_name": "master", + "enable_push": "true", + "enable_status_check": "true", + "status_check_contexts": "gitea/actions", + "required_approvals": "1", + }) + session.MakeRequest(t, req, http.StatusSeeOther) + + // first time insert automerge record, return true + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") + require.NoError(t, err) + assert.True(t, scheduled) + + // second time insert automerge record, return false because it does exist + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") + require.Error(t, err) + assert.False(t, scheduled) + + // reload pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.False(t, pr.HasMerged) + assert.Empty(t, pr.MergedCommitID) + + // update commit status to success, then it should be merged automatically + baseGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, baseRepo) + require.NoError(t, err) + sha, err := baseGitRepo.GetRefCommitID(pr.GetGitRefName()) + require.NoError(t, err) + masterCommitID, err := baseGitRepo.GetBranchCommitID("master") + require.NoError(t, err) + baseGitRepo.Close() + defer func() { + testResetRepo(t, baseRepo.RepoPath(), "master", masterCommitID) + }() + + err = commitstatus_service.CreateCommitStatus(db.DefaultContext, baseRepo, user1, sha, &git_model.CommitStatus{ + State: api.CommitStatusSuccess, + TargetURL: "https://gitea.com", + Context: "gitea/actions", + }) + require.NoError(t, err) + + time.Sleep(2 * time.Second) + + // reload pr again pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) assert.False(t, pr.HasMerged) assert.Empty(t, pr.MergedCommitID) // approve the PR from non-author approveSession := loginUser(t, "user2") - req := NewRequest(t, "GET", fmt.Sprintf("/user2/repo1/pulls/%d", pr.Index)) + req = NewRequest(t, "GET", fmt.Sprintf("/user2/repo1/pulls/%d", pr.Index)) resp := approveSession.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) testSubmitReview(t, approveSession, htmlDoc.GetCSRF(), "user2", "repo1", strconv.Itoa(int(pr.Index)), sha, "approve", http.StatusOK) time.Sleep(2 * time.Second) - } - // reload PR again - pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) - assert.True(t, pr.HasMerged) - assert.NotEmpty(t, pr.MergedCommitID) + // realod pr again + pr = unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) + assert.True(t, pr.HasMerged) + assert.NotEmpty(t, pr.MergedCommitID) - unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) - - if deleteBranch { - // check if new branch got removed - forkedGitRepo, err := gitrepo.OpenRepository(db.DefaultContext, forkedRepo) - require.NoError(t, err) - _, err = forkedGitRepo.GetBranch(branchName) - require.Error(t, err) - assert.True(t, git.IsErrBranchNotExist(err)) - forkedGitRepo.Close() - } -} - -func TestPullAutoMergeAfterCommitStatusSucceed(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - for _, testCase := range []struct { - name string - forkName string - approval bool - deleteBranch bool - }{ - { - name: "TestPullAutoMergeAfterCommitStatusSucceed", - forkName: "repo1-1", - approval: false, - deleteBranch: false, - }, - { - name: "TestPullAutoMergeAfterCommitStatusSucceedWithBranchDeletion", - forkName: "repo1-2", - approval: false, - deleteBranch: true, - }, - { - name: "TestPullAutoMergeAfterCommitStatusSucceedAndApproval", - forkName: "repo1-3", - approval: true, - deleteBranch: false, - }, - { - name: "TestPullAutoMergeAfterCommitStatusSucceedAndApprovalWithBranchDeletion", - forkName: "repo1-4", - approval: true, - deleteBranch: true, - }, - } { - // perform all tests with API and web routes - for _, withAPI := range []bool{false, true} { - t.Run(testCase.name, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - protectedBranch := parameterProtectBranch{ - "enable_push": "true", - "enable_status_check": "true", - "status_check_contexts": "gitea/actions", - } - if testCase.approval { - protectedBranch["required_approvals"] = "1" - } - ctx := NewAPITestContext(t, "user2", "repo1", auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteUser) - doProtectBranch(ctx, "master", protectedBranch)(t) - - ctx = NewAPITestContext(t, "user1", "repo1", auth_model.AccessTokenScopeWriteRepository) - testPullAutoMergeAfterCommitStatusSucceed(t, ctx, testCase.forkName, testCase.approval, testCase.deleteBranch, withAPI) - }) - } - } + unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) }) } @@ -1105,12 +1094,12 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing. user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) // first time insert automerge record, return true - scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") require.NoError(t, err) assert.True(t, scheduled) // second time insert automerge record, return false because it does exist - scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") require.Error(t, err) assert.False(t, scheduled) diff --git a/tests/integration/pull_reopen_test.go b/tests/integration/pull_reopen_test.go index cf95f6b730..e510d59626 100644 --- a/tests/integration/pull_reopen_test.go +++ b/tests/integration/pull_reopen_test.go @@ -12,20 +12,20 @@ import ( "testing" "time" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - issues_model "forgejo.org/models/issues" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/translation" - gitea_context "forgejo.org/services/context" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + git_model "code.gitea.io/gitea/models/git" + issues_model "code.gitea.io/gitea/models/issues" + unit_model "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/git" + "code.gitea.io/gitea/modules/translation" + gitea_context "code.gitea.io/gitea/services/context" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/pull_request_task_test.go b/tests/integration/pull_request_task_test.go index 777aac08a5..4366d97c39 100644 --- a/tests/integration/pull_request_task_test.go +++ b/tests/integration/pull_request_task_test.go @@ -4,22 +4,23 @@ package integration import ( + "context" "testing" "time" - "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/git" - "forgejo.org/modules/log" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/test" - "forgejo.org/modules/timeutil" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + "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/git" + "code.gitea.io/gitea/modules/log" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/timeutil" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -99,7 +100,7 @@ func TestPullRequestSynchronized(t *testing.T) { logChecker.Filter("Updating PR").StopMark("TestPullRequest ") defer cleanup() - pull_service.TestPullRequest(t.Context(), owner, repo.ID, testCase.olderThan, "branch2", true, pull.HeadCommitID, pull.HeadCommitID) + pull_service.TestPullRequest(context.Background(), owner, repo.ID, testCase.olderThan, "branch2", true, pull.HeadCommitID, pull.HeadCommitID) logFiltered, logStopped := logChecker.Check(5 * time.Second) assert.True(t, logStopped) assert.Equal(t, testCase.expected, logFiltered[0]) diff --git a/tests/integration/pull_review_test.go b/tests/integration/pull_review_test.go index 4be493b196..fc3e9be4a0 100644 --- a/tests/integration/pull_review_test.go +++ b/tests/integration/pull_review_test.go @@ -1,11 +1,10 @@ // Copyright 2019 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration import ( - "fmt" + "context" "net/http" "net/http/httptest" "net/url" @@ -14,19 +13,18 @@ import ( "strings" "testing" - "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/gitrepo" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/test" - issue_service "forgejo.org/services/issue" - "forgejo.org/services/mailer" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/test" + issue_service "code.gitea.io/gitea/services/issue" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -65,74 +63,6 @@ func loadComment(t *testing.T, commentID string) *issues_model.Comment { return unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: id}) } -func TestPullView_SelfReviewNotification(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - user1Session := loginUser(t, "user1") - user2Session := loginUser(t, "user2") - - user1csrf := GetCSRF(t, user1Session, "/") - oldUser1NotificationCount := getUserNotificationCount(t, user1Session, user1csrf) - - user2csrf := GetCSRF(t, user2Session, "/") - oldUser2NotificationCount := getUserNotificationCount(t, user2Session, user2csrf) - - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "test_reviewer", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\n"), - }, - }) - defer f() - - // we need to add user1 as collaborator so it can be added as reviewer - err := repo_module.AddCollaborator(db.DefaultContext, repo, user1) - require.NoError(t, err) - - // create a new branch to prepare for pull request - _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ - NewBranch: "codeowner-basebranch", - Files: []*files_service.ChangeRepoFile{ - { - Operation: "update", - TreePath: "README.md", - ContentReader: strings.NewReader("# This is a new project\n"), - }, - }, - }) - require.NoError(t, err) - - // Create a pull request. - resp := testPullCreate(t, user2Session, "user2", "test_reviewer", false, repo.DefaultBranch, "codeowner-basebranch", "Test Pull Request") - prURL := test.RedirectURL(resp) - elem := strings.Split(prURL, "/") - assert.EqualValues(t, "pulls", elem[3]) - - req := NewRequest(t, http.MethodGet, prURL) - resp = MakeRequest(t, req, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - attributeFilter := fmt.Sprintf("[data-update-url='/%s/%s/issues/request_review']", user2.Name, repo.Name) - issueID, ok := doc.Find(attributeFilter).Attr("data-issue-id") - assert.True(t, ok, "doc must contain data-issue-id") - - user1csrf = GetCSRF(t, user1Session, "/") - testAssignReviewer(t, user1Session, user1csrf, user2.Name, repo.Name, issueID, "1", http.StatusOK) - - // both user notification should keep the same notification count since - // user2 added itself as reviewer. - user1csrf = GetCSRF(t, user1Session, "/") - notificationCount := getUserNotificationCount(t, user1Session, user1csrf) - assert.Equal(t, oldUser1NotificationCount, notificationCount) - - user2csrf = GetCSRF(t, user2Session, "/") - notificationCount = getUserNotificationCount(t, user2Session, user2csrf) - assert.Equal(t, oldUser2NotificationCount, notificationCount) - }) -} - func TestPullView_ResolveInvalidatedReviewComment(t *testing.T) { defer tests.PrepareTestEnv(t)() session := loginUser(t, "user1") @@ -179,7 +109,7 @@ func TestPullView_ResolveInvalidatedReviewComment(t *testing.T) { // (to invalidate it properly, one should push a commit which should trigger this logic, // in the meantime, use this quick-and-dirty trick) comment := loadComment(t, commentID) - require.NoError(t, issues_model.UpdateCommentInvalidate(t.Context(), &issues_model.Comment{ + require.NoError(t, issues_model.UpdateCommentInvalidate(context.Background(), &issues_model.Comment{ ID: comment.ID, Invalidated: true, })) @@ -241,7 +171,7 @@ func TestPullView_ResolveInvalidatedReviewComment(t *testing.T) { // (to invalidate it properly, one should push a commit which should trigger this logic, // in the meantime, use this quick-and-dirty trick) comment := loadComment(t, commentID) - require.NoError(t, issues_model.UpdateCommentInvalidate(t.Context(), &issues_model.Comment{ + require.NoError(t, issues_model.UpdateCommentInvalidate(context.Background(), &issues_model.Comment{ ID: comment.ID, Invalidated: true, })) @@ -353,20 +283,32 @@ func TestPullView_CodeOwner(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - repo, _, f := tests.CreateDeclarativeRepo(t, user2, "test_codeowner", nil, nil, []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "CODEOWNERS", - ContentReader: strings.NewReader("README.md @user5\n"), + // Create the repo. + repo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ + Name: "test_codeowner", + Readme: "Default", + AutoInit: true, + ObjectFormatName: git.Sha1ObjectFormat.Name(), + DefaultBranch: "master", + }) + require.NoError(t, err) + + // add CODEOWNERS to default branch + _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ + OldBranch: repo.DefaultBranch, + Files: []*files_service.ChangeRepoFile{ + { + Operation: "create", + TreePath: "CODEOWNERS", + ContentReader: strings.NewReader("README.md @user5\n"), + }, }, }) - defer f() + require.NoError(t, err) t.Run("First Pull Request", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // create a new branch to prepare for pull request - _, err := files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ + _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ NewBranch: "codeowner-basebranch", Files: []*files_service.ChangeRepoFile{ { @@ -386,7 +328,7 @@ func TestPullView_CodeOwner(t *testing.T) { unittest.AssertExistsIf(t, true, &issues_model.Review{IssueID: pr.IssueID, Type: issues_model.ReviewTypeRequest, ReviewerID: 5}) require.NoError(t, pr.LoadIssue(db.DefaultContext)) - err = issue_service.ChangeTitle(db.DefaultContext, pr.Issue, user2, "[WIP] Test Pull Request") + err := issue_service.ChangeTitle(db.DefaultContext, pr.Issue, user2, "[WIP] Test Pull Request") require.NoError(t, err) prUpdated1 := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: pr.ID}) require.NoError(t, prUpdated1.LoadIssue(db.DefaultContext)) @@ -400,7 +342,7 @@ func TestPullView_CodeOwner(t *testing.T) { }) // change the default branch CODEOWNERS file to change README.md's codeowner - _, err := files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ + _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ Files: []*files_service.ChangeRepoFile{ { Operation: "update", @@ -412,8 +354,6 @@ func TestPullView_CodeOwner(t *testing.T) { require.NoError(t, err) t.Run("Second Pull Request", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // create a new branch to prepare for pull request _, err = files_service.ChangeRepoFiles(db.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{ NewBranch: "codeowner-basebranch2", @@ -436,8 +376,6 @@ func TestPullView_CodeOwner(t *testing.T) { }) t.Run("Forked Repo Pull Request", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) forkedRepo, err := repo_service.ForkRepositoryAndUpdates(db.DefaultContext, user2, user5, repo_service.ForkRepoOptions{ BaseRepo: repo, @@ -490,8 +428,6 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { defer baseGitRepo.Close() t.Run("Submit approve/reject review on merged PR", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // Create a merged PR (made by user1) in the upstream repo1. testEditFile(t, user1Session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n") resp := testPullCreate(t, user1Session, "user1", "repo1", false, "master", "master", "This is a pull title") @@ -522,14 +458,12 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { }) t.Run("Submit approve/reject review on closed PR", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - // Created a closed PR (made by user1) in the upstream repo1. testEditFileToNewBranch(t, user1Session, "user1", "repo1", "master", "a-test-branch", "README.md", "Hello, World (Edited...again)\n") resp := testPullCreate(t, user1Session, "user1", "repo1", false, "master", "a-test-branch", "This is a pull title") elem := strings.Split(test.RedirectURL(resp), "/") assert.EqualValues(t, "pulls", elem[3]) - testIssueClose(t, user1Session, elem[1], elem[2], elem[4], true) + testIssueClose(t, user1Session, elem[1], elem[2], elem[4]) // Get the commit SHA pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ @@ -555,63 +489,6 @@ func TestPullView_GivenApproveOrRejectReviewOnClosedPR(t *testing.T) { }) } -func TestPullReviewInArchivedRepo(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - session := loginUser(t, "user2") - - // Open a PR - testEditFileToNewBranch(t, session, "user2", "repo1", "master", "for-pr", "README.md", "Hi!\n") - resp := testPullCreate(t, session, "user2", "repo1", true, "master", "for-pr", "PR title") - elem := strings.Split(test.RedirectURL(resp), "/") - - t.Run("Review box normally", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - // The "Finish review button" must be available - resp = session.MakeRequest(t, NewRequest(t, "GET", path.Join(elem[1], elem[2], "pulls", elem[4], "files")), http.StatusOK) - button := NewHTMLParser(t, resp.Body).Find("#review-box button") - assert.False(t, button.HasClass("disabled")) - }) - - t.Run("Review box in archived repo", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - // Archive the repo - resp = session.MakeRequest(t, NewRequestWithValues(t, "POST", path.Join(elem[1], elem[2], "settings"), map[string]string{ - "_csrf": GetCSRF(t, session, path.Join(elem[1], elem[2], "settings")), - "action": "archive", - }), http.StatusSeeOther) - - // The "Finish review button" must be disabled - resp = session.MakeRequest(t, NewRequest(t, "GET", path.Join(elem[1], elem[2], "pulls", elem[4], "files")), http.StatusOK) - button := NewHTMLParser(t, resp.Body).Find("#review-box button") - assert.True(t, button.HasClass("disabled")) - }) - }) -} - -func testNofiticationCount(t *testing.T, session *TestSession, csrf string, expectedSubmitStatus int) *httptest.ResponseRecorder { - options := map[string]string{ - "_csrf": csrf, - } - - req := NewRequestWithValues(t, "GET", "/", options) - return session.MakeRequest(t, req, expectedSubmitStatus) -} - -func testAssignReviewer(t *testing.T, session *TestSession, csrf, owner, repo, pullID, reviewer string, expectedSubmitStatus int) *httptest.ResponseRecorder { - options := map[string]string{ - "_csrf": csrf, - "action": "attach", - "issue_ids": pullID, - "id": reviewer, - } - - submitURL := path.Join(owner, repo, "issues", "request_review") - req := NewRequestWithValues(t, "POST", submitURL, options) - return session.MakeRequest(t, req, expectedSubmitStatus) -} - func testSubmitReview(t *testing.T, session *TestSession, csrf, owner, repo, pullNumber, commitID, reviewType string, expectedSubmitStatus int) *httptest.ResponseRecorder { options := map[string]string{ "_csrf": csrf, @@ -625,12 +502,8 @@ func testSubmitReview(t *testing.T, session *TestSession, csrf, owner, repo, pul return session.MakeRequest(t, req, expectedSubmitStatus) } -func testIssueClose(t *testing.T, session *TestSession, owner, repo, issueNumber string, isPull bool) *httptest.ResponseRecorder { - issueType := "issues" - if isPull { - issueType = "pulls" - } - req := NewRequest(t, "GET", path.Join(owner, repo, issueType, issueNumber)) +func testIssueClose(t *testing.T, session *TestSession, owner, repo, issueNumber string) *httptest.ResponseRecorder { + req := NewRequest(t, "GET", path.Join(owner, repo, "pulls", issueNumber)) resp := session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) @@ -644,121 +517,3 @@ func testIssueClose(t *testing.T, session *TestSession, owner, repo, issueNumber req = NewRequestWithValues(t, "POST", closeURL, options) return session.MakeRequest(t, req, http.StatusOK) } - -func getUserNotificationCount(t *testing.T, session *TestSession, csrf string) string { - resp := testNofiticationCount(t, session, csrf, http.StatusOK) - doc := NewHTMLParser(t, resp.Body) - return doc.Find(`.notification_count`).Text() -} - -func TestPullRequestReplyMail(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestPullRequestReplyMail")() - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user.Name) - - t.Run("Reply to pending review comment", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - called := false - defer test.MockVariableValue(&mailer.SendAsync, func(...*mailer.Message) { - called = true - })() - - review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{ID: 1002}, "type = 0") - - req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/2/files/reviews/comments", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/2"), - "origin": "diff", - "content": "Just a comment!", - "side": "proposed", - "line": "4", - "path": "README.md", - "reply": strconv.FormatInt(review.ID, 10), - }) - session.MakeRequest(t, req, http.StatusOK) - - assert.False(t, called) - unittest.AssertExistsIf(t, true, &issues_model.Comment{Content: "Just a comment!", ReviewID: review.ID, IssueID: 2}) - }) - - t.Run("Start a review", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - called := false - defer test.MockVariableValue(&mailer.SendAsync, func(msgs ...*mailer.Message) { - called = true - })() - - req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/2/files/reviews/comments", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/2"), - "origin": "diff", - "content": "Notification time 2!", - "side": "proposed", - "line": "2", - "path": "README.md", - }) - session.MakeRequest(t, req, http.StatusOK) - - assert.False(t, called) - unittest.AssertExistsIf(t, true, &issues_model.Comment{Content: "Notification time 2!", IssueID: 2}) - }) - - t.Run("Create a single comment", func(t *testing.T) { - t.Run("As a reply", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - called := false - defer test.MockVariableValue(&mailer.SendAsync, func(msgs ...*mailer.Message) { - assert.Len(t, msgs, 2) - assert.Equal(t, "user1@example.com", msgs[0].To) - assert.EqualValues(t, "Re: [user2/repo1] issue2 (PR #2)", msgs[0].Subject) - assert.Contains(t, msgs[0].Body, "Notification time!") - called = true - })() - - review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{ID: 1001, Type: issues_model.ReviewTypeComment}) - - req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/2/files/reviews/comments", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/2"), - "origin": "diff", - "content": "Notification time!", - "side": "proposed", - "line": "3", - "path": "README.md", - "reply": strconv.FormatInt(review.ID, 10), - }) - session.MakeRequest(t, req, http.StatusOK) - - assert.True(t, called) - unittest.AssertExistsIf(t, true, &issues_model.Comment{Content: "Notification time!", ReviewID: review.ID, IssueID: 2}) - }) - t.Run("On a new line", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - called := false - defer test.MockVariableValue(&mailer.SendAsync, func(msgs ...*mailer.Message) { - assert.Len(t, msgs, 2) - assert.Equal(t, "user1@example.com", msgs[0].To) - assert.EqualValues(t, "Re: [user2/repo1] issue2 (PR #2)", msgs[0].Subject) - assert.Contains(t, msgs[0].Body, "Notification time 2!") - called = true - })() - - req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/2/files/reviews/comments", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/2"), - "origin": "diff", - "content": "Notification time 2!", - "side": "proposed", - "line": "5", - "path": "README.md", - "single_review": "true", - }) - session.MakeRequest(t, req, http.StatusOK) - - assert.True(t, called) - unittest.AssertExistsIf(t, true, &issues_model.Comment{Content: "Notification time 2!", IssueID: 2}) - }) - }) -} diff --git a/tests/integration/pull_status_test.go b/tests/integration/pull_status_test.go index 1fdc871bb3..80eea34513 100644 --- a/tests/integration/pull_status_test.go +++ b/tests/integration/pull_status_test.go @@ -11,11 +11,11 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/pull_test.go b/tests/integration/pull_test.go index d5321f6ae5..10dbad2228 100644 --- a/tests/integration/pull_test.go +++ b/tests/integration/pull_test.go @@ -7,12 +7,12 @@ import ( "net/http" "testing" - "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/tests" + "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/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,7 +27,7 @@ func TestViewPulls(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) search := htmlDoc.doc.Find(".list-header-search > .search > .input > input") placeholder, _ := search.Attr("placeholder") - assert.Equal(t, "Search pulls…", placeholder) + assert.Equal(t, "Search pulls...", placeholder) } func TestPullManuallyMergeWarning(t *testing.T) { @@ -65,37 +65,3 @@ func TestPullManuallyMergeWarning(t *testing.T) { assert.NotContains(t, mergeInstructions, warningMessage) }) } - -func TestPullCombinedReviewRequest(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestPullCombinedReviewRequest")() - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user2") - - helper := func(t *testing.T, action, userID, expectedText string) { - t.Helper() - - req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/request_review", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/3"), - "issue_ids": "3", - "action": action, - "id": userID, - }) - session.MakeRequest(t, req, http.StatusOK) - - req = NewRequest(t, "GET", "/user2/repo1/pulls/3") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - assert.Contains(t, htmlDoc.Find(".timeline-item:has(.review-request-list)").Last().Text(), expectedText) - } - - helper(t, "detach", "2", "refused to review") - helper(t, "attach", "4", "requested reviews from user4 and removed review requests for user2") - helper(t, "attach", "9", "requested reviews from user4, user9 and removed review requests for user2") - helper(t, "attach", "2", "requested reviews from user4, user9") - helper(t, "detach", "4", "requested review from user9") - helper(t, "detach", "11", "requested reviews from user9 and removed review requests for user11") - helper(t, "detach", "9", "removed review request for user11") - helper(t, "detach", "2", "removed review requests for user11, user2") -} diff --git a/tests/integration/pull_update_test.go b/tests/integration/pull_update_test.go index e1fec8c77e..08041f0717 100644 --- a/tests/integration/pull_update_test.go +++ b/tests/integration/pull_update_test.go @@ -4,26 +4,22 @@ package integration import ( - "fmt" "net/http" "net/url" "strings" "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - pull_service "forgejo.org/services/pull" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "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/git" + pull_service "code.gitea.io/gitea/services/pull" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -87,102 +83,6 @@ func TestAPIPullUpdateByRebase(t *testing.T) { }) } -func TestAPIViewUpdateSettings(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - defer tests.PrepareTestEnv(t)() - // Create PR to test - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26}) - pr := createOutdatedPR(t, user, org26) - - // Test GetDiverging - diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr) - require.NoError(t, err) - assert.EqualValues(t, 1, diffCount.Behind) - assert.EqualValues(t, 1, diffCount.Ahead) - require.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) - require.NoError(t, pr.LoadIssue(db.DefaultContext)) - - session := loginUser(t, "user2") - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeAll) - - defaultUpdateStyle := "rebase" - editOption := api.EditRepoOption{ - DefaultUpdateStyle: &defaultUpdateStyle, - } - - req := NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", pr.BaseRepo.OwnerName, pr.BaseRepo.Name), editOption).AddTokenAuth(token) - session.MakeRequest(t, req, http.StatusOK) - assertViewPullUpdate(t, pr, session, "rebase", true) - - defaultUpdateStyle = "merge" - req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/repos/%s/%s", pr.BaseRepo.OwnerName, pr.BaseRepo.Name), editOption).AddTokenAuth(token) - session.MakeRequest(t, req, http.StatusOK) - assertViewPullUpdate(t, pr, session, "merge", true) - }) -} - -func TestViewPullUpdateByMerge(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - testViewPullUpdate(t, "merge") - }) -} - -func TestViewPullUpdateByRebase(t *testing.T) { - onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { - testViewPullUpdate(t, "rebase") - }) -} - -func testViewPullUpdate(t *testing.T, updateStyle string) { - defer test.MockVariableValue(&setting.Repository.PullRequest.DefaultUpdateStyle, updateStyle)() - defer tests.PrepareTestEnv(t)() - // Create PR to test - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26}) - pr := createOutdatedPR(t, user, org26) - - // Test GetDiverging - diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr) - require.NoError(t, err) - assert.EqualValues(t, 1, diffCount.Behind) - assert.EqualValues(t, 1, diffCount.Ahead) - require.NoError(t, pr.LoadBaseRepo(db.DefaultContext)) - require.NoError(t, pr.LoadIssue(db.DefaultContext)) - - session := loginUser(t, "user2") - assertViewPullUpdate(t, pr, session, updateStyle, true) -} - -func assertViewPullUpdate(t *testing.T, pr *issues_model.PullRequest, session *TestSession, expectedStyle string, dropdownExpected bool) { - req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/pulls/%d", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index)) - resp := session.MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - // Verify that URL of the update button is shown correctly. - var mainExpectedURL string - mergeExpectedURL := fmt.Sprintf("/%s/%s/pulls/%d/update?style=merge", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index) - rebaseExpectedURL := fmt.Sprintf("/%s/%s/pulls/%d/update?style=rebase", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index) - if expectedStyle == "rebase" { - mainExpectedURL = rebaseExpectedURL - if dropdownExpected { - htmlDoc.AssertElement(t, fmt.Sprintf(".update-button .dropdown .menu .item[data-do=\"%s\"]:not(.active.selected)", mergeExpectedURL), true) - htmlDoc.AssertElement(t, fmt.Sprintf(".update-button .dropdown .menu .active.selected.item[data-do=\"%s\"]", rebaseExpectedURL), true) - } - } else { - mainExpectedURL = mergeExpectedURL - if dropdownExpected { - htmlDoc.AssertElement(t, fmt.Sprintf(".update-button .dropdown .menu .active.selected.item[data-do=\"%s\"]", mergeExpectedURL), true) - htmlDoc.AssertElement(t, fmt.Sprintf(".update-button .dropdown .menu .item[data-do=\"%s\"]:not(.active.selected)", rebaseExpectedURL), true) - } - } - if dropdownExpected { - htmlDoc.AssertElement(t, fmt.Sprintf(".update-button .button[data-do=\"%s\"]", mainExpectedURL), true) - } else { - htmlDoc.AssertElement(t, fmt.Sprintf("form[action=\"%s\"]", mainExpectedURL), true) - } -} - func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest { baseRepo, _, _ := tests.CreateDeclarativeRepo(t, actor, "repo-pr-update", nil, nil, nil) @@ -273,19 +173,3 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_mod return issue.PullRequest } - -func TestStatusDuringUpdate(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - session := loginUser(t, "user2") - - // Adjust this pull request to be in the conflict checker and having a head - // branch that is pointing to the an incorrect commit ID. - _, err := db.GetEngine(t.Context()).Cols("status", "head_branch").Update(&issues_model.PullRequest{ID: 5, Status: issues_model.PullRequestStatusChecking, HeadBranch: "master"}) - require.NoError(t, err) - - resp := session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/pulls/5"), http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - assert.Contains(t, htmlDoc.Find(".merge-section .item").Text(), "Merge conflict checking is in progress. Try again in few moments.") - }) -} diff --git a/tests/integration/quota_use_test.go b/tests/integration/quota_use_test.go index 314dcff6e9..39c5c1ae5c 100644 --- a/tests/integration/quota_use_test.go +++ b/tests/integration/quota_use_test.go @@ -14,20 +14,20 @@ import ( "strings" "testing" - "forgejo.org/models/db" - org_model "forgejo.org/models/organization" - quota_model "forgejo.org/models/quota" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - forgejo_context "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + org_model "code.gitea.io/gitea/models/organization" + quota_model "code.gitea.io/gitea/models/quota" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + forgejo_context "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" gouuid "github.com/google/uuid" "github.com/stretchr/testify/assert" diff --git a/tests/integration/release_feed_test.go b/tests/integration/release_feed_test.go deleted file mode 100644 index 0ab299f617..0000000000 --- a/tests/integration/release_feed_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "regexp" - "testing" - - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestReleaseFeed(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - normalize := func(body string) string { - // Remove port. - body = regexp.MustCompile(`localhost:\d+`).ReplaceAllString(body, "localhost") - // date is timezone dependent. - body = regexp.MustCompile(`.*`).ReplaceAllString(body, "") - body = regexp.MustCompile(`.*`).ReplaceAllString(body, "") - return body - } - t.Run("RSS feed", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.rss"), http.StatusOK) - assert.EqualValues(t, ` - - Releases for user2/repo1 - http://localhost/user2/repo1/release - - - - pre-release - http://localhost/user2/repo1/releases/tag/v1.0 - - some text for a pre release

    -]]>
    - user2 - 5: http://localhost/user2/repo1/releases/tag/v1.0 - -
    - - testing-release - http://localhost/user2/repo1/releases/tag/v1.1 - - user2 - 1: http://localhost/user2/repo1/releases/tag/v1.1 - - -
    -
    `, normalize(resp.Body.String())) - }) - - t.Run("Atom feed", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - resp := MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/releases.atom"), http.StatusOK) - assert.EqualValues(t, ` - Releases for user2/repo1 - http://localhost/user2/repo1/release - - - - pre-release - - 5: http://localhost/user2/repo1/releases/tag/v1.0 - <p dir="auto">some text for a pre release</p> - - - user2 - user2@noreply.example.org - - - - testing-release - - 1: http://localhost/user2/repo1/releases/tag/v1.1 - - - user2 - user2@noreply.example.org - - -`, normalize(resp.Body.String())) - }) -} diff --git a/tests/integration/release_test.go b/tests/integration/release_test.go index b1162780ab..48c2b37c91 100644 --- a/tests/integration/release_test.go +++ b/tests/integration/release_test.go @@ -11,15 +11,15 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - "forgejo.org/tests" + 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/unittest" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -272,35 +272,6 @@ func TestViewReleaseListLogin(t *testing.T) { }, links) } -func TestViewReleaseListKeyword(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - - link := repo.Link() + "/releases?q=testing" - - session := loginUser(t, "user1") - req := NewRequest(t, "GET", link) - rsp := session.MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, rsp.Body) - releases := htmlDoc.Find("#release-list li.ui.grid") - assert.Equal(t, 1, releases.Length()) - - links := make([]string, 0, 5) - releases.Each(func(i int, s *goquery.Selection) { - link, exist := s.Find(".release-list-title a").Attr("href") - if !exist { - return - } - links = append(links, link) - }) - - assert.EqualValues(t, []string{ - "/user2/repo1/releases/tag/v1.1", - }, links) -} - func TestReleaseOnCommit(t *testing.T) { defer tests.PrepareTestEnv(t)() diff --git a/tests/integration/remote_test.go b/tests/integration/remote_test.go index 506ee8ecaa..c59b4c7d32 100644 --- a/tests/integration/remote_test.go +++ b/tests/integration/remote_test.go @@ -4,16 +4,17 @@ package integration import ( + "context" "fmt" "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/test" - remote_service "forgejo.org/services/remote" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/test" + remote_service "code.gitea.io/gitea/services/remote" + "code.gitea.io/gitea/tests" "github.com/markbates/goth" "github.com/stretchr/testify/assert" @@ -47,7 +48,7 @@ func TestRemote_MaybePromoteUserSuccess(t *testing.T) { LoginSource: remote.ID, LoginName: gitlabUserID, } - defer createUser(t.Context(), t, userBeforeSignIn)() + defer createUser(context.Background(), t, userBeforeSignIn)() // // A request for user information sent to Goth will return a @@ -80,7 +81,7 @@ func TestRemote_MaybePromoteUserSuccess(t *testing.T) { func TestRemote_MaybePromoteUserFail(t *testing.T) { defer tests.PrepareTestEnv(t)() - ctx := t.Context() + ctx := context.Background() // // OAuth2 authentication source GitLab // @@ -125,7 +126,7 @@ func TestRemote_MaybePromoteUserFail(t *testing.T) { LoginName: remoteUserID, Email: "some@example.com", } - defer createUser(t.Context(), t, remoteUser)() + defer createUser(context.Background(), t, remoteUser)() promoted, reason, err := remote_service.MaybePromoteRemoteUser(ctx, gitlabSource, remoteUserID, "") require.NoError(t, err) assert.False(t, promoted) @@ -142,7 +143,7 @@ func TestRemote_MaybePromoteUserFail(t *testing.T) { LoginSource: nonexistentloginsource, LoginName: remoteUserID, } - defer createUser(t.Context(), t, remoteUser)() + defer createUser(context.Background(), t, remoteUser)() promoted, reason, err := remote_service.MaybePromoteRemoteUser(ctx, gitlabSource, remoteUserID, "") require.NoError(t, err) assert.False(t, promoted) @@ -158,7 +159,7 @@ func TestRemote_MaybePromoteUserFail(t *testing.T) { LoginSource: gitlabSource.ID, LoginName: remoteUserID, } - defer createUser(t.Context(), t, remoteUser)() + defer createUser(context.Background(), t, remoteUser)() promoted, reason, err := remote_service.MaybePromoteRemoteUser(ctx, gitlabSource, remoteUserID, "") require.NoError(t, err) assert.False(t, promoted) @@ -179,7 +180,7 @@ func TestRemote_MaybePromoteUserFail(t *testing.T) { LoginSource: remoteSource.ID, LoginName: remoteUserID, } - defer createUser(t.Context(), t, remoteUser)() + defer createUser(context.Background(), t, remoteUser)() promoted, reason, err := remote_service.MaybePromoteRemoteUser(ctx, unrelatedSource, remoteUserID, remoteEmail) require.NoError(t, err) assert.False(t, promoted) @@ -196,7 +197,7 @@ func TestRemote_MaybePromoteUserFail(t *testing.T) { LoginSource: remoteSource.ID, LoginName: remoteUserID, } - defer createUser(t.Context(), t, remoteUser)() + defer createUser(context.Background(), t, remoteUser)() promoted, reason, err := remote_service.MaybePromoteRemoteUser(ctx, gitlabSource, remoteUserID, remoteEmail) require.NoError(t, err) assert.True(t, promoted) diff --git a/tests/integration/rename_branch_test.go b/tests/integration/rename_branch_test.go index d7440e5125..a96cbf5623 100644 --- a/tests/integration/rename_branch_test.go +++ b/tests/integration/rename_branch_test.go @@ -8,11 +8,11 @@ import ( "net/url" "testing" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - gitea_context "forgejo.org/services/context" - "forgejo.org/tests" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -22,6 +22,8 @@ func TestRenameBranch(t *testing.T) { } func testRenameBranch(t *testing.T, u *url.URL) { + defer tests.PrepareTestEnv(t)() + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) unittest.AssertExistsAndLoadBean(t, &git_model.Branch{RepoID: repo.ID, Name: "master"}) diff --git a/tests/integration/repo_activity_test.go b/tests/integration/repo_activity_test.go index 6199373119..c1177fac11 100644 --- a/tests/integration/repo_activity_test.go +++ b/tests/integration/repo_activity_test.go @@ -11,15 +11,15 @@ import ( "strings" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/test" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/test" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" diff --git a/tests/integration/repo_archive_test.go b/tests/integration/repo_archive_test.go index f0ffedfd9b..75fe78eeed 100644 --- a/tests/integration/repo_archive_test.go +++ b/tests/integration/repo_archive_test.go @@ -1,26 +1,18 @@ // Copyright 2024 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration import ( - "archive/tar" - "compress/gzip" - "fmt" "io" "net/http" - "net/url" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/routers/web" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/routers/web" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -39,53 +31,4 @@ func TestRepoDownloadArchive(t *testing.T) { require.NoError(t, err) assert.Empty(t, resp.Header().Get("Content-Encoding")) assert.Len(t, bs, 320) - - // Verify that unrecognized archive type returns 404 - req = NewRequest(t, "GET", "/user2/repo1/archive/master.invalid") - MakeRequest(t, req, http.StatusNotFound) -} - -func TestRepoDownloadArchiveSubdir(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - defer test.MockVariableValue(&setting.EnableGzip, true)() - defer test.MockVariableValue(&web.GzipMinSize, 10)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - - // Create a subdirectory - err := createOrReplaceFileInBranch(user, repo, "subdir/test.txt", "master", "Test") - require.NoError(t, err) - - t.Run("Frontend", func(t *testing.T) { - resp := MakeRequest(t, NewRequestf(t, "GET", "/%s/src/branch/master/subdir", repo.FullName()), http.StatusOK) - page := NewHTMLParser(t, resp.Body) - - page.AssertElement(t, fmt.Sprintf(".folder-actions a.archive-link[href='/%s/archive/master:subdir.zip'][type='application/zip']", repo.FullName()), true) - page.AssertElement(t, fmt.Sprintf(".folder-actions a.archive-link[href='/%s/archive/master:subdir.tar.gz'][type='application/gzip']", repo.FullName()), true) - }) - - t.Run("Backend", func(t *testing.T) { - resp := MakeRequest(t, NewRequestf(t, "GET", "/%s/archive/master:subdir.tar.gz", repo.FullName()), http.StatusOK) - - uncompressedStream, err := gzip.NewReader(resp.Body) - require.NoError(t, err) - - tarReader := tar.NewReader(uncompressedStream) - - header, err := tarReader.Next() - require.NoError(t, err) - assert.Equal(t, tar.TypeDir, int32(header.Typeflag)) - assert.Equal(t, fmt.Sprintf("%s/", repo.Name), header.Name) - - header, err = tarReader.Next() - require.NoError(t, err) - assert.Equal(t, tar.TypeReg, int32(header.Typeflag)) - assert.Equal(t, fmt.Sprintf("%s/test.txt", repo.Name), header.Name) - - _, err = tarReader.Next() - assert.Equal(t, io.EOF, err) - }) - }) } diff --git a/tests/integration/repo_archive_text_test.go b/tests/integration/repo_archive_text_test.go index db133ce7d7..e759246aa4 100644 --- a/tests/integration/repo_archive_text_test.go +++ b/tests/integration/repo_archive_text_test.go @@ -10,10 +10,10 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/translation" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go index baaa8c136a..a74d3979c2 100644 --- a/tests/integration/repo_badges_test.go +++ b/tests/integration/repo_badges_test.go @@ -12,19 +12,19 @@ import ( "strings" "testing" - actions_model "forgejo.org/models/actions" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/services/release" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + actions_model "code.gitea.io/gitea/models/actions" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/services/release" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/repo_branch_test.go b/tests/integration/repo_branch_test.go index 3cb6e42c89..df9ea9a97c 100644 --- a/tests/integration/repo_branch_test.go +++ b/tests/integration/repo_branch_test.go @@ -12,16 +12,16 @@ import ( "strings" "testing" - "forgejo.org/models/db" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/git" - "forgejo.org/modules/graceful" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + "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" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -204,28 +204,3 @@ func TestDatabaseMissingABranch(t *testing.T) { assert.Equal(t, firstBranchCount-1, secondBranchCount) }) } - -func TestCreateBranchButtonVisibility(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - session := loginUser(t, "user1") - - t.Run("Check create branch button", func(t *testing.T) { - t.Run("Normal repository", func(t *testing.T) { - repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - - // Check that the button is present - resp := session.MakeRequest(t, NewRequest(t, "GET", "/"+repo1.FullName()+"/branches"), http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - assert.Positive(t, htmlDoc.doc.Find(".show-create-branch-modal").Length()) - }) - t.Run("Mirrored repository", func(t *testing.T) { - repo5 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 5}) - - // Check that the button is NOT present - resp := session.MakeRequest(t, NewRequest(t, "GET", "/"+repo5.FullName()+"/branches"), http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - assert.Equal(t, 0, htmlDoc.doc.Find(".show-create-branch-modal").Length()) - }) - }) - }) -} diff --git a/tests/integration/repo_citation_test.go b/tests/integration/repo_citation_test.go index 5651ac3db3..4f7e24ee51 100644 --- a/tests/integration/repo_citation_test.go +++ b/tests/integration/repo_citation_test.go @@ -9,12 +9,12 @@ import ( "strings" "testing" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_collaborator_test.go b/tests/integration/repo_collaborator_test.go index e18308e7cb..beeb950f5a 100644 --- a/tests/integration/repo_collaborator_test.go +++ b/tests/integration/repo_collaborator_test.go @@ -5,33 +5,33 @@ package integration import ( "net/http" + "net/url" "strings" "testing" - "forgejo.org/tests" - "github.com/stretchr/testify/assert" ) // TestRepoCollaborators is a test for contents of Collaborators tab in the repo settings // It only covers a few elements and can be extended as needed func TestRepoCollaborators(t *testing.T) { - defer tests.PrepareTestEnv(t)() - session := loginUser(t, "user2") + onGiteaRun(t, func(t *testing.T, u *url.URL) { + session := loginUser(t, "user2") - // Visit Collaborators tab of repo settings - response := session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/settings/collaboration"), http.StatusOK) - page := NewHTMLParser(t, response.Body).Find(".repo-setting-content") + // Visit Collaborators tab of repo settings + response := session.MakeRequest(t, NewRequest(t, "GET", "/user2/repo1/settings/collaboration"), http.StatusOK) + page := NewHTMLParser(t, response.Body).Find(".repo-setting-content") - // Veirfy header - assert.EqualValues(t, "Collaborators", strings.TrimSpace(page.Find("h4").Text())) + // Veirfy header + assert.EqualValues(t, "Collaborators", strings.TrimSpace(page.Find("h4").Text())) - // Veirfy button text - page = page.Find("#repo-collab-form") - assert.EqualValues(t, "Add collaborator", strings.TrimSpace(page.Find("button.primary").Text())) + // Veirfy button text + page = page.Find("#repo-collab-form") + assert.EqualValues(t, "Add collaborator", strings.TrimSpace(page.Find("button.primary").Text())) - // Veirfy placeholder - placeholder, exists := page.Find("#search-user-box input").Attr("placeholder") - assert.True(t, exists) - assert.EqualValues(t, "Search users…", placeholder) + // Veirfy placeholder + placeholder, exists := page.Find("#search-user-box input").Attr("placeholder") + assert.True(t, exists) + assert.EqualValues(t, "Search users...", placeholder) + }) } diff --git a/tests/integration/repo_commits_search_test.go b/tests/integration/repo_commits_search_test.go index 92ff74ba68..74ac25c0f5 100644 --- a/tests/integration/repo_commits_search_test.go +++ b/tests/integration/repo_commits_search_test.go @@ -9,7 +9,7 @@ import ( "strings" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_commits_test.go b/tests/integration/repo_commits_test.go index f3d3a145ae..e399898958 100644 --- a/tests/integration/repo_commits_test.go +++ b/tests/integration/repo_commits_test.go @@ -11,11 +11,11 @@ import ( "sync" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/json" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/repo_delete_test.go b/tests/integration/repo_delete_test.go index faabd13432..44ef26f19a 100644 --- a/tests/integration/repo_delete_test.go +++ b/tests/integration/repo_delete_test.go @@ -6,13 +6,13 @@ package integration import ( "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - repo_service "forgejo.org/services/repository" + "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" + webhook_model "code.gitea.io/gitea/models/webhook" + repo_service "code.gitea.io/gitea/services/repository" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/repo_flags_test.go b/tests/integration/repo_flags_test.go index c52610cd10..8b64776a5a 100644 --- a/tests/integration/repo_flags_test.go +++ b/tests/integration/repo_flags_test.go @@ -10,16 +10,16 @@ import ( "slices" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + 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/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_fork_test.go b/tests/integration/repo_fork_test.go index 03bbba1b2c..b2e40671ba 100644 --- a/tests/integration/repo_fork_test.go +++ b/tests/integration/repo_fork_test.go @@ -12,16 +12,16 @@ import ( "strings" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - repo_service "forgejo.org/services/repository" - "forgejo.org/tests" + "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" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + repo_service "code.gitea.io/gitea/services/repository" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -249,7 +249,7 @@ func TestForkListPrivateRepo(t *testing.T) { testRepoFork(t, session, "user2", "repo1", org23.Name, "repo1") - t.Run("Anonymous", func(t *testing.T) { + t.Run("Anomynous", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user2/repo1/forks") diff --git a/tests/integration/repo_generate_test.go b/tests/integration/repo_generate_test.go index fd29156e4e..c475c92eef 100644 --- a/tests/integration/repo_generate_test.go +++ b/tests/integration/repo_generate_test.go @@ -7,20 +7,15 @@ package integration import ( "fmt" "net/http" - "net/url" "strconv" "strings" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -43,7 +38,7 @@ func assertRepoCreateForm(t *testing.T, htmlDoc *HTMLDoc, owner *user_model.User // the template menu is loaded client-side, so don't assert the option exists assert.Equal(t, templateID, htmlDoc.GetInputValueByName("repo_template"), "Unexpected repo_template selection") - for _, name := range []string{"issue_labels", "gitignores", "license", "object_format_name"} { + for _, name := range []string{"issue_labels", "gitignores", "license", "readme", "object_format_name"} { htmlDoc.AssertDropdownHasOptions(t, name) } } @@ -79,14 +74,10 @@ func testRepoGenerate(t *testing.T, session *TestSession, templateID, templateOw // Step4: check the existence of the generated repo req = NewRequestf(t, "GET", "/%s/%s", generateOwner.Name, generateRepoName) session.MakeRequest(t, req, http.StatusOK) -} -func testRepoGenerateWithFixture(t *testing.T, session *TestSession, templateID, templateOwnerName, templateRepoName string, user, generateOwner *user_model.User, generateRepoName string) { - testRepoGenerate(t, session, templateID, templateOwnerName, templateRepoName, user, generateOwner, generateRepoName) - - // check substituted values in Readme - req := NewRequestf(t, "GET", "/%s/%s/raw/branch/master/README.md", generateOwner.Name, generateRepoName) - resp := session.MakeRequest(t, req, http.StatusOK) + // Step5: check substituted values in Readme + req = NewRequestf(t, "GET", "/%s/%s/raw/branch/master/README.md", generateOwner.Name, generateRepoName) + resp = session.MakeRequest(t, req, http.StatusOK) body := fmt.Sprintf(`# %s Readme Owner: %s Link: /%s/%s @@ -132,7 +123,7 @@ func TestRepoGenerate(t *testing.T) { session := loginUser(t, userName) user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: userName}) - testRepoGenerateWithFixture(t, session, "44", "user27", "template1", user, user, "generated1") + testRepoGenerate(t, session, "44", "user27", "template1", user, user, "generated1") } func TestRepoGenerateToOrg(t *testing.T) { @@ -142,84 +133,5 @@ func TestRepoGenerateToOrg(t *testing.T) { user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: userName}) org := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "org3"}) - testRepoGenerateWithFixture(t, session, "44", "user27", "template1", user, org, "generated2") -} - -func TestRepoCreateFormTrimSpace(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - session := loginUser(t, user.Name) - - req := NewRequestWithValues(t, "POST", "/repo/create", map[string]string{ - "_csrf": GetCSRF(t, session, "/repo/create"), - "uid": "2", - "repo_name": " spaced-name ", - }) - resp := session.MakeRequest(t, req, http.StatusSeeOther) - - assert.EqualValues(t, "/user2/spaced-name", test.RedirectURL(resp)) - unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerID: 2, Name: "spaced-name"}) -} - -func TestRepoGenerateTemplating(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - input := `# $REPO_NAME - This is a Repo By $REPO_OWNER - ThisIsThe${REPO_NAME}InAnInlineWay` - expected := `# %s - This is a Repo By %s - ThisIsThe%sInAnInlineWay` - templateName := "my_template" - generatedName := "my_generated" - - userName := "user1" - session := loginUser(t, userName) - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: userName}) - - template, _, f := tests.CreateDeclarativeRepoWithOptions(t, user, tests.DeclarativeRepoOptions{ - Name: optional.Some(templateName), - IsTemplate: optional.Some(true), - Files: optional.Some([]*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: ".forgejo/template", - ContentReader: strings.NewReader("Readme.md"), - }, - { - Operation: "create", - TreePath: "Readme.md", - ContentReader: strings.NewReader(input), - }, - }), - }) - defer f() - - // The repo.TemplateID field is not initialized. Luckily, the ID field holds the expected value - templateID := strconv.FormatInt(template.ID, 10) - - testRepoGenerate( - t, - session, - templateID, - user.Name, - templateName, - user, - user, - generatedName, - ) - - req := NewRequestf( - t, - "GET", "/%s/%s/raw/branch/%s/Readme.md", - user.Name, - generatedName, - template.DefaultBranch, - ) - resp := session.MakeRequest(t, req, http.StatusOK) - body := fmt.Sprintf(expected, - generatedName, - user.Name, - generatedName) - assert.Equal(t, body, resp.Body.String()) - }) + testRepoGenerate(t, session, "44", "user27", "template1", user, org, "generated2") } diff --git a/tests/integration/repo_git_note_test.go b/tests/integration/repo_git_note_test.go deleted file mode 100644 index e6b23754db..0000000000 --- a/tests/integration/repo_git_note_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package integration - -import ( - "net/http" - "net/url" - "testing" - - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestRepoModifyGitNotes(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - session := loginUser(t, "user2") - - req := NewRequest(t, "GET", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d") - resp := MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "
    This is a test note\n
    ") - assert.Contains(t, resp.Body.String(), "commit-notes-display-area") - - t.Run("Set", func(t *testing.T) { - req = NewRequestWithValues(t, "POST", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d/notes", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1"), - "notes": "This is a new note", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - req = NewRequest(t, "GET", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d") - resp = MakeRequest(t, req, http.StatusOK) - assert.Contains(t, resp.Body.String(), "
    This is a new note\n
    ") - assert.Contains(t, resp.Body.String(), "commit-notes-display-area") - }) - - t.Run("Delete", func(t *testing.T) { - req = NewRequestWithValues(t, "POST", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d/notes/remove", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1"), - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - req = NewRequest(t, "GET", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d") - resp = MakeRequest(t, req, http.StatusOK) - assert.NotContains(t, resp.Body.String(), "commit-notes-display-area") - }) - }) -} - -func TestRepoGitNotesButtonsVisible(t *testing.T) { - onGiteaRun(t, func(*testing.T, *url.URL) { - t.Run("With Permission", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - session := loginUser(t, "user2") - - req := NewRequest(t, "GET", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d") - resp := session.MakeRequest(t, req, http.StatusOK) - - assert.Contains(t, resp.Body.String(), "id=\"commit-notes-edit-button\"") - assert.Contains(t, resp.Body.String(), "data-modal=\"#delete-note-modal\"") - }) - - t.Run("Without Permission", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d") - resp := MakeRequest(t, req, http.StatusOK) - - assert.NotContains(t, resp.Body.String(), "id=\"commit-notes-edit-button\"") - assert.NotContains(t, resp.Body.String(), "data-modal=\"#delete-note-modal\"") - }) - }) -} diff --git a/tests/integration/repo_issue_title_test.go b/tests/integration/repo_issue_title_test.go index 587db43223..5199be91bc 100644 --- a/tests/integration/repo_issue_title_test.go +++ b/tests/integration/repo_issue_title_test.go @@ -10,16 +10,16 @@ import ( "testing" "time" - "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/git" - issue_service "forgejo.org/services/issue" - pull_service "forgejo.org/services/pull" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "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/git" + issue_service "code.gitea.io/gitea/services/issue" + pull_service "code.gitea.io/gitea/services/pull" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -39,7 +39,7 @@ func TestIssueTitles(t *testing.T) { titleHTML := []string{ "Title", - `ðŸ‘`, + `ðŸ‘`, `code`, } diff --git a/tests/integration/repo_mergecommit_revert_test.go b/tests/integration/repo_mergecommit_revert_test.go index 600ee991f8..eb75d45c15 100644 --- a/tests/integration/repo_mergecommit_revert_test.go +++ b/tests/integration/repo_mergecommit_revert_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_migrate_test.go b/tests/integration/repo_migrate_test.go index 233a55ef8f..9fb7a73379 100644 --- a/tests/integration/repo_migrate_test.go +++ b/tests/integration/repo_migrate_test.go @@ -9,8 +9,8 @@ import ( "net/http/httptest" "testing" - "forgejo.org/modules/structs" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_migration_ui_test.go b/tests/integration/repo_migration_ui_test.go index 5e2f0c0a76..40688d4a60 100644 --- a/tests/integration/repo_migration_ui_test.go +++ b/tests/integration/repo_migration_ui_test.go @@ -5,26 +5,26 @@ package integration import ( "net/http" + "net/url" "testing" - "forgejo.org/tests" - "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) func TestRepoMigrationUI(t *testing.T) { - defer tests.PrepareTestEnv(t)() - sessionUser1 := loginUser(t, "user1") - // Nothing is tested in plain Git migration form right now - testRepoMigrationFormGitHub(t, sessionUser1) - testRepoMigrationFormGitea(t, sessionUser1) - testRepoMigrationFormGitLab(t, sessionUser1) - testRepoMigrationFormGogs(t, sessionUser1) - testRepoMigrationFormOneDev(t, sessionUser1) - testRepoMigrationFormGitBucket(t, sessionUser1) - testRepoMigrationFormCodebase(t, sessionUser1) - testRepoMigrationFormForgejo(t, sessionUser1) + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + sessionUser1 := loginUser(t, "user1") + // Nothing is tested in plain Git migration form right now + testRepoMigrationFormGitHub(t, sessionUser1) + testRepoMigrationFormGitea(t, sessionUser1) + testRepoMigrationFormGitLab(t, sessionUser1) + testRepoMigrationFormGogs(t, sessionUser1) + testRepoMigrationFormOneDev(t, sessionUser1) + testRepoMigrationFormGitBucket(t, sessionUser1) + testRepoMigrationFormCodebase(t, sessionUser1) + testRepoMigrationFormForgejo(t, sessionUser1) + }) } func testRepoMigrationFormGitHub(t *testing.T, session *TestSession) { diff --git a/tests/integration/repo_pagination_test.go b/tests/integration/repo_pagination_test.go index 692936353b..1c1f2ac82e 100644 --- a/tests/integration/repo_pagination_test.go +++ b/tests/integration/repo_pagination_test.go @@ -8,11 +8,11 @@ import ( "path" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/tests" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_search_test.go b/tests/integration/repo_search_test.go index 909668d3ca..c7a31f473b 100644 --- a/tests/integration/repo_search_test.go +++ b/tests/integration/repo_search_test.go @@ -7,13 +7,13 @@ import ( "net/http" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - code_indexer "forgejo.org/modules/indexer/code" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + code_indexer "code.gitea.io/gitea/modules/indexer/code" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -78,18 +78,26 @@ func testSearchRepo(t *testing.T, indexer bool) { code_indexer.UpdateRepoIndexer(repo) } - testSearch(t, "/user2/glob/search?q=", []string{}, indexer) testSearch(t, "/user2/glob/search?q=loren&page=1", []string{"a.txt"}, indexer) - testSearch(t, "/user2/glob/search?q=loren&page=1&mode=exact", []string{"a.txt"}, indexer) + testSearch(t, "/user2/glob/search?q=loren&page=1&fuzzy=false", []string{"a.txt"}, indexer) - // union search: Union/OR of all the keywords - testSearch(t, "/user2/glob/search?q=file3+file1&mode=union&page=1", []string{"a.txt", "x/b.txt"}, indexer) - testSearch(t, "/user2/glob/search?q=file4&mode=union&page=1", []string{}, indexer) - testSearch(t, "/user2/glob/search?q=file5&mode=union&page=1", []string{}, indexer) + if indexer { + // fuzzy search: matches both file3 (x/b.txt) and file1 (a.txt) + // when indexer is enabled + testSearch(t, "/user2/glob/search?q=file3&page=1", []string{"x/b.txt", "a.txt"}, indexer) + testSearch(t, "/user2/glob/search?q=file4&page=1", []string{"x/b.txt", "a.txt"}, indexer) + testSearch(t, "/user2/glob/search?q=file5&page=1", []string{"x/b.txt", "a.txt"}, indexer) + } else { + // fuzzy search: Union/OR of all the keywords + // when indexer is disabled + testSearch(t, "/user2/glob/search?q=file3+file1&page=1", []string{"a.txt", "x/b.txt"}, indexer) + testSearch(t, "/user2/glob/search?q=file4&page=1", []string{}, indexer) + testSearch(t, "/user2/glob/search?q=file5&page=1", []string{}, indexer) + } - testSearch(t, "/user2/glob/search?q=file3&page=1&mode=exact", []string{"x/b.txt"}, indexer) - testSearch(t, "/user2/glob/search?q=file4&page=1&mode=exact", []string{}, indexer) - testSearch(t, "/user2/glob/search?q=file5&page=1&mode=exact", []string{}, indexer) + testSearch(t, "/user2/glob/search?q=file3&page=1&fuzzy=false", []string{"x/b.txt"}, indexer) + testSearch(t, "/user2/glob/search?q=file4&page=1&fuzzy=false", []string{}, indexer) + testSearch(t, "/user2/glob/search?q=file5&page=1&fuzzy=false", []string{}, indexer) } func testSearch(t *testing.T, url string, expected []string, indexer bool) { @@ -99,24 +107,29 @@ func testSearch(t *testing.T, url string, expected []string, indexer bool) { doc := NewHTMLParser(t, resp.Body) container := doc.Find(".repository").Find(".ui.container") + grepMsg := container.Find(".ui.message[data-test-tag=grep]") + assert.EqualValues(t, indexer, len(grepMsg.Nodes) == 0) + branchDropdown := container.Find(".js-branch-tag-selector") assert.EqualValues(t, indexer, len(branchDropdown.Nodes) == 0) - dropdownOptions := container. - Find(".menu[data-test-tag=fuzzy-dropdown]"). - Find("input[type=radio][name=mode]"). - Map(func(_ int, sel *goquery.Selection) string { - attr, exists := sel.Attr("value") - assert.True(t, exists) - return attr - }) + // if indexer is disabled "fuzzy" should be displayed as "union" + expectedFuzzy := "Fuzzy" + if !indexer { + expectedFuzzy = "Union" + } - if indexer { - assert.EqualValues(t, []string{"exact", "union"}, dropdownOptions) - } else { - assert.EqualValues(t, []string{"exact", "union", "regexp"}, dropdownOptions) + fuzzyDropdown := container.Find(".ui.dropdown[data-test-tag=fuzzy-dropdown]") + actualFuzzyText := fuzzyDropdown.Find(".menu .item[data-value=true]").First().Text() + assert.EqualValues(t, expectedFuzzy, actualFuzzyText) + + if fuzzyDropdown. + Find("input[name=fuzzy][value=true]"). + Length() != 0 { + actualFuzzyText = fuzzyDropdown.Find("div.text").First().Text() + assert.EqualValues(t, expectedFuzzy, actualFuzzyText) } filenames := resultFilenames(t, doc) - assert.ElementsMatch(t, expected, filenames) + assert.EqualValues(t, expected, filenames) } diff --git a/tests/integration/repo_settings_hook_test.go b/tests/integration/repo_settings_hook_test.go index f7349d4e66..0a3dd57160 100644 --- a/tests/integration/repo_settings_hook_test.go +++ b/tests/integration/repo_settings_hook_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/repo_settings_test.go b/tests/integration/repo_settings_test.go index f78df96a93..ff138532f9 100644 --- a/tests/integration/repo_settings_test.go +++ b/tests/integration/repo_settings_test.go @@ -5,26 +5,27 @@ package integration import ( "fmt" + "io" "net/http" + "net/http/httptest" "strings" "testing" - "forgejo.org/models/db" - "forgejo.org/models/forgefed" - git_model "forgejo.org/models/git" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - fm "forgejo.org/modules/forgefed" - "forgejo.org/modules/optional" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/validation" - gitea_context "forgejo.org/services/context" - repo_service "forgejo.org/services/repository" - user_service "forgejo.org/services/user" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/forgefed" + git_model "code.gitea.io/gitea/models/git" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + fm "code.gitea.io/gitea/modules/forgefed" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/validation" + gitea_context "code.gitea.io/gitea/services/context" + repo_service "code.gitea.io/gitea/services/repository" + user_service "code.gitea.io/gitea/services/user" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -277,8 +278,59 @@ func TestRepoFollowing(t *testing.T) { setting.Federation.Enabled = false }() - mock := test.NewFederationServerMock() - federatedSrv := mock.DistantServer(t) + 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 + responseBody := fmt.Sprintf(`{"links":[{"href":"http://%s/api/v1/nodeinfo","rel":"http://nodeinfo.diaspora.software/ns/schema/2.1"}]}`, req.Host) + t.Logf("response: %s", responseBody) + // TODO: as soon as content-type will become important: content-type: application/json;charset=utf-8 + fmt.Fprint(res, responseBody) + }) + 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 + responseBody := fmt.Sprintf(`{"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":{}}`) + fmt.Fprint(res, responseBody) + }) + repo1InboxReceivedLike := false + federatedRoutes.HandleFunc("/api/v1/activitypub/repository-id/1/inbox/", + func(res http.ResponseWriter, req *http.Request) { + if req.Method != "POST" { + t.Errorf("Unhandled request: %q", req.URL.EscapedPath()) + } + buf := new(strings.Builder) + _, err := io.Copy(buf, req.Body) + if err != nil { + t.Errorf("Error reading body: %q", err) + } + like := fm.ForgeLike{} + err = like.UnmarshalJSON([]byte(buf.String())) + if err != nil { + t.Errorf("Error unmarshalling ForgeLike: %q", err) + } + if isValid, err := validation.IsValid(like); !isValid { + t.Errorf("ForgeLike is not valid: %q", err) + } + + activityType := like.Type + object := like.Object.GetLink().String() + isLikeType := activityType == "Like" + isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") + if !isLikeType || !isCorrectObject { + t.Errorf("Activity is not a like for this repo") + } + + repo1InboxReceivedLike = true + }) + federatedRoutes.HandleFunc("/", + func(res http.ResponseWriter, req *http.Request) { + t.Errorf("Unhandled request: %q", req.URL.EscapedPath()) + }) + federatedSrv := httptest.NewServer(federatedRoutes) defer federatedSrv.Close() user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) @@ -311,24 +363,8 @@ func TestRepoFollowing(t *testing.T) { req := NewRequestWithValues(t, "POST", link, map[string]string{ "_csrf": GetCSRF(t, session, repoLink), }) - + assert.False(t, repo1InboxReceivedLike) session.MakeRequest(t, req, http.StatusOK) - - // Verify distant server received a like activity - like := fm.ForgeLike{} - err := like.UnmarshalJSON([]byte(mock.LastPost)) - if err != nil { - t.Errorf("Error unmarshalling ForgeLike: %q", err) - } - if isValid, err := validation.IsValid(like); !isValid { - t.Errorf("ForgeLike is not valid: %q", err) - } - activityType := like.Type - object := like.Object.GetLink().String() - isLikeType := activityType == "Like" - isCorrectObject := strings.HasSuffix(object, "/api/v1/activitypub/repository-id/1") - if !isLikeType || !isCorrectObject { - t.Errorf("Activity is not a like for this repo") - } + assert.True(t, repo1InboxReceivedLike) }) } diff --git a/tests/integration/repo_signed_tag_test.go b/tests/integration/repo_signed_tag_test.go index 16d8841304..41e663ce52 100644 --- a/tests/integration/repo_signed_tag_test.go +++ b/tests/integration/repo_signed_tag_test.go @@ -10,16 +10,16 @@ import ( "os/exec" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/graceful" - repo_module "forgejo.org/modules/repository" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "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/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/graceful" + repo_module "code.gitea.io/gitea/modules/repository" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/require" ) diff --git a/tests/integration/repo_starwatch_test.go b/tests/integration/repo_starwatch_test.go index 3bcfa29fe3..a8bad30109 100644 --- a/tests/integration/repo_starwatch_test.go +++ b/tests/integration/repo_starwatch_test.go @@ -9,10 +9,10 @@ import ( "strings" "testing" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_tag_test.go b/tests/integration/repo_tag_test.go index 9be33ec8a8..d5539cb259 100644 --- a/tests/integration/repo_tag_test.go +++ b/tests/integration/repo_tag_test.go @@ -5,22 +5,20 @@ package integration import ( - "fmt" "net/http" "net/url" "strings" "testing" - "forgejo.org/models" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - repo_module "forgejo.org/modules/repository" - api "forgejo.org/modules/structs" - "forgejo.org/services/release" - "forgejo.org/tests" + "code.gitea.io/gitea/models" + "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/services/release" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -32,6 +30,20 @@ func TestTagViewWithoutRelease(t *testing.T) { repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) + defer func() { + releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ + IncludeTags: true, + TagNames: []string{"no-release"}, + RepoID: repo.ID, + }) + require.NoError(t, err) + + for _, release := range releases { + _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) + require.NoError(t, err) + } + }() + err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "no-release", "release-less tag") require.NoError(t, err) @@ -57,27 +69,27 @@ func TestTagViewWithoutRelease(t *testing.T) { } func TestCreateNewTagProtected(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) + defer tests.PrepareTestEnv(t)() - t.Run("Code", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "t-first", "first tag") - require.NoError(t, err) + t.Run("Code", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() - err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-2", "second tag") - require.Error(t, err) - assert.True(t, models.IsErrProtectedTagName(err)) + err := release.CreateNewTag(git.DefaultContext, owner, repo, "master", "t-first", "first tag") + require.NoError(t, err) - err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1.1", "third tag") - require.NoError(t, err) - }) + err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-2", "second tag") + require.Error(t, err) + assert.True(t, models.IsErrProtectedTagName(err)) - t.Run("Git", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + err = release.CreateNewTag(git.DefaultContext, owner, repo, "master", "v-1.1", "third tag") + require.NoError(t, err) + }) + t.Run("Git", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { httpContext := NewAPITestContext(t, owner.Name, repo.Name) dstPath := t.TempDir() @@ -94,10 +106,10 @@ func TestCreateNewTagProtected(t *testing.T) { require.Error(t, err) assert.Contains(t, err.Error(), "Tag v-2 is protected") }) + }) - t.Run("GitTagForce", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - + t.Run("GitTagForce", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { httpContext := NewAPITestContext(t, owner.Name, repo.Name) dstPath := t.TempDir() @@ -107,7 +119,13 @@ func TestCreateNewTagProtected(t *testing.T) { doGitClone(dstPath, u)(t) - _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) + _, _, err := git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + + _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + + _, _, err = git.NewCommand(git.DefaultContext, "tag", "v-1.1", "-m", "force update v2", "--force").RunStdString(&git.RunOpts{Dir: dstPath}) require.NoError(t, err) _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) @@ -123,86 +141,25 @@ func TestCreateNewTagProtected(t *testing.T) { assert.Contains(t, tagsTab.Text(), "force update v2") }) }) -} -func TestSyncRepoTags(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - - t.Run("Git", func(t *testing.T) { - httpContext := NewAPITestContext(t, owner.Name, repo.Name) - - dstPath := t.TempDir() - - u.Path = httpContext.GitPath() - u.User = url.UserPassword(owner.Name, userPassword) - - doGitClone(dstPath, u)(t) - - _, _, err := git.NewCommand(git.DefaultContext, "tag", "v2", "-m", "this is an annotated tag").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - _, _, err = git.NewCommand(git.DefaultContext, "push", "--tags").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - - testTag := func(t *testing.T) { - t.Helper() - req := NewRequestf(t, "GET", "/%s/releases/tag/v2", repo.FullName()) - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - tagsTab := htmlDoc.Find(".release-list-title") - assert.Contains(t, tagsTab.Text(), "this is an annotated tag") - } - - // Make sure `SyncRepoTags` doesn't modify annotated tags. - testTag(t) - require.NoError(t, repo_module.SyncRepoTags(git.DefaultContext, repo.ID)) - testTag(t) - }) - }) -} - -func TestRepushTag(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) - owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}) - session := loginUser(t, owner.LowerName) - token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository) - - httpContext := NewAPITestContext(t, owner.Name, repo.Name) - - dstPath := t.TempDir() - - u.Path = httpContext.GitPath() - u.User = url.UserPassword(owner.Name, userPassword) - - doGitClone(dstPath, u)(t) - - // create and push a tag - _, _, err := git.NewCommand(git.DefaultContext, "tag", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - // create a release for the tag - createdRelease := createNewReleaseUsingAPI(t, token, owner, repo, "v2.0", "", "Release of v2.0", "desc") - assert.False(t, createdRelease.IsDraft) - // delete the tag - _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--delete", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - // query the release by API and it should be a draft - req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0")) - resp := MakeRequest(t, req, http.StatusOK) - var respRelease *api.Release - DecodeJSON(t, resp, &respRelease) - assert.True(t, respRelease.IsDraft) - // re-push the tag - _, _, err = git.NewCommand(git.DefaultContext, "push", "origin", "--tags", "v2.0").RunStdString(&git.RunOpts{Dir: dstPath}) - require.NoError(t, err) - // query the release by API and it should not be a draft - req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/repos/%s/%s/releases/tags/%s", owner.Name, repo.Name, "v2.0")) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &respRelease) - assert.False(t, respRelease.IsDraft) + // Cleanup + releases, err := db.Find[repo_model.Release](db.DefaultContext, repo_model.FindReleasesOptions{ + IncludeTags: true, + TagNames: []string{"v-1", "v-1.1"}, + RepoID: repo.ID, }) + require.NoError(t, err) + + for _, release := range releases { + _, err = db.DeleteByID[repo_model.Release](db.DefaultContext, release.ID) + require.NoError(t, err) + } + + protectedTags, err := git_model.GetProtectedTags(db.DefaultContext, repo.ID) + require.NoError(t, err) + + for _, protectedTag := range protectedTags { + err = git_model.DeleteProtectedTag(db.DefaultContext, protectedTag) + require.NoError(t, err) + } } diff --git a/tests/integration/repo_test.go b/tests/integration/repo_test.go index 308942e4fe..b7a9dbbd3a 100644 --- a/tests/integration/repo_test.go +++ b/tests/integration/repo_test.go @@ -12,18 +12,18 @@ import ( "testing" "time" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/git" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/git" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -902,7 +902,7 @@ func TestRepoFollowSymlink(t *testing.T) { symlinkURL, ok := htmlDoc.Find(".file-actions .button[data-kind='follow-symlink']").Attr("href") if shouldExist { assert.True(t, ok) - assert.Equal(t, expectedSymlinkURL, symlinkURL) + assert.EqualValues(t, expectedSymlinkURL, symlinkURL) } else { assert.False(t, ok) } @@ -1009,29 +1009,16 @@ func TestRepoCodeSearchForm(t *testing.T) { resp := MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) - formEl := htmlDoc.doc.Find("form[data-test-tag=codesearch]") - - action, exists := formEl.Attr("action") + action, exists := htmlDoc.doc.Find("form[data-test-tag=codesearch]").Attr("action") assert.True(t, exists) + branchSubURL := "/branch/master" + if indexer { assert.NotContains(t, action, branchSubURL) } else { assert.Contains(t, action, branchSubURL) } - - filepath, exists := formEl.Find("input[name=path]").Attr("value") - assert.True(t, exists) - assert.Empty(t, filepath) - - req = NewRequest(t, "GET", "/user2/glob/src/branch/master/x/y") - resp = MakeRequest(t, req, http.StatusOK) - - filepath, exists = NewHTMLParser(t, resp.Body).doc. - Find("form[data-test-tag=codesearch] input[name=path]"). - Attr("value") - assert.True(t, exists) - assert.Equal(t, "x/y", filepath) } t.Run("indexer disabled", func(t *testing.T) { @@ -1061,42 +1048,6 @@ func TestFileHistoryPager(t *testing.T) { }) } -func TestRepoIssueSorting(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - t.Run("Dropdown content", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user2/repo1/issues") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - assert.Equal(t, - 9, - htmlDoc.Find(`.list-header-sort .menu a`).Length(), - "Wrong amount of sort options in dropdown") - - menuItemsHTML := htmlDoc.Find(`.list-header-sort .menu`).Text() - locale := translation.NewLocale("en-US") - for _, key := range []string{ - "relevance", - "latest", - "oldest", - "recentupdate", - "leastupdate", - "mostcomment", - "leastcomment", - "nearduedate", - "farduedate", - } { - assert.Contains(t, - menuItemsHTML, - locale.Tr("repo.issues.filter_sort."+key), - "Sort option %s ('%s') not found in dropdown", key, locale.Tr("repo.issues.filter_sort."+key)) - } - }) -} - func TestRepoIssueFilterLinks(t *testing.T) { defer tests.PrepareTestEnv(t)() @@ -1120,6 +1071,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1144,6 +1096,32 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") + }) + assert.True(t, called) + }) + + t.Run("Fuzzy", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/user2/repo1/issues?fuzzy=true") + resp := MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + called := false + htmlDoc.Find("#issue-filters a[href^='?']").Each(func(_ int, s *goquery.Selection) { + called = true + href, _ := s.Attr("href") + assert.Contains(t, href, "?q=&") + assert.Contains(t, href, "&type=") + assert.Contains(t, href, "&sort=") + assert.Contains(t, href, "&state=") + assert.Contains(t, href, "&labels=") + assert.Contains(t, href, "&milestone=") + assert.Contains(t, href, "&project=") + assert.Contains(t, href, "&assignee=") + assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=true") }) assert.True(t, called) }) @@ -1168,6 +1146,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1192,6 +1171,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1216,6 +1196,32 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") + }) + assert.True(t, called) + }) + + t.Run("Miilestone", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, "GET", "/user2/repo1/issues?milestone=1") + resp := MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + called := false + htmlDoc.Find("#issue-filters a[href^='?']:not(.list-header-milestone a)").Each(func(_ int, s *goquery.Selection) { + called = true + href, _ := s.Attr("href") + assert.Contains(t, href, "?q=&") + assert.Contains(t, href, "&type=") + assert.Contains(t, href, "&sort=") + assert.Contains(t, href, "&state=") + assert.Contains(t, href, "&labels=") + assert.Contains(t, href, "&milestone=1") + assert.Contains(t, href, "&project=") + assert.Contains(t, href, "&assignee=") + assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1240,30 +1246,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") - }) - assert.True(t, called) - }) - - t.Run("Milestone", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user2/repo1/issues?milestone=1") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - called := false - htmlDoc.Find("#issue-filters a[href^='?']:not(.list-header-milestone a)").Each(func(_ int, s *goquery.Selection) { - called = true - href, _ := s.Attr("href") - assert.Contains(t, href, "?q=&") - assert.Contains(t, href, "&type=") - assert.Contains(t, href, "&sort=") - assert.Contains(t, href, "&state=") - assert.Contains(t, href, "&labels=") - assert.Contains(t, href, "&milestone=1") - assert.Contains(t, href, "&project=") - assert.Contains(t, href, "&assignee=") - assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1288,6 +1271,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=1") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1312,6 +1296,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=1") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1336,6 +1321,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=1") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1360,6 +1346,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") }) assert.True(t, called) }) @@ -1384,6 +1371,7 @@ func TestRepoIssueFilterLinks(t *testing.T) { assert.Contains(t, href, "&project=") assert.Contains(t, href, "&assignee=") assert.Contains(t, href, "&poster=") + assert.Contains(t, href, "&fuzzy=") assert.Contains(t, href, "&archived=true") }) assert.True(t, called) @@ -1423,23 +1411,5 @@ func TestRepoSubmoduleView(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) htmlDoc.AssertElement(t, fmt.Sprintf(`tr[data-entryname="repo1"] a[href="%s"]`, u.JoinPath("/user2/repo1").String()), true) - - // Check that a link to the submodule returns a redirect and that the redirect link is correct. - req = NewRequest(t, "GET", "/"+repo.FullName()+"/src/branch/"+repo.DefaultBranch+"/repo1") - resp = MakeRequest(t, req, http.StatusSeeOther) - - assert.Equal(t, u.JoinPath("/user2/repo1").String(), resp.Header().Get("Location")) }) } - -func TestBlameDirectory(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - // Ensure directory exists. - req := NewRequest(t, "GET", "/user2/repo59/src/branch/master/deep") - MakeRequest(t, req, http.StatusOK) - - // Blame is not allowed - req = NewRequest(t, "GET", "/user2/repo59/blame/branch/master/deep") - MakeRequest(t, req, http.StatusNotFound) -} diff --git a/tests/integration/repo_topic_test.go b/tests/integration/repo_topic_test.go index 6dc60e2c3a..f5778a2861 100644 --- a/tests/integration/repo_topic_test.go +++ b/tests/integration/repo_topic_test.go @@ -9,12 +9,12 @@ import ( "net/url" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/repo_view_test.go b/tests/integration/repo_view_test.go index 7ea4aeb4c6..7c280e2491 100644 --- a/tests/integration/repo_view_test.go +++ b/tests/integration/repo_view_test.go @@ -10,14 +10,14 @@ import ( "strings" "testing" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/routers/web/repo" - "forgejo.org/services/context" - "forgejo.org/services/contexttest" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + unit_model "code.gitea.io/gitea/models/unit" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/routers/web/repo" + "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/contexttest" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -62,9 +62,8 @@ func createRepoAndGetContext(t *testing.T, files []string, deleteMdReadme bool) } func TestRepoView_FindReadme(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - t.Run("PrioOneLocalizedMdReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + t.Run("PrioOneLocalizedMdReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.en.md", "README.en.org", "README.org", "README.txt", "README.tex"}, false) defer f() @@ -74,8 +73,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.en.md", file.Name()) }) - t.Run("PrioTwoMdReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioTwoMdReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.en.org", "README.org", "README.txt", "README.tex"}, false) defer f() @@ -85,8 +85,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.md", file.Name()) }) - t.Run("PrioThreeLocalizedOrgReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioThreeLocalizedOrgReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.en.org", "README.org", "README.txt", "README.tex"}, true) defer f() @@ -96,8 +97,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.en.org", file.Name()) }) - t.Run("PrioFourOrgReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioFourOrgReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.org", "README.txt", "README.tex"}, true) defer f() @@ -107,8 +109,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.org", file.Name()) }) - t.Run("PrioFiveTxtReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioFiveTxtReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.txt", "README", "README.tex"}, true) defer f() @@ -118,8 +121,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.txt", file.Name()) }) - t.Run("PrioSixWithoutExtensionReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioSixWithoutExtensionReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README", "README.tex"}, true) defer f() @@ -129,8 +133,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README", file.Name()) }) - t.Run("PrioSevenAnyReadme", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("PrioSevenAnyReadme", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{"README.tex"}, true) defer f() @@ -140,8 +145,9 @@ func TestRepoView_FindReadme(t *testing.T) { assert.Equal(t, "README.tex", file.Name()) }) - t.Run("DoNotPickReadmeIfNonPresent", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + }) + t.Run("DoNotPickReadmeIfNonPresent", func(t *testing.T) { + onGiteaRun(t, func(t *testing.T, u *url.URL) { ctx, f := createRepoAndGetContext(t, []string{}, true) defer f() diff --git a/tests/integration/repo_watch_test.go b/tests/integration/repo_watch_test.go index 0bcb039b01..ef3028f293 100644 --- a/tests/integration/repo_watch_test.go +++ b/tests/integration/repo_watch_test.go @@ -7,9 +7,9 @@ import ( "net/url" "testing" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" ) func TestRepoWatch(t *testing.T) { diff --git a/tests/integration/repo_webhook_test.go b/tests/integration/repo_webhook_test.go index be1b9cbcec..8f65b5c34f 100644 --- a/tests/integration/repo_webhook_test.go +++ b/tests/integration/repo_webhook_test.go @@ -9,9 +9,9 @@ import ( "net/url" "testing" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/webhook" - "forgejo.org/tests" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/webhook" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -316,7 +316,6 @@ func assertInput(t testing.TB, form *goquery.Selection, name string) string { func testWebhookForms(name string, session *TestSession, validFields map[string]string, invalidPatches ...map[string]string) func(t *testing.T) { return func(t *testing.T) { - defer tests.PrintCurrentTest(t)() t.Run("repo1", func(t *testing.T) { testWebhookFormsShared(t, "/user2/repo1/settings/hooks", name, session, validFields, invalidPatches...) }) diff --git a/tests/integration/repo_wiki_test.go b/tests/integration/repo_wiki_test.go index 5cd893702d..6115010ba4 100644 --- a/tests/integration/repo_wiki_test.go +++ b/tests/integration/repo_wiki_test.go @@ -8,12 +8,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -89,27 +89,3 @@ func TestWikiBranchNormalize(t *testing.T) { assert.Equal(t, setting.Repository.DefaultBranch, repo.GetWikiBranchName()) assertNormalizeButton(false) } - -func TestWikiTOC(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - username := "user2" - session := loginUser(t, username) - - t.Run("Link in heading", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithValues(t, "POST", "/user2/repo1/wiki/Home?action=_edit", map[string]string{ - "_csrf": GetCSRF(t, session, "/user2/repo1/wiki/Home"), - "title": "Home", - "content": "# [Helpdesk](Helpdesk)", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - req = NewRequest(t, "GET", "/user2/repo1/wiki/Home") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - assert.EqualValues(t, "Helpdesk", htmlDoc.Find(".wiki-content-toc a").Text()) - }) -} diff --git a/tests/integration/repofiles_change_test.go b/tests/integration/repofiles_change_test.go index dce310b0fc..9790b36183 100644 --- a/tests/integration/repofiles_change_test.go +++ b/tests/integration/repofiles_change_test.go @@ -10,15 +10,14 @@ import ( "testing" "time" - 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/setting" - api "forgejo.org/modules/structs" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + 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/setting" + api "code.gitea.io/gitea/modules/structs" + files_service "code.gitea.io/gitea/services/repository/files" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -64,8 +63,8 @@ func getDeleteRepoFilesOptions(repo *repo_model.Repository) *files_service.Chang Files: []*files_service.ChangeRepoFile{ { Operation: "delete", - TreePath: "README_new.md", - SHA: "dbf8d00e022e05b7e5cf7e535de857de57925647", + TreePath: "README.md", + SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f", }, }, LastCommitID: "", @@ -245,142 +244,184 @@ func getExpectedFileResponseForRepofilesUpdate(commitID, filename, lastCommitSHA } } -func TestChangeRepoFiles(t *testing.T) { +func TestChangeRepoFilesForCreate(t *testing.T) { + // setup onGiteaRun(t, func(t *testing.T, u *url.URL) { doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + opts := getCreateRepoFilesOptions(repo) - gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo) + // test + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + + // asserts require.NoError(t, err) + gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) defer gitRepo.Close() - t.Run("Create", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getCreateRepoFilesOptions(repo) - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) - - commitID, err := gitRepo.GetBranchCommitID(opts.NewBranch) - require.NoError(t, err) - lastCommit, err := gitRepo.GetCommitByPath("new/file.txt") - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesCreate(commitID, lastCommit.ID.String()) + commitID, _ := gitRepo.GetBranchCommitID(opts.NewBranch) + lastCommit, _ := gitRepo.GetCommitByPath("new/file.txt") + expectedFileResponse := getExpectedFileResponseForRepofilesCreate(commitID, lastCommit.ID.String()) + assert.NotNil(t, expectedFileResponse) + if expectedFileResponse != nil { assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) - }) + } + }) +} - t.Run("Update", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getUpdateRepoFilesOptions(repo) - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) +func TestChangeRepoFilesForUpdate(t *testing.T) { + // setup + onGiteaRun(t, func(t *testing.T, u *url.URL) { + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + opts := getUpdateRepoFilesOptions(repo) - commit, err := gitRepo.GetBranchCommit(opts.NewBranch) - require.NoError(t, err) - lastCommit, err := commit.GetCommitByPath(opts.Files[0].TreePath) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) - assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) - assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) - }) + // test + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - t.Run("Update and move", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getUpdateRepoFilesOptions(repo) - opts.Files[0].SHA = "dbf8d00e022e05b7e5cf7e535de857de57925647" - opts.Files[0].FromTreePath = "README.md" - opts.Files[0].TreePath = "README_new.md" // new file name, README_new.md - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) + // asserts + require.NoError(t, err) + gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) + defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(opts.NewBranch) - require.NoError(t, err) - lastCommit, err := commit.GetCommitByPath(opts.Files[0].TreePath) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) + assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, filesResponse.Commit.Author.Email) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, filesResponse.Commit.Author.Name) + }) +} - // assert that the old file no longer exists in the last commit of the branch - fromEntry, err := commit.GetTreeEntryByPath(opts.Files[0].FromTreePath) - switch err.(type) { - case git.ErrNotExist: - // correct, continue - default: - t.Fatalf("expected git.ErrNotExist, got:%v", err) - } - toEntry, err := commit.GetTreeEntryByPath(opts.Files[0].TreePath) - require.NoError(t, err) - assert.Nil(t, fromEntry) // Should no longer exist here - assert.NotNil(t, toEntry) // Should exist here - // assert SHA has remained the same but paths use the new file name - assert.EqualValues(t, expectedFileResponse.Content.SHA, filesResponse.Files[0].SHA) - assert.EqualValues(t, expectedFileResponse.Content.Name, filesResponse.Files[0].Name) - assert.EqualValues(t, expectedFileResponse.Content.Path, filesResponse.Files[0].Path) - assert.EqualValues(t, expectedFileResponse.Content.URL, filesResponse.Files[0].URL) - assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) - assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) - }) +func TestChangeRepoFilesForUpdateWithFileMove(t *testing.T) { + // setup + onGiteaRun(t, func(t *testing.T, u *url.URL) { + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + opts := getUpdateRepoFilesOptions(repo) + opts.Files[0].FromTreePath = "README.md" + opts.Files[0].TreePath = "README_new.md" // new file name, README_new.md - t.Run("Change without branch names", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getUpdateRepoFilesOptions(repo) - opts.OldBranch = "" - opts.NewBranch = "" - opts.Files[0].TreePath = "README_new.md" - opts.Files[0].SHA = "dbf8d00e022e05b7e5cf7e535de857de57925647" + // test + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) + // asserts + require.NoError(t, err) + gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) + defer gitRepo.Close() - commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) - lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) - expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) - assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) - }) + commit, _ := gitRepo.GetBranchCommit(opts.NewBranch) + lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + // assert that the old file no longer exists in the last commit of the branch + fromEntry, err := commit.GetTreeEntryByPath(opts.Files[0].FromTreePath) + switch err.(type) { + case git.ErrNotExist: + // correct, continue + default: + t.Fatalf("expected git.ErrNotExist, got:%v", err) + } + toEntry, err := commit.GetTreeEntryByPath(opts.Files[0].TreePath) + require.NoError(t, err) + assert.Nil(t, fromEntry) // Should no longer exist here + assert.NotNil(t, toEntry) // Should exist here + // assert SHA has remained the same but paths use the new file name + assert.EqualValues(t, expectedFileResponse.Content.SHA, filesResponse.Files[0].SHA) + assert.EqualValues(t, expectedFileResponse.Content.Name, filesResponse.Files[0].Name) + assert.EqualValues(t, expectedFileResponse.Content.Path, filesResponse.Files[0].Path) + assert.EqualValues(t, expectedFileResponse.Content.URL, filesResponse.Files[0].URL) + assert.EqualValues(t, expectedFileResponse.Commit.SHA, filesResponse.Commit.SHA) + assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, filesResponse.Commit.HTMLURL) + }) +} - t.Run("Delete files", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getDeleteRepoFilesOptions(repo) +// Test opts with branch names removed, should get same results as above test +func TestChangeRepoFilesWithoutBranchNames(t *testing.T) { + // setup + onGiteaRun(t, func(t *testing.T, u *url.URL) { + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + opts := getUpdateRepoFilesOptions(repo) + opts.OldBranch = "" + opts.NewBranch = "" - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesDelete() - assert.NotNil(t, filesResponse) - assert.Nil(t, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) - assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) - assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) + // test + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - filesResponse, err = files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - assert.Nil(t, filesResponse) - expectedError := "repository file does not exist [path: " + opts.Files[0].TreePath + "]" - assert.EqualError(t, err, expectedError) - }) + // asserts + require.NoError(t, err) + gitRepo, _ := gitrepo.OpenRepository(git.DefaultContext, repo) + defer gitRepo.Close() - t.Run("Delete without branch name", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - opts := getDeleteRepoFilesOptions(repo) - opts.OldBranch = "" - opts.NewBranch = "" - opts.Files[0].SHA = "103ff9234cefeee5ec5361d22b49fbb04d385885" - opts.Files[0].TreePath = "new/file.txt" + commit, _ := gitRepo.GetBranchCommit(repo.DefaultBranch) + lastCommit, _ := commit.GetCommitByPath(opts.Files[0].TreePath) + expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String(), opts.Files[0].TreePath, lastCommit.ID.String()) + assert.EqualValues(t, expectedFileResponse.Content, filesResponse.Files[0]) + }) +} - filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) - require.NoError(t, err) - expectedFileResponse := getExpectedFileResponseForRepofilesDelete() - assert.NotNil(t, filesResponse) - assert.Nil(t, filesResponse.Files[0]) - assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) - assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) - assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) - assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) - }) +func TestChangeRepoFilesForDelete(t *testing.T) { + onGiteaRun(t, testDeleteRepoFiles) +} + +func testDeleteRepoFiles(t *testing.T, u *url.URL) { + // setup + unittest.PrepareTestEnv(t) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + opts := getDeleteRepoFilesOptions(repo) + + t.Run("Delete README.md file", func(t *testing.T) { + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesDelete() + assert.NotNil(t, filesResponse) + assert.Nil(t, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) + assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) + assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) + }) + + t.Run("Verify README.md has been deleted", func(t *testing.T) { + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + assert.Nil(t, filesResponse) + expectedError := "repository file does not exist [path: " + opts.Files[0].TreePath + "]" + assert.EqualError(t, err, expectedError) + }) +} + +// Test opts with branch names removed, same results +func TestChangeRepoFilesForDeleteWithoutBranchNames(t *testing.T) { + onGiteaRun(t, testDeleteRepoFilesWithoutBranchNames) +} + +func testDeleteRepoFilesWithoutBranchNames(t *testing.T, u *url.URL) { + // setup + unittest.PrepareTestEnv(t) + doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) + + opts := getDeleteRepoFilesOptions(repo) + opts.OldBranch = "" + opts.NewBranch = "" + + t.Run("Delete README.md without Branch Name", func(t *testing.T) { + filesResponse, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, doer, opts) + require.NoError(t, err) + expectedFileResponse := getExpectedFileResponseForRepofilesDelete() + assert.NotNil(t, filesResponse) + assert.Nil(t, filesResponse.Files[0]) + assert.EqualValues(t, expectedFileResponse.Commit.Message, filesResponse.Commit.Message) + assert.EqualValues(t, expectedFileResponse.Commit.Author.Identity, filesResponse.Commit.Author.Identity) + assert.EqualValues(t, expectedFileResponse.Commit.Committer.Identity, filesResponse.Commit.Committer.Identity) + assert.EqualValues(t, expectedFileResponse.Verification, filesResponse.Verification) }) } diff --git a/tests/integration/runner_test.go b/tests/integration/runner_test.go deleted file mode 100644 index 09555caacf..0000000000 --- a/tests/integration/runner_test.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2025 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "fmt" - "net/http" - "testing" - - actions_model "forgejo.org/models/actions" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" -) - -func TestRunnerModification(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestRunnerModification")() - defer tests.PrepareTestEnv(t)() - - user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) - userRunner := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunner{ID: 1001, OwnerID: user.ID}) - userURL := "/user/settings/actions/runners" - org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3, Type: user_model.UserTypeOrganization}) - orgRunner := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunner{ID: 1002, OwnerID: org.ID}) - orgURL := "/org/" + org.Name + "/settings/actions/runners" - repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, OwnerID: user.ID}) - repoRunner := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunner{ID: 1003, RepoID: repo.ID}) - repoURL := "/" + repo.FullName() + "/settings/actions/runners" - admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{IsAdmin: true}) - globalRunner := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunner{ID: 1004}, "owner_id = 0 AND repo_id = 0") - adminURL := "/admin/actions/runners" - - adminSess := loginUser(t, admin.Name) - adminCSRF := GetCSRF(t, adminSess, "/") - sess := loginUser(t, user.Name) - csrf := GetCSRF(t, sess, "/") - - test := func(t *testing.T, fail bool, baseURL string, id int64) { - defer tests.PrintCurrentTest(t, 1)() - t.Helper() - - sess := sess - csrf := csrf - if baseURL == adminURL { - sess = adminSess - csrf = adminCSRF - } - - req := NewRequestWithValues(t, "POST", baseURL+fmt.Sprintf("/%d", id), map[string]string{ - "_csrf": csrf, - "description": "New Description", - }) - if fail { - sess.MakeRequest(t, req, http.StatusNotFound) - } else { - sess.MakeRequest(t, req, http.StatusSeeOther) - flashCookie := sess.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DRunner%2Bupdated%2Bsuccessfully", flashCookie.Value) - } - - req = NewRequestWithValues(t, "POST", baseURL+fmt.Sprintf("/%d/delete", id), map[string]string{ - "_csrf": csrf, - }) - if fail { - sess.MakeRequest(t, req, http.StatusNotFound) - } else { - sess.MakeRequest(t, req, http.StatusOK) - flashCookie := sess.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DRunner%2Bdeleted%2Bsuccessfully", flashCookie.Value) - } - } - - t.Run("User runner", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, userRunner.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, userRunner.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, false, userURL, userRunner.ID) - }) - }) - - t.Run("Organisation runner", func(t *testing.T) { - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, orgRunner.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, orgRunner.ID) - }) - t.Run("Organisation", func(t *testing.T) { - test(t, false, orgURL, orgRunner.ID) - }) - }) - - t.Run("Repository runner", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, repoRunner.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, repoRunner.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, false, repoURL, repoRunner.ID) - }) - }) - - t.Run("Global runner", func(t *testing.T) { - t.Run("Organisation", func(t *testing.T) { - test(t, true, orgURL, globalRunner.ID) - }) - t.Run("User", func(t *testing.T) { - test(t, true, userURL, globalRunner.ID) - }) - t.Run("Repository", func(t *testing.T) { - test(t, true, repoURL, globalRunner.ID) - }) - t.Run("Admin", func(t *testing.T) { - test(t, false, adminURL, globalRunner.ID) - }) - }) -} diff --git a/tests/integration/session_test.go b/tests/integration/session_test.go index 7af5645dec..a5bcab269a 100644 --- a/tests/integration/session_test.go +++ b/tests/integration/session_test.go @@ -6,10 +6,10 @@ package integration import ( "testing" - "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - "forgejo.org/tests" + "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/setting_test.go b/tests/integration/setting_test.go index 66790e5835..29615b3ecf 100644 --- a/tests/integration/setting_test.go +++ b/tests/integration/setting_test.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -8,12 +7,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/tests" + auth_model "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/setting" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/signin_test.go b/tests/integration/signin_test.go index dd8322214a..77e19bba96 100644 --- a/tests/integration/signin_test.go +++ b/tests/integration/signin_test.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -10,12 +9,11 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -95,49 +93,3 @@ func TestSigninWithRememberMe(t *testing.T) { req = NewRequest(t, "GET", "/user/settings") session.MakeRequest(t, req, http.StatusOK) } - -func TestDisableSignin(t *testing.T) { - defer tests.PrepareTestEnv(t)() - // Mock alternative auth ways as enabled - defer test.MockVariableValue(&setting.Service.EnableOpenIDSignIn, true)() - defer test.MockVariableValue(&setting.Service.EnableOpenIDSignUp, true)() - t.Run("Disabled", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.EnableInternalSignIn, false)() - - t.Run("UI", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user/login") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "form[action='/user/login']", false) - htmlDoc.AssertElement(t, ".divider-text", false) - }) - - t.Run("Signin", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "POST", "/user/login") - MakeRequest(t, req, http.StatusForbidden) - }) - }) - - t.Run("Enabled", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.EnableInternalSignIn, true)() - - t.Run("UI", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequest(t, "GET", "/user/login") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "form[action='/user/login']", true) - htmlDoc.AssertElement(t, ".divider-text", true) - }) - - t.Run("Signin", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - req := NewRequest(t, "POST", "/user/login") - MakeRequest(t, req, http.StatusOK) - }) - }) -} diff --git a/tests/integration/signout_test.go b/tests/integration/signout_test.go index efcf54f14d..7fd0b5c64a 100644 --- a/tests/integration/signout_test.go +++ b/tests/integration/signout_test.go @@ -7,7 +7,7 @@ import ( "net/http" "testing" - "forgejo.org/tests" + "code.gitea.io/gitea/tests" ) func TestSignOut(t *testing.T) { diff --git a/tests/integration/signup_test.go b/tests/integration/signup_test.go index 91752d415e..d5df41fabf 100644 --- a/tests/integration/signup_test.go +++ b/tests/integration/signup_test.go @@ -1,5 +1,4 @@ // Copyright 2017 The Gitea Authors. All rights reserved. -// Copyright 2025 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration @@ -10,13 +9,13 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/cache" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/cache" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -208,28 +207,3 @@ func TestSignupImageCaptcha(t *testing.T) { unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "captcha-test", IsActive: true}) } - -func TestSignupFormUI(t *testing.T) { - defer tests.PrepareTestEnv(t)() - t.Run("UI", func(t *testing.T) { - // Mock alternative auth ways as enabled - defer test.MockVariableValue(&setting.Service.EnableOpenIDSignIn, true)() - defer test.MockVariableValue(&setting.Service.EnableOpenIDSignUp, true)() - t.Run("Internal registration enabled", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.AllowOnlyExternalRegistration, false)() - req := NewRequest(t, "GET", "/user/sign_up") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "form[action='/user/sign_up'] input#user_name", true) - htmlDoc.AssertElement(t, ".divider-text", true) - }) - t.Run("Internal registration disabled", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.AllowOnlyExternalRegistration, true)() - req := NewRequest(t, "GET", "/user/sign_up") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - htmlDoc.AssertElement(t, "form[action='/user/sign_up'] input#user_name", false) - htmlDoc.AssertElement(t, ".divider-text", false) - }) - }) -} diff --git a/tests/integration/translations_test.go b/tests/integration/size_translations_test.go similarity index 74% rename from tests/integration/translations_test.go rename to tests/integration/size_translations_test.go index 9cfa3423b7..a0b88291f4 100644 --- a/tests/integration/translations_test.go +++ b/tests/integration/size_translations_test.go @@ -1,5 +1,6 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-License-Identifier: MIT + package integration import ( @@ -10,39 +11,15 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/translation/i18n" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" ) -func TestMissingTranslationHandling(t *testing.T) { - // Currently new languages can only be added to localestore via AddLocaleByIni - // so this line is here to make the other one work. When INI locales are removed, - // it will not be needed by this test. - i18n.DefaultLocales.AddLocaleByIni("fun", "Funlang", nil, []byte(""), nil) - - // Add a testing locale to the store - i18n.DefaultLocales.AddToLocaleFromJSON("fun", []byte(`{ - "meta.last_line": "This language only has one line that is never used by the UI. It will never have a translation for incorrect_root_url" - }`)) - - // Get "fun" locale, make sure it's available - funLocale, found := i18n.DefaultLocales.Locale("fun") - assert.True(t, found) - - // Get translation for a string that this locale doesn't have - s := funLocale.TrString("incorrect_root_url") - - // Verify fallback to English - assert.True(t, strings.HasPrefix(s, "This Forgejo instance")) -} - -// TestDataSizeTranslation is a test for usage of TrSize in file size display func TestDataSizeTranslation(t *testing.T) { onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { testUser := "user2" @@ -126,14 +103,14 @@ func testFileSizeTranslated(t *testing.T, session *TestSession, filePath, correc resp := session.MakeRequest(t, req, http.StatusOK) // Check if file size is translated - sizeCorrect := false + sizeCorrent := false fileInfo := NewHTMLParser(t, resp.Body).Find(".file-info .file-info-entry") fileInfo.Each(func(i int, info *goquery.Selection) { infoText := strings.TrimSpace(info.Text()) if infoText == correctSize { - sizeCorrect = true + sizeCorrent = true } }) - assert.True(t, sizeCorrect) + assert.True(t, sizeCorrent) } diff --git a/tests/integration/ssh_key_test.go b/tests/integration/ssh_key_test.go index aece9c3fd9..ebf0d26c2d 100644 --- a/tests/integration/ssh_key_test.go +++ b/tests/integration/ssh_key_test.go @@ -12,9 +12,9 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/git" - api "forgejo.org/modules/structs" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/swagger_test.go b/tests/integration/swagger_test.go index ac10a91691..584601f7f9 100644 --- a/tests/integration/swagger_test.go +++ b/tests/integration/swagger_test.go @@ -8,8 +8,8 @@ import ( "strings" "testing" - "forgejo.org/modules/json" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/json" + "code.gitea.io/gitea/tests" swagger_spec "github.com/go-openapi/spec" "github.com/stretchr/testify/require" diff --git a/tests/integration/timetracking_test.go b/tests/integration/timetracking_test.go index 49ae92033e..10e539cbe6 100644 --- a/tests/integration/timetracking_test.go +++ b/tests/integration/timetracking_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - "forgejo.org/modules/test" - "forgejo.org/tests" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/user_avatar_test.go b/tests/integration/user_avatar_test.go index b0d930d71f..a5805d0eda 100644 --- a/tests/integration/user_avatar_test.go +++ b/tests/integration/user_avatar_test.go @@ -10,78 +10,85 @@ import ( "io" "mime/multipart" "net/http" + "net/url" "testing" - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/avatar" - "forgejo.org/tests" + "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/avatar" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestUserAvatar(t *testing.T) { - defer tests.PrepareTestEnv(t)() - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + onGiteaRun(t, func(t *testing.T, u *url.URL) { + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - seed := user2.Email - if len(seed) == 0 { - seed = user2.Name - } + seed := user2.Email + if len(seed) == 0 { + seed = user2.Name + } - img, err := avatar.RandomImage([]byte(seed)) - if err != nil { - require.NoError(t, err) - return - } + img, err := avatar.RandomImage([]byte(seed)) + if err != nil { + require.NoError(t, err) + return + } - session := loginUser(t, "user2") - csrf := GetCSRF(t, session, "/user/settings") + session := loginUser(t, "user2") + csrf := GetCSRF(t, session, "/user/settings") - imgData := &bytes.Buffer{} + imgData := &bytes.Buffer{} - body := &bytes.Buffer{} + body := &bytes.Buffer{} - // Setup multi-part - writer := multipart.NewWriter(body) - writer.WriteField("source", "local") - part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") - if err != nil { - require.NoError(t, err) - return - } + // Setup multi-part + writer := multipart.NewWriter(body) + writer.WriteField("source", "local") + part, err := writer.CreateFormFile("avatar", "avatar-for-testuseravatar.png") + if err != nil { + require.NoError(t, err) + return + } - if err := png.Encode(imgData, img); err != nil { - require.NoError(t, err) - return - } + if err := png.Encode(imgData, img); err != nil { + require.NoError(t, err) + return + } - if _, err := io.Copy(part, imgData); err != nil { - require.NoError(t, err) - return - } + if _, err := io.Copy(part, imgData); err != nil { + require.NoError(t, err) + return + } - if err := writer.Close(); err != nil { - require.NoError(t, err) - return - } + if err := writer.Close(); err != nil { + require.NoError(t, err) + return + } - req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) - req.Header.Add("X-Csrf-Token", csrf) - req.Header.Add("Content-Type", writer.FormDataContentType()) + req := NewRequestWithBody(t, "POST", "/user/settings/avatar", body) + req.Header.Add("X-Csrf-Token", csrf) + req.Header.Add("Content-Type", writer.FormDataContentType()) - session.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) - user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org + user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the repo3, is an org - req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) - _ = session.MakeRequest(t, req, http.StatusOK) + req = NewRequest(t, "GET", user2.AvatarLinkWithSize(db.DefaultContext, 0)) + _ = session.MakeRequest(t, req, http.StatusOK) - req = NewRequestf(t, "GET", "/%s.png", user2.Name) - resp := MakeRequest(t, req, http.StatusSeeOther) - assert.EqualValues(t, fmt.Sprintf("/avatars/%s", user2.Avatar), resp.Header().Get("location")) + testGetAvatarRedirect(t, user2) - // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. + // Can't test if the response matches because the image is re-generated on upload but checking that this at least doesn't give a 404 should be enough. + }) +} + +func testGetAvatarRedirect(t *testing.T, user *user_model.User) { + t.Run(fmt.Sprintf("getAvatarRedirect_%s", user.Name), func(t *testing.T) { + req := NewRequestf(t, "GET", "/%s.png", user.Name) + resp := MakeRequest(t, req, http.StatusSeeOther) + assert.EqualValues(t, fmt.Sprintf("/avatars/%s", user.Avatar), resp.Header().Get("location")) + }) } diff --git a/tests/integration/user_count_test.go b/tests/integration/user_count_test.go index 5f762ca317..e76c30c1d4 100644 --- a/tests/integration/user_count_test.go +++ b/tests/integration/user_count_test.go @@ -9,15 +9,15 @@ import ( "strconv" "testing" - "forgejo.org/models/db" - "forgejo.org/models/organization" - packages_model "forgejo.org/models/packages" - project_model "forgejo.org/models/project" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/optional" - "forgejo.org/tests" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" + packages_model "code.gitea.io/gitea/models/packages" + project_model "code.gitea.io/gitea/models/project" + 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/optional" + "code.gitea.io/gitea/tests" "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" @@ -75,9 +75,8 @@ func (countTest *userCountTest) Init(t *testing.T, doerID, userID int64) { require.NoError(t, err) countTest.memberCount, err = organization.CountOrgMembers(db.DefaultContext, &organization.FindOrgMembersOpts{ - Doer: countTest.doer, - OrgID: org.ID, - IsDoerMember: isMember, + OrgID: org.ID, + PublicOnly: !isMember, }) require.NoError(t, err) @@ -99,7 +98,6 @@ func (countTest *userCountTest) getCount(doc *goquery.Document, name string) (in func (countTest *userCountTest) TestPage(t *testing.T, page string, orgLink bool) { t.Run(page, func(t *testing.T) { - defer tests.PrintCurrentTest(t)() var userLink string if orgLink { diff --git a/tests/integration/user_dashboard_test.go b/tests/integration/user_dashboard_test.go index b95bdab078..abc3e065d9 100644 --- a/tests/integration/user_dashboard_test.go +++ b/tests/integration/user_dashboard_test.go @@ -1,25 +1,16 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-License-Identifier: MIT package integration import ( "net/http" - "net/url" - "strconv" "strings" "testing" - "forgejo.org/models/db" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/translation" - issue_service "forgejo.org/services/issue" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + "code.gitea.io/gitea/modules/translation" - "github.com/PuerkitoBio/goquery" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -37,68 +28,3 @@ func TestUserDashboardActionLinks(t *testing.T) { assert.EqualValues(t, locale.TrString("new_migrate.link"), strings.TrimSpace(links.Find("a[href='/repo/migrate']").Text())) assert.EqualValues(t, locale.TrString("new_org.link"), strings.TrimSpace(links.Find("a[href='/org/create']").Text())) } - -func TestUserDashboardFeedWelcome(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - // User2 has some activity in feed - session := loginUser(t, "user2") - page := NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK).Body) - testUserDashboardFeedType(t, page, false) - - // User1 doesn't have any activity in feed - session = loginUser(t, "user1") - page = NewHTMLParser(t, session.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK).Body) - testUserDashboardFeedType(t, page, true) -} - -func testUserDashboardFeedType(t *testing.T, page *HTMLDoc, isEmpty bool) { - page.AssertElement(t, "#activity-feed", !isEmpty) - page.AssertElement(t, "#empty-feed", isEmpty) -} - -func TestDashboardTitleRendering(t *testing.T) { - onGiteaRun(t, func(t *testing.T, u *url.URL) { - user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}) - sess := loginUser(t, user4.Name) - - repo, _, f := tests.CreateDeclarativeRepo(t, user4, "", - []unit_model.Type{unit_model.TypePullRequests, unit_model.TypeIssues}, nil, - []*files_service.ChangeRepoFile{ - { - Operation: "create", - TreePath: "test.txt", - ContentReader: strings.NewReader("Just some text here"), - }, - }, - ) - defer f() - - issue := createIssue(t, user4, repo, "`:exclamation:` not rendered", "Hi there!") - pr := createPullRequest(t, user4, repo, "testing", "`:exclamation:` not rendered") - - _, err := issue_service.CreateIssueComment(db.DefaultContext, user4, repo, issue, "hi", nil) - require.NoError(t, err) - - _, err = issue_service.CreateIssueComment(db.DefaultContext, user4, repo, pr.Issue, "hi", nil) - require.NoError(t, err) - - testIssueClose(t, sess, repo.OwnerName, repo.Name, strconv.Itoa(int(issue.Index)), false) - testIssueClose(t, sess, repo.OwnerName, repo.Name, strconv.Itoa(int(pr.Issue.Index)), true) - - response := sess.MakeRequest(t, NewRequest(t, "GET", "/"), http.StatusOK) - htmlDoc := NewHTMLParser(t, response.Body) - - count := 0 - htmlDoc.doc.Find("#activity-feed .flex-item-main .title").Each(func(i int, s *goquery.Selection) { - count++ - if s.IsMatcher(goquery.Single("a")) { - assert.EqualValues(t, "â— not rendered", s.Text()) - } else { - assert.EqualValues(t, ":exclamation: not rendered", s.Text()) - } - }) - - assert.EqualValues(t, 6, count) - }) -} diff --git a/tests/integration/user_profile_activity_test.go b/tests/integration/user_profile_activity_test.go index eb9bfa1741..0592523076 100644 --- a/tests/integration/user_profile_activity_test.go +++ b/tests/integration/user_profile_activity_test.go @@ -1,16 +1,13 @@ // Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later +// SPDX-License-Identifier: MIT package integration import ( "net/http" - "strconv" + "net/url" "testing" - "forgejo.org/modules/structs" - "forgejo.org/tests" - "github.com/stretchr/testify/assert" ) @@ -19,64 +16,56 @@ import ( // - Public activity tab // - Banner/hint in the tab // - "Configure" link in the hint -// These elements might depend on the following: -// - Profile visibility -// - Public activity visibility func TestUserProfileActivity(t *testing.T) { - defer tests.PrepareTestEnv(t)() - // This test needs multiple users with different access statuses to check for all possible states - userAdmin := loginUser(t, "user1") - userRegular := loginUser(t, "user2") - // Activity availability should be the same for guest and another non-admin user, so this is not tested separately - userGuest := emptyTestSession(t) + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + // This test needs multiple users with different access statuses to check for all possible states + userAdmin := loginUser(t, "user1") + userRegular := loginUser(t, "user2") + // Activity availability should be the same for guest and another non-admin user, so this is not tested separately + userGuest := emptyTestSession(t) - // = Public profile, public activity = + // = Public = - // Set activity visibility of user2 to public. This is the default, but won't hurt to set it before testing. - testChangeUserActivityVisibility(t, userRegular, "off") + // Set activity visibility of user2 to public. This is the default, but won't hurt to set it before testing. + testChangeUserActivityVisibility(t, userRegular, "off") - // Verify availability of RSS button and activity tab - testUser2ActivityButtonsAvailability(t, userAdmin, true) - testUser2ActivityButtonsAvailability(t, userRegular, true) - testUser2ActivityButtonsAvailability(t, userGuest, true) + // Verify availability of RSS button and activity tab + testUser2ActivityButtonsAvailability(t, userAdmin, true) + testUser2ActivityButtonsAvailability(t, userRegular, true) + testUser2ActivityButtonsAvailability(t, userGuest, true) - // Verify the hint for all types of users: admin, self, guest - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to everyone, but as an administrator you can also see interactions in private spaces.", true) - testUser2ActivityVisibility(t, userRegular, "Your activity is visible to everyone, except for interactions in private spaces. Configure.", true) - testUser2ActivityVisibility(t, userGuest, "", true) + // Verify the hint for all types of users: admin, self, guest + testUser2ActivityVisibility(t, userAdmin, "This activity is visible to everyone, but as an administrator you can also see interactions in private spaces.", true) + hintLink := testUser2ActivityVisibility(t, userRegular, "Your activity is visible to everyone, except for interactions in private spaces. Configure.", true) + testUser2ActivityVisibility(t, userGuest, "", true) - // = Private profile, but public activity = + // When viewing own profile, the user is offered to configure activity visibility. Verify that the link is correct and works, also check that it links back to the activity tab. + linkCorrect := assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) + if linkCorrect { + page := NewHTMLParser(t, userRegular.MakeRequest(t, NewRequest(t, "GET", hintLink), http.StatusOK).Body) + activityLink, exists := page.Find(".field:has(.checkbox#keep-activity-private) .help a").Attr("href") + assert.True(t, exists) + assert.EqualValues(t, "/user2?tab=activity", activityLink) + } - // Set profile visibility of user2 to private - testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePrivate) + // = Private = - // When profile activity is configured as public, but the profile is private, tell the user about this and link to visibility settings. - hintLink := testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators because your profile is private. Configure.", true) - assert.EqualValues(t, "/user/settings#visibility-setting", hintLink) + // Set activity visibility of user2 to private + testChangeUserActivityVisibility(t, userRegular, "on") - // When the profile is private, tell the admin about this. - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) + // Verify availability of RSS button and activity tab + testUser2ActivityButtonsAvailability(t, userAdmin, true) + testUser2ActivityButtonsAvailability(t, userRegular, true) + testUser2ActivityButtonsAvailability(t, userGuest, false) - // Set profile visibility of user2 back to public - testChangeUserProfileVisibility(t, userRegular, structs.VisibleTypePublic) + // Verify the hint for all types of users: admin, self, guest + testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) + hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators. Configure.", true) + testUser2ActivityVisibility(t, userGuest, "This user has disabled the public visibility of the activity.", false) - // = Private acitivty = - - // Set activity visibility of user2 to private - testChangeUserActivityVisibility(t, userRegular, "on") - - // Verify availability of RSS button and activity tab - testUser2ActivityButtonsAvailability(t, userAdmin, true) - testUser2ActivityButtonsAvailability(t, userRegular, true) - testUser2ActivityButtonsAvailability(t, userGuest, false) - - // Verify the hint for all types of users: admin, self, guest - testUser2ActivityVisibility(t, userAdmin, "This activity is visible to you because you're an administrator, but the user wants it to remain private.", true) - hintLink = testUser2ActivityVisibility(t, userRegular, "Your activity is only visible to you and the instance administrators. Configure.", true) - testUser2ActivityVisibility(t, userGuest, "This user has disabled the public visibility of the activity.", false) - - // Verify that Configure link is correct - assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) + // Verify that Configure link is correct + assert.EqualValues(t, "/user/settings#keep-activity-private", hintLink) + }) } // testChangeUserActivityVisibility allows to easily change visibility of public activity for a user @@ -89,15 +78,6 @@ func testChangeUserActivityVisibility(t *testing.T, session *TestSession, newSta }), http.StatusSeeOther) } -// testChangeUserProfileVisibility allows to easily change visibility of user's profile -func testChangeUserProfileVisibility(t *testing.T, session *TestSession, newValue structs.VisibleType) { - t.Helper() - session.MakeRequest(t, NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), - "visibility": strconv.Itoa(int(newValue)), - }), http.StatusSeeOther) -} - // testUser2ActivityVisibility checks visibility of UI elements on /?tab=activity // It also returns the account visibility link if it is present on the page. func testUser2ActivityVisibility(t *testing.T, session *TestSession, hint string, availability bool) string { diff --git a/tests/integration/user_profile_follows_test.go b/tests/integration/user_profile_follows_test.go index 08bd58db16..bad0944d88 100644 --- a/tests/integration/user_profile_follows_test.go +++ b/tests/integration/user_profile_follows_test.go @@ -6,11 +6,10 @@ package integration import ( "fmt" "net/http" + "net/url" "strings" "testing" - "forgejo.org/tests" - "github.com/stretchr/testify/assert" ) @@ -20,92 +19,92 @@ import ( // - Followers and Following lists have correct amounts of items // - %d followers and %following counters are always present and always have correct numbers and use correct plurals func TestUserProfileFollows(t *testing.T) { - defer tests.PrepareTestEnv(t)() + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + // This test needs 3 users to check for all possible states + // The accounts of user3 and user4 are not functioning + user1 := loginUser(t, "user1") + user2 := loginUser(t, "user2") + user5 := loginUser(t, "user5") - // This test needs 3 users to check for all possible states - // The accounts of user3 and user4 are not functioning - user1 := loginUser(t, "user1") - user2 := loginUser(t, "user2") - user5 := loginUser(t, "user5") + followersLink := "#profile-avatar-card a[href='/user1?tab=followers']" + followingLink := "#profile-avatar-card a[href='/user1?tab=following']" + listHeader := ".user-cards h2" + listItems := ".user-cards .list" - followersLink := "#profile-avatar-card a[href='/user1?tab=followers']" - followingLink := "#profile-avatar-card a[href='/user1?tab=following']" - listHeader := ".user-cards h2" - listItems := ".user-cards .list" + // = No follows = - // = No follows = + var followCount int - var followCount int + // Request the profile of user1, the Followers tab + response := user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page := NewHTMLParser(t, response.Body) - // Request the profile of user1, the Followers tab - response := user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page := NewHTMLParser(t, response.Body) + // Verify that user1 has no followers + testSelectorEquals(t, page, followersLink, "0 followers") + testSelectorEquals(t, page, listHeader, "Followers") + testListCount(t, page, listItems, followCount) - // Verify that user1 has no followers - testSelectorEquals(t, page, followersLink, "0 followers") - testSelectorEquals(t, page, listHeader, "Followers") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify that user1 does not follow anyone + testSelectorEquals(t, page, followingLink, "0 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) - // Verify that user1 does not follow anyone - testSelectorEquals(t, page, followingLink, "0 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) + // Make user1 and user2 follow each other + testUserFollowUser(t, user1, "user2") + testUserFollowUser(t, user2, "user1") - // Make user1 and user2 follow each other - testUserFollowUser(t, user1, "user2") - testUserFollowUser(t, user2, "user1") + // = 1 follow each = - // = 1 follow each = + followCount++ - followCount++ + // Request the profile of user1, the Followers tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Followers tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify it is now followed by 1 user + testSelectorEquals(t, page, followersLink, "1 follower") + testSelectorEquals(t, page, listHeader, "Follower") + testListCount(t, page, listItems, followCount) - // Verify it is now followed by 1 user - testSelectorEquals(t, page, followersLink, "1 follower") - testSelectorEquals(t, page, listHeader, "Follower") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify it now follows follows 1 user + testSelectorEquals(t, page, followingLink, "1 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) - // Verify it now follows follows 1 user - testSelectorEquals(t, page, followingLink, "1 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) + // Make user1 and user3 follow each other + testUserFollowUser(t, user1, "user5") + testUserFollowUser(t, user5, "user1") - // Make user1 and user3 follow each other - testUserFollowUser(t, user1, "user5") - testUserFollowUser(t, user5, "user1") + // = 2 follows = - // = 2 follows = + followCount++ - followCount++ + // Request the profile of user1, the Followers tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Followers tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=followers"), http.StatusOK) - page = NewHTMLParser(t, response.Body) + // Verify it is now followed by 2 users + testSelectorEquals(t, page, followersLink, "2 followers") + testSelectorEquals(t, page, listHeader, "Followers") + testListCount(t, page, listItems, followCount) - // Verify it is now followed by 2 users - testSelectorEquals(t, page, followersLink, "2 followers") - testSelectorEquals(t, page, listHeader, "Followers") - testListCount(t, page, listItems, followCount) + // Request the profile of user1, the Following tab + response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) + page = NewHTMLParser(t, response.Body) - // Request the profile of user1, the Following tab - response = user1.MakeRequest(t, NewRequest(t, "GET", "/user1?tab=following"), http.StatusOK) - page = NewHTMLParser(t, response.Body) - - // Verify it now follows follows 2 users - testSelectorEquals(t, page, followingLink, "2 following") - testSelectorEquals(t, page, listHeader, "Following") - testListCount(t, page, listItems, followCount) + // Verify it now follows follows 2 users + testSelectorEquals(t, page, followingLink, "2 following") + testSelectorEquals(t, page, listHeader, "Following") + testListCount(t, page, listItems, followCount) + }) } // testUserFollowUser simply follows a user `following` by session of user `follower` diff --git a/tests/integration/user_profile_test.go b/tests/integration/user_profile_test.go index 04d87c49ab..5532403510 100644 --- a/tests/integration/user_profile_test.go +++ b/tests/integration/user_profile_test.go @@ -9,10 +9,10 @@ import ( "strings" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/user_redirect_test.go b/tests/integration/user_redirect_test.go deleted file mode 100644 index 52dc5d9d3a..0000000000 --- a/tests/integration/user_redirect_test.go +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright 2024 The Forgejo Authors. All rights reserved. -// SPDX-License-Identifier: GPL-3.0-or-later - -package integration - -import ( - "net/http" - "testing" - "time" - - "forgejo.org/models/db" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - "forgejo.org/modules/timeutil" - forgejo_context "forgejo.org/services/context" - "forgejo.org/tests" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestUserRedirect(t *testing.T) { - defer tests.PrepareTestEnv(t)() - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 1)() - - session := loginUser(t, "user2") - - t.Run("Rename user normally", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), - "name": "user2-new", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - flashCookie := session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DYour%2Bprofile%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value) - - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "user2", RedirectUserID: 2}) - }) - - t.Run("Create new user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{ - "_csrf": GetCSRF(t, emptyTestSession(t), "/user/sign_up"), - "user_name": "user2", - "email": "doesnotexist@example.com", - "password": "examplePassword!1", - "retype": "examplePassword!1", - }) - resp := MakeRequest(t, req, http.StatusOK) - - htmlDoc := NewHTMLParser(t, resp.Body) - flashMessage := htmlDoc.Find(`.flash-message`).Text() - assert.Contains(t, flashMessage, "The username cannot be claimed, because its cooldown period is not yet over. It can be claimed on") - }) - - t.Run("Rename another user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - session := loginUser(t, "user4") - req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), - "name": "user2", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - flashCookie := session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.Contains(t, flashCookie.Value, "error%3DThe%2Busername%2Bcannot%2Bbe%2Bclaimed%252C%2Bbecause%2Bits%2Bcooldown%2Bperiod%2Bis%2Bnot%2Byet%2Bover.%2BIt%2Bcan%2Bbe%2Bclaimed%2Bon") - }) - - t.Run("Admin rename user", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - session := loginUser(t, "user1") - req := NewRequestWithValues(t, "POST", "/admin/users/4/edit", map[string]string{ - "_csrf": GetCSRF(t, session, "/admin/users/4/edit"), - "user_name": "user2", - "email": "user4@example.com", - "login_type": "0-0", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - flashCookie := session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DThe%2Buser%2Baccount%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value) - - unittest.AssertExistsIf(t, true, &user_model.User{LowerName: "user2"}) - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "user2", RedirectUserID: 2}) - }) - - t.Run("Reclaim username", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), - "name": "user2-new-2", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - flashCookie := session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DYour%2Bprofile%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value) - - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "user2-new", RedirectUserID: 2}) - - req = NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings"), - "name": "user2-new", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - flashCookie = session.GetCookie(forgejo_context.CookieNameFlash) - assert.NotNil(t, flashCookie) - assert.EqualValues(t, "success%3DYour%2Bprofile%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value) - - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "user2-new", RedirectUserID: 2}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "user2-new-2", RedirectUserID: 2}) - }) - - t.Run("Profile note", func(t *testing.T) { - getPrompt := func(t *testing.T) string { - req := NewRequest(t, "GET", "/user/settings") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - return htmlDoc.Find("input[name='name'] + .help").Text() - } - - t.Run("No cooldown", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 0)() - defer tests.PrintCurrentTest(t)() - - assert.Contains(t, getPrompt(t), "The old username will redirect until someone claims it.") - }) - - t.Run("With cooldown", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 8)() - defer tests.PrintCurrentTest(t)() - - assert.Contains(t, getPrompt(t), "The old username will be available to everyone after a cooldown period of 8 days, you can still reclaim the old username during the cooldown period.") - }) - }) - - t.Run("Org settings note", func(t *testing.T) { - getPrompt := func(t *testing.T) string { - req := NewRequest(t, "GET", "/org/org3/settings") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - - return htmlDoc.Find("#org_name + .help").Text() - } - - t.Run("No cooldown", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 0)() - defer tests.PrintCurrentTest(t)() - - assert.Contains(t, getPrompt(t), "The old name will redirect until it is claimed.") - }) - - t.Run("With cooldown", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 8)() - defer tests.PrintCurrentTest(t)() - - assert.Contains(t, getPrompt(t), "The old organization name will be available to everyone after a cooldown period of 8 days, you can still reclaim the old name during the cooldown period.") - }) - }) -} - -// NOTE: This is a unit test but written in the integration test to ensure this runs on all databases. -func TestLimitUserRedirects(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(&user_model.Redirect{RedirectUserID: 1, LowerName: "legacy", CreatedUnix: 0}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "past", CreatedUnix: timeutil.TimeStampNow().AddDuration(-48 * time.Hour)}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "recent", CreatedUnix: timeutil.TimeStampNow().AddDuration(-12 * time.Hour)}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "future", CreatedUnix: timeutil.TimeStampNow().AddDuration(time.Hour)}) - require.NoError(t, err) - - require.NoError(t, user_model.LimitUserRedirects(db.DefaultContext, 1, 3)) - - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "legacy"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "past"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "recent"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "future"}) - - require.NoError(t, user_model.LimitUserRedirects(db.DefaultContext, 1, 1)) - - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "legacy"}) - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "past"}) - unittest.AssertExistsIf(t, false, &user_model.Redirect{LowerName: "recent"}) - unittest.AssertExistsIf(t, true, &user_model.Redirect{LowerName: "future"}) -} - -// NOTE: This is a unit test but written in the integration test to ensure this runs on all databases. -func TestCanClaimUsername(t *testing.T) { - require.NoError(t, unittest.PrepareTestDatabase()) - - _, err := db.GetEngine(db.DefaultContext).NoAutoTime().Insert(&user_model.Redirect{RedirectUserID: 1, LowerName: "legacy", CreatedUnix: 0}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "past", CreatedUnix: timeutil.TimeStampNow().AddDuration(-48 * time.Hour)}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "recent", CreatedUnix: timeutil.TimeStampNow().AddDuration(-12 * time.Hour)}, - &user_model.Redirect{RedirectUserID: 1, LowerName: "future", CreatedUnix: timeutil.TimeStampNow().AddDuration(time.Hour)}, - &user_model.Redirect{RedirectUserID: 3, LowerName: "recent-org", CreatedUnix: timeutil.TimeStampNow().AddDuration(-12 * time.Hour)}) - require.NoError(t, err) - - testCase := func(t *testing.T, legacy, past, recent, future bool, doerID int64) { - t.Helper() - - ok, _, err := user_model.CanClaimUsername(db.DefaultContext, "legacy", doerID) - require.NoError(t, err) - assert.Equal(t, legacy, ok) - - ok, _, err = user_model.CanClaimUsername(db.DefaultContext, "past", doerID) - require.NoError(t, err) - assert.Equal(t, past, ok) - - ok, _, err = user_model.CanClaimUsername(db.DefaultContext, "recent", doerID) - require.NoError(t, err) - assert.Equal(t, recent, ok) - - ok, _, err = user_model.CanClaimUsername(db.DefaultContext, "future", doerID) - require.NoError(t, err) - assert.Equal(t, future, ok) - } - - t.Run("No cooldown", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 0)() - - testCase(t, true, true, true, true, -1) - }) - - t.Run("1 day cooldown", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 1)() - - testCase(t, true, true, false, false, -1) - }) - - t.Run("1 week cooldown", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 7)() - - testCase(t, true, false, false, false, -1) - - t.Run("Own username", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 7)() - - testCase(t, true, true, true, true, 1) - }) - }) - - t.Run("Organisation", func(t *testing.T) { - defer test.MockVariableValue(&setting.Service.UsernameCooldownPeriod, 1)() - - t.Run("Not owner", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - ok, _, err := user_model.CanClaimUsername(db.DefaultContext, "recent-org", -1) - require.NoError(t, err) - assert.False(t, ok) - }) - t.Run("Owner", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - ok, _, err := user_model.CanClaimUsername(db.DefaultContext, "recent-org", 2) - require.NoError(t, err) - assert.True(t, ok) - }) - }) -} diff --git a/tests/integration/user_test.go b/tests/integration/user_test.go index 5e02f90f9e..e3875ee30e 100644 --- a/tests/integration/user_test.go +++ b/tests/integration/user_test.go @@ -15,22 +15,21 @@ import ( "testing" "time" - auth_model "forgejo.org/models/auth" - "forgejo.org/models/db" - issues_model "forgejo.org/models/issues" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - api "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/modules/translation" - gitea_context "forgejo.org/services/context" - "forgejo.org/services/mailer" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/models/db" + issues_model "code.gitea.io/gitea/models/issues" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/modules/translation" + gitea_context "code.gitea.io/gitea/services/context" + "code.gitea.io/gitea/services/mailer" + "code.gitea.io/gitea/tests" - "github.com/PuerkitoBio/goquery" "github.com/pquerna/otp/totp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -119,7 +118,10 @@ func TestRenameReservedUsername(t *testing.T) { "avatar", "avatars", "captcha", + "commits", + "debug", "devtest", + "error", "explore", "favicon.ico", "ghost", @@ -128,12 +130,16 @@ func TestRenameReservedUsername(t *testing.T) { "manifest.json", "metrics", "milestones", + "new", "notifications", "org", "pulls", + "raw", "repo", "repo-avatars", "robots.txt", + "search", + "serviceworker.js", "ssh_info", "swagger.v1.json", "user", @@ -248,69 +254,6 @@ func testExportUserGPGKeys(t *testing.T, user, expected string) { assert.Equal(t, expected, resp.Body.String()) } -func TestAccessTokenRegenerate(t *testing.T) { - defer tests.PrepareTestEnv(t)() - - session := loginUser(t, "user1") - prevLatestTokenName, prevLatestTokenID := findLatestTokenID(t, session) - - createApplicationSettingsToken(t, session, "TestAccessToken", auth_model.AccessTokenScopeWriteUser) - oldToken := assertAccessToken(t, session) - oldTokenName, oldTokenID := findLatestTokenID(t, session) - - assert.Equal(t, "TestAccessToken", oldTokenName) - - req := NewRequestWithValues(t, "POST", "/user/settings/applications/regenerate", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings/applications"), - "id": strconv.Itoa(oldTokenID), - }) - session.MakeRequest(t, req, http.StatusOK) - - newToken := assertAccessToken(t, session) - newTokenName, newTokenID := findLatestTokenID(t, session) - - assert.NotEqual(t, oldToken, newToken) - assert.Equal(t, oldTokenID, newTokenID) - assert.Equal(t, "TestAccessToken", newTokenName) - - req = NewRequestWithValues(t, "POST", "/user/settings/applications/delete", map[string]string{ - "_csrf": GetCSRF(t, session, "/user/settings/applications"), - "id": strconv.Itoa(newTokenID), - }) - session.MakeRequest(t, req, http.StatusOK) - - latestTokenName, latestTokenID := findLatestTokenID(t, session) - - assert.Less(t, latestTokenID, oldTokenID) - assert.Equal(t, latestTokenID, prevLatestTokenID) - assert.Equal(t, latestTokenName, prevLatestTokenName) - assert.NotEqual(t, "TestAccessToken", latestTokenName) -} - -func findLatestTokenID(t *testing.T, session *TestSession) (string, int) { - req := NewRequest(t, "GET", "/user/settings/applications") - resp := session.MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) - latestTokenName := "" - latestTokenID := 0 - htmlDoc.Find(".delete-button").Each(func(i int, s *goquery.Selection) { - tokenID, exists := s.Attr("data-id") - - if !exists || tokenID == "" { - return - } - - id, err := strconv.Atoi(tokenID) - require.NoError(t, err) - if id > latestTokenID { - latestTokenName = s.Parent().Parent().Find(".flex-item-title").Text() - latestTokenID = id - } - }) - - return latestTokenName, latestTokenID -} - func TestGetUserRss(t *testing.T) { defer tests.PrepareTestEnv(t)() @@ -502,16 +445,8 @@ func TestUserHints(t *testing.T) { func TestUserPronouns(t *testing.T) { defer tests.PrepareTestEnv(t)() - // user1 is admin, using user2 and user10 respectively instead. - // This is explicitly mentioned here because of the unconventional - // variable naming scheme. - firstUserSession := loginUser(t, "user2") - firstUserToken := getTokenForLoggedInUser(t, firstUserSession, auth_model.AccessTokenScopeWriteUser) - - // This user has the HidePronouns setting enabled. - // Check the fixture! - secondUserSession := loginUser(t, "user10") - secondUserToken := getTokenForLoggedInUser(t, secondUserSession, auth_model.AccessTokenScopeWriteUser) + session := loginUser(t, "user2") + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser) adminUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{IsAdmin: true}) adminSession := loginUser(t, adminUser.Name) @@ -521,10 +456,8 @@ func TestUserPronouns(t *testing.T) { t.Run("user", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - // secondUserToken was chosen arbitrarily and should have no impact. - // See next comment. - req := NewRequest(t, "GET", "/api/v1/user").AddTokenAuth(secondUserToken) - resp := firstUserSession.MakeRequest(t, req, http.StatusOK) + req := NewRequest(t, "GET", "/api/v1/user").AddTokenAuth(token) + resp := MakeRequest(t, req, http.StatusOK) // We check the raw JSON, because we want to test the response, not // what it decodes into. Contents doesn't matter, we're testing the @@ -542,22 +475,16 @@ func TestUserPronouns(t *testing.T) { // what it decodes into. Contents doesn't matter, we're testing the // presence only. assert.Contains(t, resp.Body.String(), `"pronouns":`) - - req = NewRequest(t, "GET", "/api/v1/users/user10") - resp = MakeRequest(t, req, http.StatusOK) - - // Same deal here. - assert.Contains(t, resp.Body.String(), `"pronouns":`) }) t.Run("user/settings", func(t *testing.T) { defer tests.PrintCurrentTest(t)() - // Set pronouns first for user2 + // Set pronouns first pronouns := "they/them" req := NewRequestWithJSON(t, "PATCH", "/api/v1/user/settings", &api.UserSettingsOptions{ Pronouns: &pronouns, - }).AddTokenAuth(firstUserToken) + }).AddTokenAuth(token) resp := MakeRequest(t, req, http.StatusOK) // Verify the response @@ -566,7 +493,7 @@ func TestUserPronouns(t *testing.T) { assert.Equal(t, pronouns, user.Pronouns) // Verify retrieving the settings again - req = NewRequest(t, "GET", "/api/v1/user/settings").AddTokenAuth(firstUserToken) + req = NewRequest(t, "GET", "/api/v1/user/settings").AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) DecodeJSON(t, resp, &user) @@ -577,40 +504,22 @@ func TestUserPronouns(t *testing.T) { defer tests.PrintCurrentTest(t)() // Set the pronouns for user2 - pronouns := "he/him" + pronouns := "she/her" req := NewRequestWithJSON(t, "PATCH", "/api/v1/admin/users/user2", &api.EditUserOption{ Pronouns: &pronouns, }).AddTokenAuth(adminToken) resp := MakeRequest(t, req, http.StatusOK) // Verify the API response - var user2 *api.User - DecodeJSON(t, resp, &user2) - assert.Equal(t, pronouns, user2.Pronouns) + var user *api.User + DecodeJSON(t, resp, &user) + assert.Equal(t, pronouns, user.Pronouns) - // Verify via user2 - req = NewRequest(t, "GET", "/api/v1/user").AddTokenAuth(firstUserToken) + // Verify via user2 too + req = NewRequest(t, "GET", "/api/v1/user").AddTokenAuth(token) resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &user2) - assert.Equal(t, pronouns, user2.Pronouns) // TODO: This fails for some reason - - // Set the pronouns for user10 - pronouns = "he/him" - req = NewRequestWithJSON(t, "PATCH", "/api/v1/admin/users/user10", &api.EditUserOption{ - Pronouns: &pronouns, - }).AddTokenAuth(adminToken) - resp = MakeRequest(t, req, http.StatusOK) - - // Verify the API response - var user10 *api.User - DecodeJSON(t, resp, &user10) - assert.Equal(t, pronouns, user10.Pronouns) - - // Verify via user10 - req = NewRequest(t, "GET", "/api/v1/user").AddTokenAuth(secondUserToken) - resp = MakeRequest(t, req, http.StatusOK) - DecodeJSON(t, resp, &user10) - assert.Equal(t, pronouns, user10.Pronouns) + DecodeJSON(t, resp, &user) + assert.Equal(t, pronouns, user.Pronouns) }) }) @@ -618,10 +527,10 @@ func TestUserPronouns(t *testing.T) { defer tests.PrintCurrentTest(t)() // Set the pronouns to a known state via the API - pronouns := "they/them" + pronouns := "she/her" req := NewRequestWithJSON(t, "PATCH", "/api/v1/user/settings", &api.UserSettingsOptions{ Pronouns: &pronouns, - }).AddTokenAuth(firstUserToken) + }).AddTokenAuth(token) MakeRequest(t, req, http.StatusOK) t.Run("profile view", func(t *testing.T) { @@ -632,14 +541,14 @@ func TestUserPronouns(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) userNameAndPronouns := strings.TrimSpace(htmlDoc.Find(".profile-avatar-name .username").Text()) - assert.NotContains(t, userNameAndPronouns, pronouns) + assert.Contains(t, userNameAndPronouns, pronouns) }) t.Run("settings", func(t *testing.T) { defer tests.PrintCurrentTest(t)() req := NewRequest(t, "GET", "/user/settings") - resp := firstUserSession.MakeRequest(t, req, http.StatusOK) + resp := session.MakeRequest(t, req, http.StatusOK) htmlDoc := NewHTMLParser(t, resp.Body) // Check that the field is present @@ -648,12 +557,12 @@ func TestUserPronouns(t *testing.T) { assert.Equal(t, pronouns, pronounField) // Check that updating the field works - newPronouns := "she/her" + newPronouns := "they/them" req = NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ - "_csrf": GetCSRF(t, firstUserSession, "/user/settings"), + "_csrf": GetCSRF(t, session, "/user/settings"), "pronouns": newPronouns, }) - firstUserSession.MakeRequest(t, req, http.StatusSeeOther) + session.MakeRequest(t, req, http.StatusSeeOther) user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user2"}) assert.Equal(t, newPronouns, user2.Pronouns) @@ -984,27 +893,11 @@ func TestUserActivate(t *testing.T) { assert.False(t, authToken.IsExpired()) assert.EqualValues(t, authToken.HashedValidator, auth_model.HashValidator(rawValidator)) - t.Run("No password", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + req = NewRequest(t, "POST", "/user/activate?code="+code) + session.MakeRequest(t, req, http.StatusOK) - req = NewRequest(t, "POST", "/user/activate?code="+code) - session.MakeRequest(t, req, http.StatusOK) - - unittest.AssertExistsIf(t, true, &auth_model.AuthorizationToken{ID: authToken.ID}) - unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "doesnotexist"}, "is_active = false") - }) - - t.Run("With password", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() - - req = NewRequestWithValues(t, "POST", "/user/activate?code="+code, map[string]string{ - "password": "examplePassword!1", - }) - session.MakeRequest(t, req, http.StatusSeeOther) - - unittest.AssertExistsIf(t, false, &auth_model.AuthorizationToken{ID: authToken.ID}) - unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "doesnotexist"}, "is_active = true") - }) + unittest.AssertNotExistsBean(t, &auth_model.AuthorizationToken{ID: authToken.ID}) + unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "doesnotexist", IsActive: true}) } func TestUserPasswordReset(t *testing.T) { diff --git a/tests/integration/version_test.go b/tests/integration/version_test.go index 9db586ee97..144471adb2 100644 --- a/tests/integration/version_test.go +++ b/tests/integration/version_test.go @@ -7,12 +7,12 @@ import ( "net/http" "testing" - auth_model "forgejo.org/models/auth" - "forgejo.org/modules/setting" - "forgejo.org/modules/structs" - "forgejo.org/modules/test" - "forgejo.org/routers" - "forgejo.org/tests" + auth_model "code.gitea.io/gitea/models/auth" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/view_test.go b/tests/integration/view_test.go index 80371b84ce..ff2f2bdfd0 100644 --- a/tests/integration/view_test.go +++ b/tests/integration/view_test.go @@ -10,13 +10,13 @@ import ( "strings" "testing" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/modules/test" - files_service "forgejo.org/services/repository/files" - "forgejo.org/tests" + unit_model "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/setting" + "code.gitea.io/gitea/modules/test" + files_service "code.gitea.io/gitea/services/repository/files" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) @@ -131,7 +131,7 @@ func TestAmbiguousCharacterDetection(t *testing.T) { }) } -func TestCommitListActions(t *testing.T) { +func TestInHistoryButton(t *testing.T) { onGiteaRun(t, func(t *testing.T, u *url.URL) { user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) session := loginUser(t, user2.Name) @@ -164,7 +164,6 @@ func TestCommitListActions(t *testing.T) { htmlDoc.AssertElement(t, fmt.Sprintf(".commit-list a[href^='/%s/src/commit/']", repo.FullName()), false) }) - fileDiffSelector := fmt.Sprintf(".commit-list a[href='/%s/commit/%s?files=test.sh']", repo.FullName(), commitID) t.Run("Commit list", func(t *testing.T) { defer tests.PrintCurrentTest(t)() @@ -173,7 +172,6 @@ func TestCommitListActions(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) htmlDoc.AssertElement(t, fmt.Sprintf(".commit-list a[href='/%s/src/commit/%s']", repo.FullName(), commitID), true) - htmlDoc.AssertElement(t, fileDiffSelector, false) }) t.Run("File history", func(t *testing.T) { @@ -184,7 +182,6 @@ func TestCommitListActions(t *testing.T) { htmlDoc := NewHTMLParser(t, resp.Body) htmlDoc.AssertElement(t, fmt.Sprintf(".commit-list a[href='/%s/src/commit/%s/test.sh']", repo.FullName(), commitID), true) - htmlDoc.AssertElement(t, fileDiffSelector, true) }) }) } diff --git a/tests/integration/webfinger_test.go b/tests/integration/webfinger_test.go index 053528d919..18f509aca9 100644 --- a/tests/integration/webfinger_test.go +++ b/tests/integration/webfinger_test.go @@ -9,10 +9,10 @@ import ( "net/url" "testing" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/setting" - "forgejo.org/tests" + "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" "github.com/stretchr/testify/assert" ) diff --git a/tests/integration/webhook_test.go b/tests/integration/webhook_test.go index 6d92a16dd8..60d4d48d7c 100644 --- a/tests/integration/webhook_test.go +++ b/tests/integration/webhook_test.go @@ -8,17 +8,17 @@ import ( "net/url" "testing" - "forgejo.org/models/db" - repo_model "forgejo.org/models/repo" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - webhook_model "forgejo.org/models/webhook" - "forgejo.org/modules/git" - "forgejo.org/modules/gitrepo" - "forgejo.org/modules/json" - webhook_module "forgejo.org/modules/webhook" - "forgejo.org/services/release" - "forgejo.org/tests" + "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" + webhook_model "code.gitea.io/gitea/models/webhook" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/gitrepo" + "code.gitea.io/gitea/modules/json" + webhook_module "code.gitea.io/gitea/modules/webhook" + "code.gitea.io/gitea/services/release" + "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/tests/integration/xss_test.go b/tests/integration/xss_test.go index 94cbeaf331..70038cf560 100644 --- a/tests/integration/xss_test.go +++ b/tests/integration/xss_test.go @@ -4,16 +4,25 @@ package integration import ( + "context" "fmt" "net/http" + "net/url" + "os" + "path/filepath" "testing" + "time" - issues_model "forgejo.org/models/issues" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/tests" + 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/git" + "code.gitea.io/gitea/tests" + gogit "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/object" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestXSSUserFullName(t *testing.T) { @@ -41,34 +50,72 @@ func TestXSSUserFullName(t *testing.T) { } func TestXSSWikiLastCommitInfo(t *testing.T) { - defer tests.PrepareTestEnv(t)() - // Check on page view. - t.Run("Page view", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + onGiteaRun(t, func(t *testing.T, u *url.URL) { + // Prepare the environment. + dstPath := t.TempDir() + r := fmt.Sprintf("%suser2/repo1.wiki.git", u.String()) + u, err := url.Parse(r) + require.NoError(t, err) + u.User = url.UserPassword("user2", userPassword) + require.NoError(t, git.CloneWithArgs(context.Background(), git.AllowLFSFiltersArgs(), u.String(), dstPath, git.CloneRepoOptions{})) - req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/XSS") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) + // Use go-git here, because using git wouldn't work, it has code to remove + // `<`, `>` and `\n` in user names. Even though this is permitted and + // wouldn't result in a error by a Git server. + gitRepo, err := gogit.PlainOpen(dstPath) + require.NoError(t, err) - htmlDoc.AssertElement(t, "script.evil", false) - assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) - }) + w, err := gitRepo.Worktree() + require.NoError(t, err) - // Check on revisions page. - t.Run("Revision page", func(t *testing.T) { - defer tests.PrintCurrentTest(t)() + filename := filepath.Join(dstPath, "Home.md") + err = os.WriteFile(filename, []byte("Oh, a XSS attack?"), 0o644) + require.NoError(t, err) - req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/XSS?action=_revision") - resp := MakeRequest(t, req, http.StatusOK) - htmlDoc := NewHTMLParser(t, resp.Body) + _, err = w.Add("Home.md") + require.NoError(t, err) - htmlDoc.AssertElement(t, "script.evil", false) - assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) + _, err = w.Commit("Yay XSS", &gogit.CommitOptions{ + Author: &object.Signature{ + Name: `Gusted`, + Email: "valid@example.org", + When: time.Date(2024, time.January, 31, 0, 0, 0, 0, time.UTC), + }, + }) + require.NoError(t, err) + + // Push. + _, _, err = git.NewCommand(git.DefaultContext, "push").AddArguments(git.ToTrustedCmdArgs([]string{"origin", "master"})...).RunStdString(&git.RunOpts{Dir: dstPath}) + require.NoError(t, err) + + // Check on page view. + t.Run("Page view", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/Home") + resp := MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + htmlDoc.AssertElement(t, "script.evil", false) + assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) + }) + + // Check on revisions page. + t.Run("Revision page", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + req := NewRequest(t, http.MethodGet, "/user2/repo1/wiki/Home?action=_revision") + resp := MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + htmlDoc.AssertElement(t, "script.evil", false) + assert.Contains(t, htmlDoc.Find(".ui.sub.header").Text(), `Gusted edited this page 2024-01-31`) + }) }) } func TestXSSReviewDismissed(t *testing.T) { - defer unittest.OverrideFixtures("tests/integration/fixtures/TestXSSReviewDismissed")() + defer tests.AddFixtures("tests/integration/fixtures/TestXSSReviewDismissed/")() defer tests.PrepareTestEnv(t)() review := unittest.AssertExistsAndLoadBean(t, &issues_model.Review{ID: 1000}) diff --git a/tests/mysql.ini.tmpl b/tests/mysql.ini.tmpl index b8320265ab..7f1f8ab68c 100644 --- a/tests/mysql.ini.tmpl +++ b/tests/mysql.ini.tmpl @@ -116,6 +116,3 @@ REPLY_TO_ADDRESS = incoming+%{token}@localhost [actions] ENABLED = true - -[ui.notification] -EVENT_SOURCE_UPDATE_TIME = 1s diff --git a/tests/pgsql.ini.tmpl b/tests/pgsql.ini.tmpl index 781508a648..d5f1881fcc 100644 --- a/tests/pgsql.ini.tmpl +++ b/tests/pgsql.ini.tmpl @@ -112,7 +112,7 @@ MINIO_BASE_PATH = avatars/ MINIO_BASE_PATH = repo-avatars/ [storage] -STORAGE_TYPE = {{TEST_STORAGE_TYPE}} +STORAGE_TYPE = minio SERVE_DIRECT = false MINIO_ENDPOINT = minio:9000 MINIO_ACCESS_KEY_ID = 123456 @@ -130,6 +130,3 @@ ENABLED = true [actions] ENABLED = true - -[ui.notification] -EVENT_SOURCE_UPDATE_TIME = 1s diff --git a/tests/sqlite.ini.tmpl b/tests/sqlite.ini.tmpl index 231c0d19c2..3b8a411f0b 100644 --- a/tests/sqlite.ini.tmpl +++ b/tests/sqlite.ini.tmpl @@ -5,7 +5,6 @@ RUN_MODE = prod [database] DB_TYPE = sqlite3 PATH = tests/{{TEST_TYPE}}/gitea-{{TEST_TYPE}}-sqlite/gitea.db -SQLITE_JOURNAL_MODE = MEMORY [indexer] REPO_INDEXER_ENABLED = true @@ -117,6 +116,3 @@ RENDER_CONTENT_MODE=sanitized [actions] ENABLED = true - -[ui.notification] -EVENT_SOURCE_UPDATE_TIME = 1s diff --git a/tests/test_utils.go b/tests/test_utils.go index 6c7eb16b21..ff87da7ac8 100644 --- a/tests/test_utils.go +++ b/tests/test_utils.go @@ -18,27 +18,27 @@ import ( "testing" "time" - "forgejo.org/models/db" - packages_model "forgejo.org/models/packages" - repo_model "forgejo.org/models/repo" - unit_model "forgejo.org/models/unit" - "forgejo.org/models/unittest" - user_model "forgejo.org/models/user" - "forgejo.org/modules/base" - "forgejo.org/modules/git" - "forgejo.org/modules/graceful" - "forgejo.org/modules/log" - "forgejo.org/modules/optional" - "forgejo.org/modules/process" - repo_module "forgejo.org/modules/repository" - "forgejo.org/modules/setting" - "forgejo.org/modules/storage" - "forgejo.org/modules/testlogger" - "forgejo.org/modules/util" - "forgejo.org/routers" - repo_service "forgejo.org/services/repository" - files_service "forgejo.org/services/repository/files" - wiki_service "forgejo.org/services/wiki" + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + repo_model "code.gitea.io/gitea/models/repo" + unit_model "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/base" + "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/graceful" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/process" + repo_module "code.gitea.io/gitea/modules/repository" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/testlogger" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/routers" + repo_service "code.gitea.io/gitea/services/repository" + files_service "code.gitea.io/gitea/services/repository/files" + wiki_service "code.gitea.io/gitea/services/wiki" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -50,8 +50,6 @@ func exitf(format string, args ...any) { os.Exit(1) } -var preparedDir string - func InitTest(requireGitea bool) { log.RegisterEventWriter("test", testlogger.NewTestLoggerWriter) @@ -68,6 +66,9 @@ func InitTest(requireGitea bool) { setting.CustomPath = filepath.Join(setting.AppWorkPath, "custom") if requireGitea { giteaBinary := "gitea" + if setting.IsWindows { + giteaBinary += ".exe" + } setting.AppPath = path.Join(giteaRoot, giteaBinary) if _, err := os.Stat(setting.AppPath); err != nil { exitf("Could not find gitea binary at %s", setting.AppPath) @@ -176,46 +177,6 @@ func InitTest(requireGitea bool) { log.Fatal("db.Exec: CREATE SCHEMA: %v", err) } } - - case setting.Database.Type.IsSQLite3(): - setting.Database.Path = ":memory:" - } - - setting.Repository.Local.LocalCopyPath = os.TempDir() - dir, err := os.MkdirTemp("", "prepared-forgejo") - if err != nil { - log.Fatal("os.MkdirTemp: %v", err) - } - preparedDir = dir - - setting.Repository.Local.LocalCopyPath, err = os.MkdirTemp("", "local-upload") - if err != nil { - log.Fatal("os.MkdirTemp: %v", err) - } - - if err := unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), dir); err != nil { - log.Fatal("os.RemoveAll: %v", err) - } - ownerDirs, err := os.ReadDir(dir) - if err != nil { - log.Fatal("os.ReadDir: %v", err) - } - - for _, ownerDir := range ownerDirs { - if !ownerDir.Type().IsDir() { - continue - } - repoDirs, err := os.ReadDir(filepath.Join(dir, ownerDir.Name())) - if err != nil { - log.Fatal("os.ReadDir: %v", err) - } - for _, repoDir := range repoDirs { - _ = os.MkdirAll(filepath.Join(dir, ownerDir.Name(), repoDir.Name(), "objects", "pack"), 0o755) - _ = os.MkdirAll(filepath.Join(dir, ownerDir.Name(), repoDir.Name(), "objects", "info"), 0o755) - _ = os.MkdirAll(filepath.Join(dir, ownerDir.Name(), repoDir.Name(), "refs", "heads"), 0o755) - _ = os.MkdirAll(filepath.Join(dir, ownerDir.Name(), repoDir.Name(), "refs", "tag"), 0o755) - _ = os.MkdirAll(filepath.Join(dir, ownerDir.Name(), repoDir.Name(), "refs", "pull"), 0o755) - } } routers.InitWebInstalled(graceful.GetManager().HammerContext()) @@ -265,28 +226,47 @@ func cancelProcesses(t testing.TB, delay time.Duration) { t.Logf("PrepareTestEnv: all processes cancelled within %s", time.Since(start)) } -func PrepareGitRepoDirectory(t testing.TB) { - setting.RepoRootPath = t.TempDir() - require.NoError(t, unittest.CopyDir(preparedDir, setting.RepoRootPath)) -} +func PrepareTestEnv(t testing.TB, skip ...int) func() { + t.Helper() + ourSkip := 1 + if len(skip) > 0 { + ourSkip += skip[0] + } + deferFn := PrintCurrentTest(t, ourSkip) -func PrepareArtifactsStorage(t testing.TB) { - // prepare actions artifacts directory and files - require.NoError(t, storage.Clean(storage.ActionsArtifacts)) + // kill all background processes to prevent them from interfering with the fixture loading + // see https://codeberg.org/forgejo/forgejo/issues/2962 + cancelProcesses(t, 30*time.Second) + t.Cleanup(func() { cancelProcesses(t, 0) }) // cancel remaining processes in a non-blocking way - s, err := storage.NewStorage(setting.LocalStorageType, &setting.Storage{ - Path: filepath.Join(filepath.Dir(setting.AppPath), "tests", "testdata", "data", "artifacts"), - }) - require.NoError(t, err) - require.NoError(t, s.IterateObjects("", func(p string, obj storage.Object) error { - _, err = storage.Copy(storage.ActionsArtifacts, p, s, p) - return err - })) -} + // load database fixtures + require.NoError(t, unittest.LoadFixtures()) + + // load git repo fixtures + require.NoError(t, util.RemoveAll(setting.RepoRootPath)) + require.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath)) + ownerDirs, err := os.ReadDir(setting.RepoRootPath) + if err != nil { + require.NoError(t, err, "unable to read the new repo root: %v\n", err) + } + for _, ownerDir := range ownerDirs { + if !ownerDir.Type().IsDir() { + continue + } + repoDirs, err := os.ReadDir(filepath.Join(setting.RepoRootPath, ownerDir.Name())) + if err != nil { + require.NoError(t, err, "unable to read the new repo root: %v\n", err) + } + for _, repoDir := range repoDirs { + _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "objects", "pack"), 0o755) + _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "objects", "info"), 0o755) + _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "heads"), 0o755) + _ = os.MkdirAll(filepath.Join(setting.RepoRootPath, ownerDir.Name(), repoDir.Name(), "refs", "tag"), 0o755) + } + } -func PrepareLFSStorage(t testing.TB) { // load LFS object fixtures - // (LFS storage can be on any of several backends, including remote servers, so init it with the storage API) + // (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API) lfsFixtures, err := storage.NewStorage(setting.LocalStorageType, &setting.Storage{ Path: filepath.Join(filepath.Dir(setting.AppPath), "tests/gitea-lfs-meta"), }) @@ -296,9 +276,7 @@ func PrepareLFSStorage(t testing.TB) { _, err := storage.Copy(storage.LFS, path, lfsFixtures, path) return err })) -} -func PrepareCleanPackageData(t testing.TB) { // clear all package data require.NoError(t, db.TruncateBeans(db.DefaultContext, &packages_model.Package{}, @@ -310,28 +288,17 @@ func PrepareCleanPackageData(t testing.TB) { &packages_model.PackageCleanupRule{}, )) require.NoError(t, storage.Clean(storage.Packages)) -} -func PrepareTestEnv(t testing.TB, skip ...int) func() { - t.Helper() - deferFn := PrintCurrentTest(t, util.OptionalArg(skip)+1) - - cancelProcesses(t, 30*time.Second) - t.Cleanup(func() { cancelProcesses(t, 0) }) // cancel remaining processes in a non-blocking way - - // load database fixtures - require.NoError(t, unittest.LoadFixtures()) - - // do not add more Prepare* functions here, only call necessary ones in the related test functions - PrepareGitRepoDirectory(t) - PrepareLFSStorage(t) - PrepareCleanPackageData(t) return deferFn } func PrintCurrentTest(t testing.TB, skip ...int) func() { t.Helper() - return testlogger.PrintCurrentTest(t, util.OptionalArg(skip)+1) + actualSkip := 1 + if len(skip) > 0 { + actualSkip = skip[0] + 1 + } + return testlogger.PrintCurrentTest(t, actualSkip) } // Printf takes a format and args and prints the string to os.Stdout @@ -339,6 +306,16 @@ func Printf(format string, args ...any) { testlogger.Printf(format, args...) } +func AddFixtures(dirs ...string) func() { + return unittest.OverrideFixtures( + unittest.FixturesOptions{ + Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"), + Base: setting.AppWorkPath, + Dirs: dirs, + }, + ) +} + type DeclarativeRepoOptions struct { Name optional.Option[string] EnabledUnits optional.Option[[]unit_model.Type] diff --git a/tests/testdata/data/artifacts/26/1/1712166500347189545.chunk b/tests/testdata/data/artifacts/26/1/1712166500347189545.chunk deleted file mode 100644 index bc7c569e9e..0000000000 --- a/tests/testdata/data/artifacts/26/1/1712166500347189545.chunk +++ /dev/null @@ -1 +0,0 @@ -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA \ No newline at end of file diff --git a/tests/testdata/data/artifacts/26/19/1712348022422036662.chunk b/tests/testdata/data/artifacts/26/19/1712348022422036662.chunk deleted file mode 100644 index b4fb0b0783..0000000000 --- a/tests/testdata/data/artifacts/26/19/1712348022422036662.chunk +++ /dev/null @@ -1 +0,0 @@ -BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \ No newline at end of file diff --git a/tests/testdata/data/artifacts/26/20/1712348022423431524.chunk b/tests/testdata/data/artifacts/26/20/1712348022423431524.chunk deleted file mode 100644 index 45b2320ec4..0000000000 --- a/tests/testdata/data/artifacts/26/20/1712348022423431524.chunk +++ /dev/null @@ -1 +0,0 @@ -CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC \ No newline at end of file diff --git a/tests/testdata/data/artifacts/27/5/1730330775594233150.chunk b/tests/testdata/data/artifacts/27/5/1730330775594233150.chunk deleted file mode 100644 index b1d6b8e046..0000000000 --- a/tests/testdata/data/artifacts/27/5/1730330775594233150.chunk +++ /dev/null @@ -1 +0,0 @@ -DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD \ No newline at end of file diff --git a/tools/generate-images.js b/tools/generate-images.js index d28e0916f7..0bd3af29e4 100755 --- a/tools/generate-images.js +++ b/tools/generate-images.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import imageminZopfli from 'imagemin-zopfli'; // eslint-disable-line import-x/no-unresolved -import {loadSVGFromString, Canvas, Rect, util} from 'fabric/node'; // eslint-disable-line import-x/no-unresolved +import imageminZopfli from 'imagemin-zopfli'; // eslint-disable-line i/no-unresolved +import {loadSVGFromString, Canvas, Rect, util} from 'fabric/node'; // eslint-disable-line i/no-unresolved import {optimize} from 'svgo'; import {readFile, writeFile} from 'node:fs/promises'; import {argv, exit} from 'node:process'; diff --git a/tools/migrate_locales.sh b/tools/migrate_locales.sh deleted file mode 100755 index f02fe702cc..0000000000 --- a/tools/migrate_locales.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash - -# Copyright 2024 The Forgejo Authors. All rights reserved. -# SPDX-License-Identifier: MIT - -if [ -z "$1" ] || [ -z "$2" ] -then - echo "USAGE: $0 section key [key1 [keyN]]" - exit 1 -fi - -if ! [ -d ../options/locale_next ] -then - echo 'Call this script from the `tools` directory.' - exit 1 -fi - -destsection="$1" -keyJSON="$destsection.$2" -key1="" -keyN="" -if [ -n "$3" ] -then - key1="$3" -else - key1="$2" -fi -if [ -n "$4" ] -then - keyN="$4" -fi - -cd ../options/locale - -# Migrate the string in one file. -function process() { - file="$1" - exec 3<$file - - val1="" - valN="" - cursection="" - line1=0 - lineN=0 - lineNumber=0 - - # Parse the file - while read -u 3 line - do - ((++lineNumber)) - if [[ $line =~ ^\[[-._a-zA-Z0-9]+\]$ ]] - then - cursection="${line#[}" - cursection="${cursection%]}" - elif [ "$cursection" = "$destsection" ] - then - key="${line%%=*}" - value="${line#*=}" - key="$(echo $key)" # Trim leading/trailing whitespace - value="$(echo $value)" - - if [ "$key" = "$key1" ] - then - val1="$value" - line1=$lineNumber - fi - if [ -n "$keyN" ] && [ "$key" = "$keyN" ] - then - valN="$value" - lineN=$lineNumber - fi - - if [ -n "$val1" ] && ( [ -n "$valN" ] || [ -z "$keyN" ] ) - then - # Found all desired strings - break - fi - fi - done - - if [ -n "$val1" ] || [ -n "$valN" ] - then - localename="${file#locale_}" - localename="${localename%.ini}" - localename="${localename%-*}" - - if [ "$file" = "locale_en-US.ini" ] - then - # Delete migrated string from source file - if [ $line1 -gt 0 ] && [ $lineN -gt 0 ] && [ $lineN -ne $line1 ] - then - sed -i "${line1}d;${lineN}d" "$file" - elif [ $line1 -gt 0 ] - then - sed -i "${line1}d" "$file" - elif [ $lineN -gt 0 ] - then - sed -i "${lineN}d" "$file" - fi - fi - - # Write JSON - jsonfile="../locale_next/${file/.ini/.json}" - - pluralform="other" - oneform="one" - case $localename in - "be" | "bs" | "cnr" | "csb" | "hr" | "lt" | "pl" | "ru" | "sr" | "szl" | "uk" | "wen") - # These languages have no "other" form and use "many" instead. - pluralform="many" - ;; - "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") - # These languages have no singular form. - oneform="" - ;; - *) - ;; - esac - - content="" - if [ -z "$keyN" ] - then - content="$(jq --arg val "$val1" ".$keyJSON = \$val" < "$jsonfile")" - else - object='{}' - if [ -n "$val1" ] && [ -n "$oneform" ] - then - object=$(jq --arg val "$val1" ".$oneform = \$val" <<< "$object") - fi - if [ -n "$valN" ] - then - object=$(jq --arg val "$valN" ".$pluralform = \$val" <<< "$object") - fi - content="$(jq --argjson val "$object" ".$keyJSON = \$val" < "$jsonfile")" - fi - jq . <<< "$content" > "$jsonfile" - fi -} - -for file in *.ini -do - process "$file" & -done -wait - diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 88130812fe..0000000000 --- a/tsconfig.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "include": [ - "*", - "tests/e2e/**/*", - "tools/**/*", - "web_src/js/**/*", - ], - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["dom", "dom.iterable", "dom.asynciterable", "esnext"], - "allowImportingTsExtensions": true, - "allowJs": true, - "allowSyntheticDefaultImports": true, - "alwaysStrict": true, - "esModuleInterop": true, - "isolatedModules": true, - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "verbatimModuleSyntax": true, - "stripInternal": true, - "strict": false, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noPropertyAccessFromIndexSignature": false, - "exactOptionalPropertyTypes": false, - } -} diff --git a/vitest.config.ts b/vitest.config.js similarity index 100% rename from vitest.config.ts rename to vitest.config.js diff --git a/web_src/css/base.css b/web_src/css/base.css index ad6e8a2a24..4c1317ba79 100644 --- a/web_src/css/base.css +++ b/web_src/css/base.css @@ -250,20 +250,6 @@ h1.error-code { gap: 0.5rem; } -.button-sequence { - display: flex; - flex-flow: wrap; - gap: 0.5em; -} - -.button-sequence.right { - justify-content: end; -} - -.button-sequence .ui.button { - margin: 0 !important; -} - .button-row .ui.button { margin-right: 0; } @@ -652,6 +638,97 @@ img.ui.avatar, background: var(--color-active); } +.ui.form .fields.error .field textarea, +.ui.form .fields.error .field select, +.ui.form .fields.error .field input:not([type]), +.ui.form .fields.error .field input[type="date"], +.ui.form .fields.error .field input[type="datetime-local"], +.ui.form .fields.error .field input[type="email"], +.ui.form .fields.error .field input[type="number"], +.ui.form .fields.error .field input[type="password"], +.ui.form .fields.error .field input[type="search"], +.ui.form .fields.error .field input[type="tel"], +.ui.form .fields.error .field input[type="time"], +.ui.form .fields.error .field input[type="text"], +.ui.form .fields.error .field input[type="file"], +.ui.form .fields.error .field input[type="url"], +.ui.form .fields.error .field .ui.dropdown, +.ui.form .fields.error .field .ui.dropdown .item, +.ui.form .field.error .ui.dropdown, +.ui.form .field.error .ui.dropdown .text, +.ui.form .field.error .ui.dropdown .item, +.ui.form .field.error textarea, +.ui.form .field.error select, +.ui.form .field.error input:not([type]), +.ui.form .field.error input[type="date"], +.ui.form .field.error input[type="datetime-local"], +.ui.form .field.error input[type="email"], +.ui.form .field.error input[type="number"], +.ui.form .field.error input[type="password"], +.ui.form .field.error input[type="search"], +.ui.form .field.error input[type="tel"], +.ui.form .field.error input[type="time"], +.ui.form .field.error input[type="text"], +.ui.form .field.error input[type="file"], +.ui.form .field.error input[type="url"], +.ui.form .field.error select:focus, +.ui.form .field.error input:not([type]):focus, +.ui.form .field.error input[type="date"]:focus, +.ui.form .field.error input[type="datetime-local"]:focus, +.ui.form .field.error input[type="email"]:focus, +.ui.form .field.error input[type="number"]:focus, +.ui.form .field.error input[type="password"]:focus, +.ui.form .field.error input[type="search"]:focus, +.ui.form .field.error input[type="tel"]:focus, +.ui.form .field.error input[type="time"]:focus, +.ui.form .field.error input[type="text"]:focus, +.ui.form .field.error input[type="file"]:focus, +.ui.form .field.error input[type="url"]:focus { + background-color: var(--color-error-bg); + border-color: var(--color-error-border); + color: var(--color-error-text); +} + +.ui.form .fields.error .field .ui.dropdown, +.ui.form .field.error .ui.dropdown, +.ui.form .fields.error .field .ui.dropdown:hover, +.ui.form .field.error .ui.dropdown:hover { + border-color: var(--color-error-border) !important; +} + +.ui.form .fields.error .field .ui.dropdown .menu .item:hover, +.ui.form .field.error .ui.dropdown .menu .item:hover { + background-color: var(--color-error-bg-hover); +} + +.ui.form .fields.error .field .ui.dropdown .menu .active.item, +.ui.form .field.error .ui.dropdown .menu .active.item { + background-color: var(--color-error-bg-active) !important; +} + +.ui.form .fields.error .dropdown .menu, +.ui.form .field.error .dropdown .menu { + border-color: var(--color-error-border) !important; +} + +input:-webkit-autofill, +input:-webkit-autofill:focus, +input:-webkit-autofill:hover, +input:-webkit-autofill:active, +.ui.form .field.field input:-webkit-autofill, +.ui.form .field.field input:-webkit-autofill:focus, +.ui.form .field.field input:-webkit-autofill:hover, +.ui.form .field.field input:-webkit-autofill:active { + -webkit-background-clip: text; + -webkit-text-fill-color: var(--color-text); + box-shadow: 0 0 0 100px var(--color-primary-light-6) inset !important; + border-color: var(--color-primary-light-4) !important; +} + +.ui.form .field.muted { + opacity: var(--opacity-disabled); +} + .text.primary { color: var(--color-primary) !important; } @@ -948,15 +1025,7 @@ img.ui.avatar, @media (max-width: 767.98px) { .ui.pagination.menu .item:not(.active,.navigation), .ui.pagination.menu .item.navigation span.navigation_label { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; + display: none; } } @@ -1058,7 +1127,6 @@ overflow-menu .overflow-menu-items { overflow-menu .overflow-menu-items .item { margin-bottom: 0 !important; /* reset fomantic's margin, because the active menu has special bottom border */ - height: 100%; } overflow-menu .ui.label { diff --git a/web_src/css/dashboard.css b/web_src/css/dashboard.css index 3a1fc34ed3..4bb9fa38bf 100644 --- a/web_src/css/dashboard.css +++ b/web_src/css/dashboard.css @@ -79,7 +79,3 @@ .dashboard .secondary-nav .ui.dropdown { max-width: 100%; } - -.dashboard .help { - color: var(--color-secondary-dark-8); -} diff --git a/web_src/css/features/gitgraph.css b/web_src/css/features/gitgraph.css index 726ac7e9e2..4da871da61 100644 --- a/web_src/css/features/gitgraph.css +++ b/web_src/css/features/gitgraph.css @@ -23,18 +23,6 @@ #git-graph-heading { align-items: center; } - - #git-graph-heading-left { - margin-right: 1rem; - } - - #git-graph-heading h2 { - flex-shrink: 0; - } - - #git-graph-container #flow-select-refs-dropdown { - min-width: 250px; - } } @media (max-width: 767.98px) { @@ -46,10 +34,15 @@ #git-graph-heading-left { margin-bottom: 1rem; } + + h2, + #flow-select-refs-dropdown { + max-width: 100%; + } } #git-graph-container #flow-select-refs-dropdown { - flex-wrap: wrap; + min-width: 250px; } #git-graph-container #flow-select-refs-dropdown .ui.label { diff --git a/web_src/css/form.css b/web_src/css/form.css index 916d76fd0c..fb9364db45 100644 --- a/web_src/css/form.css +++ b/web_src/css/form.css @@ -1,5 +1,5 @@ fieldset { - margin: 0.2em 0 0.3em; + margin: 0.5em 0 1em; padding: 0; } @@ -8,12 +8,6 @@ fieldset legend { margin-bottom: 0.75em; } -fieldset + fieldset > legend { - width: 100%; - padding-top: 1em; - border-top: 1px solid var(--color-secondary); -} - fieldset label { display: block; margin-bottom: 0.6em; @@ -24,11 +18,6 @@ fieldset label:has(input[type="number"]) { font-weight: var(--font-weight-medium); } -/* override inline style on custom input elements */ -fieldset label .ui.dropdown { - width: 100% !important; -} - fieldset .help { font-weight: var(--font-weight-normal); } @@ -38,17 +27,9 @@ fieldset .help { padding-bottom: 0; } -fieldset label > input, -fieldset label > textarea, -fieldset label > .ui.dropdown, -fieldset label + .ui.dropdown { - margin-top: 0.28rem !important; -} - -fieldset label > input[type="checkbox"], -fieldset label > input[type="radio"] { +fieldset input[type="checkbox"], +fieldset input[type="radio"] { margin-right: 0.75em; - margin-top: 0 !important; vertical-align: initial !important; /* overrides a semantic.css rule, remove when obsolete */ } @@ -161,101 +142,6 @@ textarea:focus, color: var(--color-input-text); } -/* error messages */ -fieldset label.error textarea, -fieldset label.error select, -fieldset label.error input, -.ui.form .fields.error .field textarea, -.ui.form .fields.error .field select, -.ui.form .fields.error .field input:not([type]), -.ui.form .fields.error .field input[type="date"], -.ui.form .fields.error .field input[type="datetime-local"], -.ui.form .fields.error .field input[type="email"], -.ui.form .fields.error .field input[type="number"], -.ui.form .fields.error .field input[type="password"], -.ui.form .fields.error .field input[type="search"], -.ui.form .fields.error .field input[type="tel"], -.ui.form .fields.error .field input[type="time"], -.ui.form .fields.error .field input[type="text"], -.ui.form .fields.error .field input[type="file"], -.ui.form .fields.error .field input[type="url"], -.ui.form .fields.error .field .ui.dropdown, -.ui.form .fields.error .field .ui.dropdown .item, -.ui.form .field.error .ui.dropdown, -.ui.form .field.error .ui.dropdown .text, -.ui.form .field.error .ui.dropdown .item, -.ui.form .field.error textarea, -.ui.form .field.error select, -.ui.form .field.error input:not([type]), -.ui.form .field.error input[type="date"], -.ui.form .field.error input[type="datetime-local"], -.ui.form .field.error input[type="email"], -.ui.form .field.error input[type="number"], -.ui.form .field.error input[type="password"], -.ui.form .field.error input[type="search"], -.ui.form .field.error input[type="tel"], -.ui.form .field.error input[type="time"], -.ui.form .field.error input[type="text"], -.ui.form .field.error input[type="file"], -.ui.form .field.error input[type="url"], -.ui.form .field.error select:focus, -.ui.form .field.error input:not([type]):focus, -.ui.form .field.error input[type="date"]:focus, -.ui.form .field.error input[type="datetime-local"]:focus, -.ui.form .field.error input[type="email"]:focus, -.ui.form .field.error input[type="number"]:focus, -.ui.form .field.error input[type="password"]:focus, -.ui.form .field.error input[type="search"]:focus, -.ui.form .field.error input[type="tel"]:focus, -.ui.form .field.error input[type="time"]:focus, -.ui.form .field.error input[type="text"]:focus, -.ui.form .field.error input[type="file"]:focus, -.ui.form .field.error input[type="url"]:focus { - background-color: var(--color-error-bg); - border-color: var(--color-error-border); - color: var(--color-error-text); -} - -.ui.form .fields.error .field .ui.dropdown, -.ui.form .field.error .ui.dropdown, -.ui.form .fields.error .field .ui.dropdown:hover, -.ui.form .field.error .ui.dropdown:hover { - border-color: var(--color-error-border) !important; -} - -.ui.form .fields.error .field .ui.dropdown .menu .item:hover, -.ui.form .field.error .ui.dropdown .menu .item:hover { - background-color: var(--color-error-bg-hover); -} - -.ui.form .fields.error .field .ui.dropdown .menu .active.item, -.ui.form .field.error .ui.dropdown .menu .active.item { - background-color: var(--color-error-bg-active) !important; -} - -.ui.form .fields.error .dropdown .menu, -.ui.form .field.error .dropdown .menu { - border-color: var(--color-error-border) !important; -} - -input:-webkit-autofill, -input:-webkit-autofill:focus, -input:-webkit-autofill:hover, -input:-webkit-autofill:active, -.ui.form .field.field input:-webkit-autofill, -.ui.form .field.field input:-webkit-autofill:focus, -.ui.form .field.field input:-webkit-autofill:hover, -.ui.form .field.field input:-webkit-autofill:active { - -webkit-background-clip: text; - -webkit-text-fill-color: var(--color-text); - box-shadow: 0 0 0 100px var(--color-primary-light-6) inset !important; - border-color: var(--color-primary-light-4) !important; -} - -.ui.form .field.muted { - opacity: var(--opacity-disabled); -} - .ui.form .field > label, .ui.form .inline.fields > label, .ui.form .inline.fields .field > label, @@ -514,12 +400,14 @@ input:-webkit-autofill:active, .repository.new.fork form .header { padding-left: 280px !important; } + .repository.new.repo form .inline.field > label, .repository.new.migrate form .inline.field > label, .repository.new.fork form .inline.field > label { text-align: right; width: 250px !important; word-wrap: break-word; } + .repository.new.repo form .help, .repository.new.migrate form .help, .repository.new.fork form .help { margin-left: 265px !important; @@ -529,8 +417,10 @@ input:-webkit-autofill:active, .repository.new.fork form .optional .title { margin-left: 250px !important; } + .repository.new.repo form .inline.field > input, .repository.new.migrate form .inline.field > input, .repository.new.fork form .inline.field > input, + .repository.new.repo form .inline.field > textarea, .repository.new.migrate form .inline.field > textarea, .repository.new.fork form .inline.field > textarea { width: 50%; @@ -550,6 +440,7 @@ input:-webkit-autofill:active, } } +.repository.new.repo form .dropdown .text, .repository.new.migrate form .dropdown .text, .repository.new.fork form .dropdown .text { margin-right: 0 !important; @@ -562,6 +453,7 @@ input:-webkit-autofill:active, text-align: center; } +.repository.new.repo form .selection.dropdown, .repository.new.migrate form .selection.dropdown, .repository.new.fork form .selection.dropdown, .repository.new.fork form .field a { @@ -598,6 +490,10 @@ input:-webkit-autofill:active, } } +.repository.new.repo .ui.form .selection.dropdown:not(.owner) { + width: 50% !important; +} + @media (max-width: 767.98px) { .repository.new.repo .ui.form .selection.dropdown:not(.owner) { width: 100% !important; diff --git a/web_src/css/home.css b/web_src/css/home.css index 84dd793612..22f1a2dc98 100644 --- a/web_src/css/home.css +++ b/web_src/css/home.css @@ -70,7 +70,7 @@ .page-footer .right-links > a { border-left: 1px solid var(--color-secondary-dark-1); padding-left: 8px; - margin-left: 8px; + margin-left: 5px; } .page-footer .ui.dropdown.language .menu { diff --git a/web_src/css/index.css b/web_src/css/index.css index 12830299cf..49ceb2c8ce 100644 --- a/web_src/css/index.css +++ b/web_src/css/index.css @@ -17,7 +17,6 @@ @import "./modules/checkbox.css"; @import "./modules/modal.css"; -@import "./modules/switch.css"; @import "./modules/select.css"; @import "./modules/tippy.css"; @import "./modules/breadcrumb.css"; diff --git a/web_src/css/modules/switch.css b/web_src/css/modules/switch.css deleted file mode 100644 index 7780155787..0000000000 --- a/web_src/css/modules/switch.css +++ /dev/null @@ -1,35 +0,0 @@ -.switch { - display: grid; - grid-auto-flow: column; - height: fit-content; - align-items: center; - align-self: center; - background: var(--color-menu); - border: 1px solid var(--color-input-border); - border-radius: var(--border-radius); -} - -.switch .item { - display: flex; - gap: 0.5rem; - align-items: center; - padding: .5em 1.125em; - color: var(--color-text); - border-radius: var(--border-radius); - text-wrap: nowrap; -} - -.switch .active.item { - background: var(--color-active); - outline: 1px solid var(--color-input-border); -} - -@media (pointer: coarse) { - .switch .item { - padding: .75em 1.125em; - } -} - -.switch button.item { - background: transparent; -} diff --git a/web_src/css/repo.css b/web_src/css/repo.css index a2982b3eb3..b4149c90c1 100644 --- a/web_src/css/repo.css +++ b/web_src/css/repo.css @@ -4,6 +4,10 @@ user-select: none; } +.repository .owner.dropdown { + min-width: 40% !important; +} + .repository .unicode-escaped .escaped-code-point[data-escaped]::before { visibility: visible; content: attr(data-escaped); @@ -153,9 +157,7 @@ border-radius: 0 var(--border-radius) var(--border-radius) 0 !important; } -/* Dropdown alignment */ -.repository .clone-panel .dropdown .menu, -.repository .folder-actions .dropdown .menu { +.repository .clone-panel .dropdown .menu { right: 0 !important; left: auto !important; } @@ -388,11 +390,6 @@ td .commit-summary { cursor: default; } -.code-search + #repo-files-table { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - .view-raw { display: flex; justify-content: center; @@ -760,7 +757,7 @@ td .commit-summary { .repository.view.issue .comment-list .timeline-item, .repository.view.issue .comment-list .timeline-item-group { - padding: 0.65rem 0; + padding: 16px 0; } .repository.view.issue .comment-list .timeline-item-group .timeline-item { @@ -843,18 +840,6 @@ td .commit-summary { margin-right: 0.25em; } -.repository.view.issue .comment-list .timeline-item .aggregated-actions .badge { - width: 20px; - height: 20px; - margin-top: 5px; - padding: 12px; -} - -.repository.view.issue .comment-list .timeline-item .aggregated-actions .badge .svg { - width: 20px; - height: 20px; -} - .singular-commit { display: flex; align-items: center; @@ -905,18 +890,15 @@ td .commit-summary { background: var(--color-orange-badge-hover-bg) !important; } -@media (min-width: 768px) { - .repository.view.issue .comment-list .timeline-item .forced-push { - display: grid; - grid-template-columns: 1fr auto; - column-gap: 1rem; - } +.repository.view.issue .comment-list .timeline-item .comparebox { + line-height: 32px; + vertical-align: middle; } -.repository.view.issue .comment-list .timeline-item .compare.label { +.repository.view.issue .comment-list .timeline-item .comparebox .compare.label { font-size: 1rem; + margin: 0; border: 1px solid var(--color-light-border); - height: fit-content; } @media (max-width: 767.98px) { @@ -944,6 +926,16 @@ td .commit-summary { border-radius: var(--border-radius); } +@media (max-width: 767.98px) { + .repository.view.issue .comment-list .comment .content .form .button { + width: 100%; + margin: 0; + } + .repository.view.issue .comment-list .comment .content .form .button:not(:last-child) { + margin-bottom: 1rem; + } +} + .repository.view.issue .comment-list .comment .merge-section { background-color: var(--color-box-body); } @@ -1157,19 +1149,6 @@ td .commit-summary { text-align: center; } -.branch-tag-tab { - padding: 0 10px 10px; -} - -.branch-tag-item { - display: inline-flex; - align-items: center; - gap: 0.5rem; - padding: 0 10px; - border: 1px solid transparent; - border-bottom: none; -} - .repository.compare.pull .comment.form .content::before, .repository.compare.pull .comment.form .content::after { right: 100%; @@ -1740,6 +1719,26 @@ td .commit-summary { max-width: initial; /* remove fomantic over 100% width */ } +.repository .diff-stats { + clear: both; + margin-bottom: 5px; + max-height: 200px; + height: fit-content; + overflow: auto; + padding-left: 0; +} + +.repository .diff-stats li { + list-style: none; + padding-bottom: 4px; + margin-bottom: 4px; + padding-left: 6px; +} + +.repository .diff-stats li + li { + border-top: 1px solid var(--color-secondary); +} + .repository .repo-search-result { padding-top: 10px; padding-bottom: 10px; @@ -1850,6 +1849,10 @@ details.repo-search-result summary::marker { color: var(--color-success-text); } +.repository .ui.attached.isSigned.isVerified.message .pull-right { + color: var(--color-text); +} + .repository .ui.attached.isSigned.isVerified.message .ui.text { color: var(--color-success-text); } @@ -2016,27 +2019,15 @@ details.repo-search-result summary::marker { box-shadow: none; } -.repository .repository-summary .repository-menu { - display: grid; - grid-template-columns: repeat(4, 1fr); - padding: 0; -} - -@media (max-width: 767.98px) { - .repository .repository-summary .repository-menu { - grid-template-rows: repeat(2, 1fr); - grid-template-columns: repeat(2, 1fr); - } -} - .repository .repository-summary .segment.sub-menu { border: none; display: flex; align-items: center; padding: 0; + overflow: hidden; } -.repository .repository-summary .item { +.repository .repository-summary .sub-menu .item { flex: 1; height: 30px; line-height: var(--line-height-default); @@ -2044,31 +2035,21 @@ details.repo-search-result summary::marker { align-items: center; justify-content: center; gap: 0.25em; + padding: 0 0.5em; /* make the UI look better for narrow (mobile) view */ text-decoration: none; - border-radius: var(--border-radius); } -.repository .repository-summary .item.active { +.repository .repository-summary .sub-menu .item.active { background: var(--color-secondary); - font-weight: var(--font-weight-medium); } -.repository .repository-summary #language-stats-bar { +.repository .repository-summary .segment.language-stats { display: flex; gap: 2px; padding: 0; height: 10px; white-space: nowrap; - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; - overflow: hidden; -} - -.size-overview .segment:has(> .bar) { - display: flex; - height: 10px; - padding: 0; - border-radius: 3px; + border-radius: 0 0 3px 3px !important; overflow: hidden; } @@ -2276,6 +2257,7 @@ details.repo-search-result summary::marker { background: var(--color-box-header); border-bottom: 1px solid var(--color-secondary) !important; font-weight: var(--font-weight-normal) !important; + padding: 0.5rem 1rem; margin: 0 !important; position: relative; color: var(--color-text); @@ -2286,10 +2268,6 @@ details.repo-search-result summary::marker { align-items: center; } -.timeline .ui.comment-header { - padding: 0.25rem 0.75rem; -} - .comment-header::before, .comment-header::after { right: 100%; @@ -2441,11 +2419,6 @@ details.repo-search-result summary::marker { padding-right: 22px !important; /* normal buttons have !important paddings, so we need to override it for dropdown (Add File) icons */ } -.repo-button-row .button strong { - /* Workaround where 'overflow: hidden' is clipping the y-axis, force a small amount of extra padding in the y-axis. */ - padding: .1em 0; -} - .repo-button-row input { height: 30px; } @@ -2874,6 +2847,7 @@ tbody.commit-list { } .commits-table .commits-table-left { align-items: initial !important; + margin-bottom: 6px; } .commits-table .commits-table-right form > div:nth-child(1) { order: 1; /* the "commit search" input */ @@ -2922,7 +2896,7 @@ tbody.commit-list { .commit-status-header { /* reset the default ".ui.attached.header" styles, to use the outer border */ border: none !important; - /* add a bottom border to make sure there is always a divider between the header and list when the list is scrolling */ + /* add a bottom border to make sure the there is always a divider between the header and list when the list is scrolling */ border-bottom: 1px solid var(--color-secondary) !important; /* use negative margin to avoid the newly added border conflict with the list's top border */ margin: 0 0 -1px !important; diff --git a/web_src/css/repo/issue-list.css b/web_src/css/repo/issue-list.css index 07ae5a5683..9143b01384 100644 --- a/web_src/css/repo/issue-list.css +++ b/web_src/css/repo/issue-list.css @@ -2,7 +2,7 @@ display: flex; flex-wrap: wrap-reverse; justify-content: space-between; - align-items: center; + align-items: flex-start; gap: 1rem; margin-top: 1rem; } diff --git a/web_src/css/review.css b/web_src/css/review.css index c1ef21bdc0..a198edf6c5 100644 --- a/web_src/css/review.css +++ b/web_src/css/review.css @@ -76,6 +76,19 @@ max-width: none; padding: 0.75rem !important; } + .comment-code-cloud .code-comment-buttons { + margin: 0.5rem 0 0.25rem !important; + } + .comment-code-cloud .code-comment-buttons .code-comment-buttons-buttons { + width: 100%; + } + .comment-code-cloud .ui.buttons { + width: 100%; + margin: 0 !important; + } + .comment-code-cloud .ui.buttons .button { + flex: 1; + } } .comment-code-cloud .comments .comment { @@ -170,6 +183,14 @@ display: block; } +@media (max-width: 767.98px) { + .comment-code-cloud .button { + width: 100%; + margin: 0 !important; + margin-bottom: 0.75rem !important; + } +} + .diff-file-body .comment-form { margin: 0 0 0 3em; } diff --git a/web_src/css/shared/milestone.css b/web_src/css/shared/milestone.css index 8578a09b5b..91e6b5e387 100644 --- a/web_src/css/shared/milestone.css +++ b/web_src/css/shared/milestone.css @@ -29,13 +29,6 @@ justify-content: space-between; } -.milestone-header h3 { - display: flex; - align-items: center; - margin: 0; - gap: 0.5rem; -} - .milestone-toolbar { padding-top: 5px; display: flex; diff --git a/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css b/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css index e0765aba4a..b30cfd6b23 100644 --- a/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css +++ b/web_src/css/themes/theme-forgejo-dark-deuteranopia-protanopia.css @@ -1,9 +1,11 @@ @import "./theme-forgejo-dark.css"; :root { - /* removed rows/words: use red colors from vanilla forgejo-dark */ + --color-diff-removed-word-bg: #693f17; + --color-diff-removed-row-border: #693f17; + --color-diff-removed-row-bg: #221b17; --color-diff-added-word-bg: #214d88; --color-diff-added-row-border: #214d88; - --color-diff-added-row-bg: #18184f; + --color-diff-added-row-bg: #13233a; --color-code-bg: #0d1117; } diff --git a/web_src/css/themes/theme-forgejo-dark-tritanopia.css b/web_src/css/themes/theme-forgejo-dark-tritanopia.css index e4fc303481..aefdaa1bf7 100644 --- a/web_src/css/themes/theme-forgejo-dark-tritanopia.css +++ b/web_src/css/themes/theme-forgejo-dark-tritanopia.css @@ -1,9 +1,11 @@ @import "./theme-forgejo-dark.css"; :root { - /* removed rows/words: use red colors from vanilla forgejo-dark */ + --color-diff-removed-word-bg: #792e2e; + --color-diff-removed-row-border: #792e2e; + --color-diff-removed-row-bg: #25171c; --color-diff-added-word-bg: #214d88; --color-diff-added-row-border: #214d88; - --color-diff-added-row-bg: #152846; + --color-diff-added-row-bg: #13233a; --color-code-bg: #0d1117; } diff --git a/web_src/css/themes/theme-forgejo-dark.css b/web_src/css/themes/theme-forgejo-dark.css index c9c538502d..bc321f38a8 100644 --- a/web_src/css/themes/theme-forgejo-dark.css +++ b/web_src/css/themes/theme-forgejo-dark.css @@ -326,8 +326,8 @@ i.grey.icon.icon.icon.icon { .ui.ui.ui.basic.primary.label { color: var(--color-text-dark) !important; } -.ui.yellow.label.pending-label { - color: var(--color-warning-text) !important; +.ui.basic.yellow.label.pending-label { + background: var(--color-light) !important; } ::selection { background: var(--steel-100) !important; diff --git a/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css b/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css index 8744cbb581..eb48b7598d 100644 --- a/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css +++ b/web_src/css/themes/theme-forgejo-light-deuteranopia-protanopia.css @@ -1,11 +1,11 @@ @import "./theme-forgejo-light.css"; :root { - --color-diff-removed-word-bg: #c8c850; - --color-diff-removed-row-border: #c8c850; - --color-diff-removed-row-bg: #ffecc4; - --color-diff-added-word-bg: #b8c0ff; - --color-diff-added-row-border: #b8c0ff; - --color-diff-added-row-bg: #e0e0ff; + --color-diff-removed-word-bg: #ffdbb0; + --color-diff-removed-row-border: #ffdbb0; + --color-diff-removed-row-bg: #fffaf3; + --color-diff-added-word-bg: #b1dbff; + --color-diff-added-row-border: #b1dbff; + --color-diff-added-row-bg: #eef9ff; --color-code-bg: #ffffff; } diff --git a/web_src/css/themes/theme-forgejo-light-tritanopia.css b/web_src/css/themes/theme-forgejo-light-tritanopia.css index 3f875e4a7f..208da5597f 100644 --- a/web_src/css/themes/theme-forgejo-light-tritanopia.css +++ b/web_src/css/themes/theme-forgejo-light-tritanopia.css @@ -1,11 +1,11 @@ @import "./theme-forgejo-light.css"; :root { - --color-diff-removed-word-bg: #ffb8c0; - --color-diff-removed-row-border: #ffb8c0; - --color-diff-removed-row-bg: #ffd8d8; - --color-diff-added-word-bg: #b8c0ff; - --color-diff-added-row-border: #b8c0ff; - --color-diff-added-row-bg: #c0e8ff; + --color-diff-removed-word-bg: #ffd0ce; + --color-diff-removed-row-border: #ffd0ce; + --color-diff-removed-row-bg: #fff5f4; + --color-diff-added-word-bg: #b1dbff; + --color-diff-added-row-border: #eef9ff; + --color-diff-added-row-bg: #eef9ff; --color-code-bg: #ffffff; } diff --git a/web_src/css/themes/theme-forgejo-light.css b/web_src/css/themes/theme-forgejo-light.css index a5e4ffe050..fa89cc2ec8 100644 --- a/web_src/css/themes/theme-forgejo-light.css +++ b/web_src/css/themes/theme-forgejo-light.css @@ -269,7 +269,7 @@ --color-nav-text: var(--color-text); --color-secondary-nav-bg: var(--color-body); --color-label-text: var(--color-text); - --color-label-bg: #cacaca7b; + --color-label-bg: #cacaca5b; --color-label-hover-bg: #cacacaa0; --color-label-active-bg: #cacacaff; --color-label-bg-alt: #cacacaff; @@ -314,9 +314,10 @@ .ui.ui.ui.basic.primary.label { color: var(--color-text-dark) !important; } -.ui.yellow.label.pending-label { +.ui.basic.yellow.label.pending-label { background: var(--color-warning-bg) !important; - color: var(--color-text-dark) !important; + color: var(--color-warning-text) !important; + border-color: var(--color-yellow-light) !important; } ::selection { background: var(--steel-450) !important; diff --git a/web_src/css/user.css b/web_src/css/user.css index bceb16fcf9..16d431e2a7 100644 --- a/web_src/css/user.css +++ b/web_src/css/user.css @@ -143,3 +143,7 @@ .notifications-item:hover .notifications-updated { display: none; } + +#pronouns-dropdown, #pronouns-custom { + width: 140px; +} diff --git a/web_src/fomantic/build/semantic.js b/web_src/fomantic/build/semantic.js index fb68705c08..affd6a4bd0 100644 --- a/web_src/fomantic/build/semantic.js +++ b/web_src/fomantic/build/semantic.js @@ -344,7 +344,7 @@ $.api = $.fn.api = function(parameters) { cancelled: function() { return (module.cancelled || false); }, - succesful: function() { // codespell:ignore + succesful: function() { // codespell-ignore module.verbose('This behavior will be deleted due to typo. Use "was successful" instead.'); return module.was.successful(); }, diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index f3fb7fc8a8..0b9dc6eaa7 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -132,17 +132,17 @@ } }, "node_modules/@octokit/core": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz", - "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", "license": "MIT", "peer": true, "dependencies": { "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.1.2", - "@octokit/request": "^9.2.1", - "@octokit/request-error": "^6.1.7", - "@octokit/types": "^13.6.2", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", "before-after-hook": "^3.0.2", "universal-user-agent": "^7.0.0" }, @@ -151,9 +151,9 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/auth-token": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", - "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", "license": "MIT", "peer": true, "engines": { @@ -161,13 +161,13 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/endpoint": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", - "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.6.2", + "@octokit/types": "^13.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -175,23 +175,22 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "license": "MIT", "peer": true }, "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", - "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/endpoint": "^10.1.3", - "@octokit/request-error": "^6.1.7", - "@octokit/types": "^13.6.2", - "fast-content-type-parse": "^2.0.0", + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -199,26 +198,26 @@ } }, "node_modules/@octokit/core/node_modules/@octokit/request-error": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", - "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", + "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.6.2" + "@octokit/types": "^13.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.0.tgz", + "integrity": "sha512-CrooV/vKCXqwLa+osmHLIMUb87brpgUqlqkPGc6iE2wCkUvTrHiXFMhAKoDDaAAYJrtKtrFTgSQTg5nObBEaew==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@octokit/core/node_modules/before-after-hook": { @@ -253,14 +252,14 @@ "license": "ISC" }, "node_modules/@octokit/graphql": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz", - "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/request": "^9.2.2", - "@octokit/types": "^13.8.0", + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -268,13 +267,13 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz", - "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.6.2", + "@octokit/types": "^13.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -282,23 +281,22 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", "license": "MIT", "peer": true }, "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz", - "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/endpoint": "^10.1.3", - "@octokit/request-error": "^6.1.7", - "@octokit/types": "^13.6.2", - "fast-content-type-parse": "^2.0.0", + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -306,26 +304,26 @@ } }, "node_modules/@octokit/graphql/node_modules/@octokit/request-error": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz", - "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", + "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/types": "^13.6.2" + "@octokit/types": "^13.0.0" }, "engines": { "node": ">= 18" } }, "node_modules/@octokit/graphql/node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.0.tgz", + "integrity": "sha512-CrooV/vKCXqwLa+osmHLIMUb87brpgUqlqkPGc6iE2wCkUvTrHiXFMhAKoDDaAAYJrtKtrFTgSQTg5nObBEaew==", "license": "MIT", "peer": true, "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@octokit/graphql/node_modules/universal-user-agent": { @@ -494,12 +492,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/vinyl": { @@ -1117,9 +1115,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -1136,10 +1134,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1193,44 +1191,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -1249,9 +1219,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001707", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", - "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", + "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", "funding": [ { "type": "opencollective", @@ -1649,9 +1619,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "license": "MIT", "dependencies": { "nice-try": "^1.0.4", @@ -1863,20 +1833,6 @@ "node": ">=0.3.1" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/duplexer2": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", @@ -1993,9 +1949,9 @@ } }, "node_modules/editorconfig/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2005,9 +1961,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.123", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", - "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", + "version": "1.5.29", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", + "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2048,10 +2004,13 @@ } }, "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { "node": ">= 0.4" } @@ -2065,18 +2024,6 @@ "node": ">= 0.4" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -2332,23 +2279,6 @@ "node": ">= 0.10" } }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/fast-levenshtein": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", @@ -2551,12 +2481,12 @@ } }, "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.6", + "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { @@ -2567,9 +2497,9 @@ } }, "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2732,21 +2662,16 @@ } }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -2761,19 +2686,6 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "license": "ISC" }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2955,12 +2867,12 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4252,7 +4164,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", - "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", "license": "MIT", "dependencies": { "lodash._basecopy": "^3.0.0", @@ -4374,10 +4285,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4696,9 +4619,9 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -4998,16 +4921,16 @@ "license": "MIT" }, "node_modules/js-beautify": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", - "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", "license": "MIT", "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", - "glob": "^10.4.2", + "glob": "^10.3.3", "js-cookie": "^3.0.5", - "nopt": "^7.2.1" + "nopt": "^7.2.0" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -5354,7 +5277,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==", - "deprecated": "This package is deprecated. Use structuredClone instead.", "license": "MIT" }, "node_modules/lodash.defaults": { @@ -5386,7 +5308,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "license": "MIT" }, "node_modules/lodash.isarguments": { @@ -5437,7 +5358,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", - "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", "license": "MIT" }, "node_modules/lodash.restparam": { @@ -5456,7 +5376,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", "license": "MIT", "dependencies": { "lodash._reinterpolate": "^3.0.0", @@ -5633,15 +5552,6 @@ "node": ">=0.10.0" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5850,9 +5760,9 @@ "license": "ISC" }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", "license": "MIT", "optional": true }, @@ -5977,9 +5887,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/node.extend": { @@ -6161,16 +6071,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.5", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -6933,21 +6841,18 @@ "license": "ISC" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7509,9 +7414,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "license": "CC0-1.0" }, "node_modules/split-string": { @@ -8226,9 +8131,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, "node_modules/union-value": { @@ -8324,9 +8229,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -8344,7 +8249,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -8354,9 +8259,9 @@ } }, "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/urix": { diff --git a/web_src/js/components/.eslintrc.yaml b/web_src/js/components/.eslintrc.yaml new file mode 100644 index 0000000000..0d233442bc --- /dev/null +++ b/web_src/js/components/.eslintrc.yaml @@ -0,0 +1,21 @@ +plugins: + - eslint-plugin-vue + - eslint-plugin-vue-scoped-css + +extends: + - ../../../.eslintrc.yaml + - plugin:vue/vue3-recommended + - plugin:vue-scoped-css/vue3-recommended + +parserOptions: + sourceType: module + ecmaVersion: latest + +env: + browser: true + +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] diff --git a/web_src/js/components/ActionRunStatus.vue b/web_src/js/components/ActionRunStatus.vue index db380f0038..7ada543fea 100644 --- a/web_src/js/components/ActionRunStatus.vue +++ b/web_src/js/components/ActionRunStatus.vue @@ -28,13 +28,12 @@ export default { }; diff --git a/web_src/js/components/DashboardRepoList.vue b/web_src/js/components/DashboardRepoList.vue index 4b48376088..e5874133b1 100644 --- a/web_src/js/components/DashboardRepoList.vue +++ b/web_src/js/components/DashboardRepoList.vue @@ -1,5 +1,5 @@ + diff --git a/web_src/js/components/PullRequestMergeForm.vue b/web_src/js/components/PullRequestMergeForm.vue index 46bda3a025..bd0901a7b5 100644 --- a/web_src/js/components/PullRequestMergeForm.vue +++ b/web_src/js/components/PullRequestMergeForm.vue @@ -130,7 +130,7 @@ export default { {{ mergeForm.textCancel }} -
    +
    diff --git a/web_src/js/components/RepoActionView.test.js b/web_src/js/components/RepoActionView.test.js index 0b9527ced1..8c4e1506be 100644 --- a/web_src/js/components/RepoActionView.test.js +++ b/web_src/js/components/RepoActionView.test.js @@ -103,115 +103,3 @@ test('processes ##[group] and ##[endgroup]', async () => { // Check if after the log list exists another log line expect(wrapper.get('.job-log-list + .job-log-line > .log-msg').text()).toEqual('A line outside the group'); }); - -test('load multiple steps on a finished action', async () => { - Object.defineProperty(document.documentElement, 'lang', {value: 'en'}); - vi.spyOn(global, 'fetch').mockImplementation((url, opts) => { - if (url.endsWith('/artifacts')) { - return Promise.resolve({ - ok: true, - json: vi.fn().mockResolvedValue( - { - artifacts: [], - }, - ), - }); - } - - const postBody = JSON.parse(opts.body); - const stepsLog_value = []; - for (const cursor of postBody.logCursors) { - if (cursor.expanded) { - stepsLog_value.push( - { - step: cursor.step, - cursor: 0, - lines: [ - {index: 1, message: `Step #${cursor.step + 1} Log #1`, timestamp: 0}, - {index: 1, message: `Step #${cursor.step + 1} Log #2`, timestamp: 0}, - {index: 1, message: `Step #${cursor.step + 1} Log #3`, timestamp: 0}, - ], - }, - ); - } - } - const jobs_value = { - state: { - run: { - status: 'success', - commit: { - pusher: {}, - }, - }, - currentJob: { - steps: [ - { - summary: 'Test Step #1', - duration: '1s', - status: 'success', - }, - { - summary: 'Test Step #2', - duration: '1s', - status: 'success', - }, - ], - }, - }, - logs: { - stepsLog: opts.body?.includes('"cursor":null') ? stepsLog_value : [], - }, - }; - - return Promise.resolve({ - ok: true, - json: vi.fn().mockResolvedValue( - jobs_value, - ), - }); - }); - - const wrapper = mount(RepoActionView, { - props: { - actionsURL: 'https://example.com/example-org/example-repo/actions', - runIndex: '1', - jobIndex: '2', - locale: { - approve: '', - cancel: '', - rerun: '', - artifactsTitle: '', - areYouSure: '', - confirmDeleteArtifact: '', - rerun_all: '', - showTimeStamps: '', - showLogSeconds: '', - showFullScreen: '', - downloadLogs: '', - status: { - unknown: '', - waiting: '', - running: '', - success: '', - failure: '', - cancelled: '', - skipped: '', - blocked: '', - }, - }, - }, - }); - await flushPromises(); - // Click on both steps to start their log loading in fast succession... - await wrapper.get('.job-step-section:nth-of-type(1) .job-step-summary').trigger('click'); - await wrapper.get('.job-step-section:nth-of-type(2) .job-step-summary').trigger('click'); - await flushPromises(); - - // Verify both step's logs were loaded - expect(wrapper.get('.job-step-section:nth-of-type(1) .job-log-line:nth-of-type(1) .log-msg').text()).toEqual('Step #1 Log #1'); - expect(wrapper.get('.job-step-section:nth-of-type(1) .job-log-line:nth-of-type(2) .log-msg').text()).toEqual('Step #1 Log #2'); - expect(wrapper.get('.job-step-section:nth-of-type(1) .job-log-line:nth-of-type(3) .log-msg').text()).toEqual('Step #1 Log #3'); - expect(wrapper.get('.job-step-section:nth-of-type(2) .job-log-line:nth-of-type(1) .log-msg').text()).toEqual('Step #2 Log #1'); - expect(wrapper.get('.job-step-section:nth-of-type(2) .job-log-line:nth-of-type(2) .log-msg').text()).toEqual('Step #2 Log #2'); - expect(wrapper.get('.job-step-section:nth-of-type(2) .job-log-line:nth-of-type(3) .log-msg').text()).toEqual('Step #2 Log #3'); -}); diff --git a/web_src/js/components/RepoActionView.vue b/web_src/js/components/RepoActionView.vue index 75afd708ef..4e8e18e80b 100644 --- a/web_src/js/components/RepoActionView.vue +++ b/web_src/js/components/RepoActionView.vue @@ -26,10 +26,10 @@ const sfc = { return { // internal state loading: false, - needLoadingWithLogCursors: null, intervalID: null, currentJobStepsStates: [], artifacts: [], + onHoverRerunIndex: -1, menuVisible: false, isFullScreen: false, timeVisible: { @@ -41,7 +41,6 @@ const sfc = { run: { link: '', title: '', - titleHTML: '', status: '', canCancel: false, canApprove: false, @@ -115,9 +114,7 @@ const sfc = { toggleStepLogs(idx) { this.currentJobStepsStates[idx].expanded = !this.currentJobStepsStates[idx].expanded; if (this.currentJobStepsStates[idx].expanded) { - // request data load immediately instead of waiting for next timer interval (which, if the job is done, will - // never happen because the interval will have been disabled) - this.loadJob(); + this.loadJob(); // try to load the data immediately instead of waiting for next timer interval } }, // cancel a run @@ -232,16 +229,13 @@ const sfc = { await this.loadJob(); }, - getLogCursors() { - return this.currentJobStepsStates.map((it, idx) => { + async fetchJob() { + const logCursors = this.currentJobStepsStates.map((it, idx) => { // cursor is used to indicate the last position of the logs // it's only used by backend, frontend just reads it and passes it back, it and can be any type. // for example: make cursor=null means the first time to fetch logs, cursor=eof means no more logs, etc return {step: idx, cursor: it.cursor, expanded: it.expanded}; }); - }, - - async fetchJob(logCursors) { const resp = await POST(`${this.actionsURL}/runs/${this.runIndex}/jobs/${this.jobIndex}`, { data: {logCursors}, }); @@ -249,45 +243,19 @@ const sfc = { }, async loadJob() { - let myLoadingLogCursors = this.getLogCursors(); - if (this.loading) { - // loadJob is already executing; but it's possible that our log cursor request has changed since it started. If - // the interval load is active, that problem would solve itself, but if it isn't (say we're viewing a "done" - // job), then the change to the requested cursors may never be loaded. To address this we set our newest - // requested log cursors into a state property and rely on loadJob to retry at the end of its execution if it - // notices these have changed. - this.needLoadingWithLogCursors = myLoadingLogCursors; - return; - } - + if (this.loading) return; try { this.loading = true; - // Since no async operations occurred since fetching myLoadingLogCursors, we can be sure that we have the most - // recent needed log cursors, so we can reset needLoadingWithLogCursors -- it could be stale if exceptions - // occurred in previous load attempts. - this.needLoadingWithLogCursors = null; let job, artifacts; - - while (true) { - try { - [job, artifacts] = await Promise.all([ - this.fetchJob(myLoadingLogCursors), - this.fetchArtifacts(), // refresh artifacts if upload-artifact step done - ]); - } catch (err) { - if (err instanceof TypeError) return; // avoid network error while unloading page - throw err; - } - - // We can be done as long as needLoadingWithLogCursors is null, or the same as what we just loaded. - if (this.needLoadingWithLogCursors === null || JSON.stringify(this.needLoadingWithLogCursors) === JSON.stringify(myLoadingLogCursors)) { - this.needLoadingWithLogCursors = null; - break; - } - - // Otherwise we need to retry that. - myLoadingLogCursors = this.needLoadingWithLogCursors; + try { + [job, artifacts] = await Promise.all([ + this.fetchJob(), + this.fetchArtifacts(), // refresh artifacts if upload-artifact step done + ]); + } catch (err) { + if (err instanceof TypeError) return; // avoid network error while unloading page + throw err; } this.artifacts = artifacts['artifacts'] || []; @@ -424,8 +392,9 @@ export function initRepositoryActionView() {
    - -

    +

    + {{ run.title }} +

    @@ -456,13 +424,13 @@ export function initRepositoryActionView() {
    - +
    {{ job.name }}
    - + {{ job.duration }}
    @@ -569,13 +537,11 @@ export function initRepositoryActionView() { .action-info-summary-title { display: flex; - align-items: center; - gap: 0.5em; } .action-info-summary-title-text { font-size: 20px; - margin: 0; + margin: 0 0 0 8px; flex: 1; overflow-wrap: anywhere; } diff --git a/web_src/js/components/RepoBranchTagSelector.vue b/web_src/js/components/RepoBranchTagSelector.vue index 881c7c09ea..bfba2037cc 100644 --- a/web_src/js/components/RepoBranchTagSelector.vue +++ b/web_src/js/components/RepoBranchTagSelector.vue @@ -54,12 +54,12 @@ const sfc = { if (this.viewType === 'tree') { this.isViewTree = true; this.refNameText = this.commitIdShort; - } else if (this.viewType === 'branch') { - this.isViewBranch = true; - this.refNameText = this.branchName; - } else { + } else if (this.viewType === 'tag') { this.isViewTag = true; this.refNameText = this.tagName; + } else { + this.isViewBranch = true; + this.refNameText = this.branchName; } document.body.addEventListener('click', (event) => { @@ -252,12 +252,11 @@ export default sfc; // activate IDE's Vue plugin - +